6/23 C# 테스트, 제너릭 제약 조건
C# 테스트 오답노트
- 26. 다음 중 제네릭에 대한 설명으로 옳지 않은 것을 고르시오. [2점]
a. 타입을 매개변수화하여 재사용 가능한 코드를 작성할 수 있다.
b. List와 List은 서로 다른 닫힌 제네릭 형식이다.
c. 컴파일 시점 타입 검사를 통해 불필요한 캐스팅을 줄일 수 있다.
d. 제네릭 형식의 T는 형식 매개변수이다.
e. 제네릭 메서드는 제네릭 클래스 내부에서만 선언할 수 있다.
정답 : e
정답이 e인 이유는, 제네릭 메서드는 제네릭 클래스 안에서만 선언해야 하는 것이 아니기 때문입니다.
즉, 제네릭 메서드는 일반 클래스 안에서도 선언할 수 있습니다.
예를 들어:
여기서scss
publicclassUtility { publicvoidPrint<T>(Tvalue) { Console.WriteLine(value); } }Utility클래스 자체는 제네릭 클래스가 아닙니다.
- 34. 다음 중 제네릭 형식 매개변수 제약 설명으로 옳지 않은 것을 고르시오. [2점]
- where T : class → T는 참조 형식이어야 한다.
- where T : struct → T는 nullable이 아닌 값 형식이어야 한다.
- where T : new() → T는 public 매개변수 없는 생성자를 가져야 한다.
- where T : IComparable → T는 해당 인터페이스를 구현해야 한다.
- where T : int → 봉인된 구조체는 형식 제약으로 사용할 수 없으므로 이 구문은 유효하지 있다.
정답 : e
int는 값 타입 구조체라 상속될 수 없으므로where T : int는 사용할 수 없습니다. 값 타입을 제약하려면where T : struct를 사용해야 합니다.
arduino// 가능 classBox<T>whereT :struct { } // 불가능 classBox<T>whereT :int { }
- 38. 다음 코드에서 컴파일 오류의 직접 원인이 되는 줄을 고르시오. [2점]
- interface IFly { void Fly(); }
- class Bird : IFly { public void Fly() => Console.WriteLine("날다"); }
- class Plane : IFly { }
- IFly f = new Bird();
- f.Fly();
정답 : c
Plane클래스가IFly인터페이스를 구현한다고 선언했지만,IFly에 정의된Fly()메서드를 실제로 구현하지 않았기 때문에 컴파일 오류가 발생합니다. 인터페이스를 구현하는 클래스는 인터페이스의 모든 멤버를 반드시 구현해야 합니다.
수정하려면scssinterfaceIFly { voidFly(); } // 가능 classBird :IFly { publicvoidFly()=>Console.WriteLine("날다"); } // 오류 classPlane :IFly { }Plane에도Fly()를 구현해야 합니다.
- 48. 다음 코드의 출력 결과를 적으시오. [2점]
정답 : 사망 TakeDamage에서 Player의 dead가 true인 경우, 아래 코드는 실행되지 않기 때문에 “사망”은 한 번만 출력된다csharp
class Player { public event Action OnDied = delegate { }; private int hp = 100; private bool dead; public void TakeDamage(int damage) { if (dead) return; hp -= damage; if (hp <= 0) { dead = true; OnDied(); } } } Player p = new Player(); p.OnDied += () => Console.WriteLine("사망"); p.TakeDamage(60); p.TakeDamage(60); p.TakeDamage(60);
- 49. 다음 중 람다식에 대한 설명으로 옳지 않은 것을 고르시오. [2점]
- 식 본문 또는 블록 본문을 사용할 수 있다.
- 캡처한 지역 변수의 값은 람다 생성 시점에 복사되어 항상 고정된다.
- 매개변수 형식은 문맥에 따라 추론될 수 있다.
- 호환되는 Action, Func 또는 사용자 정의 델리게이트에 할당할 수 있다.
- 매개변수가 없는 람다는 () => 형태로 작성할 수 있다. 정답 : b 람다가 캡처한 지역 변수는 람다 생성 시점의 값이 복사되어 고정되는 것이 아니라, 변수 자체를 참조합니다. 그래서 람다를 만든 뒤에 지역 변수 값이 바뀌면, 람다 실행 결과도 바뀐 값을 기준으로 동작합니다.
만약 생성 시점에 값이 복사되어 고정된다면iniint count=10; Action action= ()=>Console.WriteLine(count); count=20; action();// 20 출력10이 출력되어야 하지만, 실제로는 변경된 값인20이 출력됩니다. 따라서 b가 옳지 않은 설명입니다.
- 제너릭 제약 조건 종류 제약 조건 설명 where T : struct T는 null을 허용하지 않는 값 형식이어야 합니다. where T : class T는 참조 형식이어야 합니다. where T : new() T는 매개 변수가 없는 public 생성자가 있어야 합니다. 다른 제약 조건과 함께 사용되는 경우 new() 제약 조건을 마지막에 지정해야 합니다. where T : notnull T는 null이 아닌 형식이어야 합니다. where T : unmanaged T는 null이 아닌 비관리형 형식이어야 합니다. where T : T는 지정된 기본 클래스이거나 이 클래스에서 파생된 클래스여야 합니다. where T : T는 지정된 기본 인터페이스이거나 이 인터페이스에서 파생된 유형이여야 합니다. where T : U U는 인터페이스, 추상 클래스 또는 일반 클래스가 될 수 있으며, T는 U에서 상속되어야 합니다.



