C# 면접 질문 및 답변 TOP 50 (2021년판) – 신입 및 경력 개발자용
C#은 .NET 프레임워크에서 실행되는 다재다능한 객체 지향 언어입니다. ASP.NET 웹 애플리케이션, 데스크톱 소프트웨어, Unity를 통한 게임 개발 등 다양한 분야에서 활용됩니다. C# 개발자로서 커리어를 쌓고자 한다면, 이 면접 질문들을 마스터하여 채용 담당자에게 깊이 있고 폭넓은 지식을 입증하세요.
아래는 신입 개발자를 위한 기초 개념부터 경력 개발자를 위한 고급 주제까지, 가장 자주 묻는 C# 면접 질문들을 엄선한 목록입니다. 각 질문 뒤에는 업계 모범 사례를 반영한 간결하고 권위 있는 답변이 따라옵니다.
무료 PDF 다운로드: C# 면접 질문
신입 및 2/3/5/10년 차 경력자를 위한 C# 면접 질문
이 질문들은 면접관이 지원자가 마스터하기를 기대하는 기본 개념, 문법, 일반적인 함정을 다룹니다.
1. C#이란 무엇인가?
C#은 정적 타입, 타입 안전, 객체 지향 언어로, .NET 런타임에 의해 MSIL(Microsoft Intermediate Language)로 컴파일됩니다.
2. C#의 주석 유형과 예시 설명
• 한 줄 주석: // 이것은 한 줄 주석입니다
• 여러 줄 주석: /* 이것은 여러 줄 주석입니다
여러 줄에 걸쳐 작성할 수 있습니다 */
• XML 문서화 주석: /// <summary>오류 메시지 설정</summary>
3. 여러 catch 블록이 실행될 수 있는가?
아니요. 일치하는 catch 블록이 실행되면, finally 블록(있는 경우)으로 제어가 넘어간 후 try-catch 구조 다음 코드로 진행됩니다.
4. public, static, void의 차이점은?
public – 해당 타입을 참조하는 모든 코드에서 접근 가능.
static – 인스턴스가 아닌 타입 자체에 속함.
void – 메서드가 값을 반환하지 않음을 나타냄.
5. 객체(Object)란?
객체는 new 키워드로 생성된 클래스의 인스턴스입니다. 클래스의 멤버(메서드, 속성, 필드)에 접근할 수 있게 해줍니다.
6. 생성자(Constructor) 정의
생성자는 클래스와 이름이 같은 특수 메서드입니다. 인스턴스가 생성될 때 자동으로 실행되어 필드 초기화와 설정 작업을 수행합니다.
7. 가변 배열(Jagged Arrays)이란?
가변 배열은 배열의 배열입니다. 각 요소가 서로 다른 길이의 배열을 참조할 수 있어 불규칙한 데이터 구조를 만들 수 있습니다.
8. ref와 out 매개변수의 차이점은?
ref는 호출 전에 변수가 초기화되어 있어야 합니다. out은 초기화 불필요; 호출된 메서드에서 반환 전에 값을 할당해야 합니다.
9. C#에서 using 문의 용도는?
using 블록은 IDisposable 리소스를 블록을 벗어날 때 자동으로 해제해줍니다. 예외가 발생해도 안전하게 정리됩니다.
10. 직렬화(Serialization)란?
직렬화는 객체를 저장이나 전송을 위해 바이트 스트림으로 변환하는 과정입니다. 역직렬화는 이 과정을 거꾸로 돌려 객체를 재생성합니다. 타입은 [Serializable] 특성으로 표시하거나 ISerializable을 구현해야 합니다.
11. 정적 메서드 내에서 this 키워드 사용 가능한가?
아니요. this는 현재 인스턴스를 참조하지만, 정적 메서드에는 인스턴스가 없습니다.
12. 상수(Constants)와 읽기 전용 필드(Read-only Fields)의 차이점은?
상수는 컴파일 타임 값으로 변경 불가. 읽기 전용 필드는 런타임에 한 번 할당(인라인 또는 생성자에서)된 후 수정 불가.
3/5/10년 차 경력자를 위한 C# 고급 면접 질문
13. 인터페이스(Interface)란? 예시 제공
인터페이스는 구현 없이 메서드와 속성의 계약만 선언합니다. 예시:
public interface IGreeter { void SetName(string name); string Greet(); } public class FriendlyGreeter : IGreeter { private string _name; public void SetName(string name) => _name = name; public string Greet() => $"Hello, {_name}!"; }
14. 값 타입(Value Types)과 참조 타입(Reference Types)은?
값 타입(예: int, struct)은 데이터를 스택에 직접 저장. 참조 타입(예: class, string)은 힙에 있는 객체에 대한 참조를 가짐.
15. 사용자 지정 컨트롤(Custom Controls)과 사용자 컨트롤(User Controls)은?
사용자 지정 컨트롤은 DLL로 컴파일되어 폼에 끌어다 놓을 수 있음. 사용자 컨트롤(.ascx)은 기존 컨트롤을 조합해 만든 복합 컨트롤로, 재사용 가능한 UI 컴포넌트에 유용.
16. C#의 봉인 클래스(Sealed Classes)란?
봉인 클래스는 상속될 수 없습니다. sealed 한정자는 서브클래싱을 방지하여 클래스의 동작이 변경되지 않게 보장합니다.
17. 메서드 오버로딩(Method Overloading)이란?
메서드 오버로딩은 같은 이름의 메서드를 매개변수 목록만 다르게 하여 여러 개 정의하는 것입니다. 컴파일러는 인수에 따라 적절한 오버로드를 선택합니다.
18. Array와 ArrayList의 차이점은?
Array는 크기가 고정되고 요소 타입이 동일함. ArrayList(현재는 List<T>로 대체됨)는 동적이며 객체를 저장.
19. private virtual 메서드를 오버라이드할 수 있는가?
아니요. private 메서드는 파생 클래스에서 보이지 않으므로 오버라이드할 수 없습니다.
20. protected internal 접근 한정자 설명
protected internal로 표시된 멤버는 같은 어셈블리 내부이거나, 다른 어셈블리의 파생 클래스에서 접근 가능.
21. System.String과 System.Text.StringBuilder의 차이점은?
String은 불변(immutable); 수정 시 새 인스턴스 생성. StringBuilder는 가변(mutable)으로 효율적인 문자열 조작을 위해 설계됨.
22. Array.CopyTo()와 Array.Clone()의 차이점?
Clone()은 전체 배열의 얕은 복사본을 만듭니다. CopyTo()는 기존 대상 배열에 요소를 복사합니다.
23. 배열을 내림차순으로 정렬하는 방법은?
Array.Sort() 후 Array.Reverse()를 사용하거나, 사용자 정의 비교자(comparer)를 제공.
24. 예외를 잡는 C# 문법 작성
예시:
try { GetAllData(); } catch (Exception ex) { // 오류 처리 }
25. 인터페이스와 추상 클래스의 차이점은?
인터페이스는 시그니처만 선언; 모든 멤버가 암시적으로 public이고 abstract. 추상 클래스는 구현을 제공할 수 있고 private 멤버를 가질 수 있음.
26. Finalize()와 Dispose()의 차이점?
Dispose는 비관리 리소스를 결정적으로 해제. Finalize(소멸자)는 GC가 호출하며 비결정적.
27. 순환 참조(Circular References)란?
두 개 이상의 객체가 서로 참조하여 가비지 컬렉션을 방해하고 메모리 누수를 유발할 수 있는 상황.
28. C#의 제네릭스(Generics)란?
제네릭스는 타입 안전하고 재사용 가능한 코드(예: List<T>)를 작성하게 하여 런타임 캐스팅을 줄이고 성능을 향상시킵니다.
29. .NET의 객체 풀(Object Pool)이란?
객체 풀은 초기화된 객체 세트를 보관하여 재사용함으로써 비용이 큰 할당과 가비지 컬렉션을 최소화합니다.
30. .NET에서 자주 쓰이는 예외 타입 나열
ArgumentException, ArgumentNullException, ArgumentOutOfRangeException, ArithmeticException, DivideByZeroException, OverflowException, IndexOutOfRangeException, InvalidCastException, InvalidOperationException, IOException, NullReferenceException, OutOfMemoryException, StackOverflowException 등.
31. 사용자 정의 예외(Custom Exceptions)란?
사용자 정의 예외는 Exception에서 파생된 사용자 정의 타입으로, 특정 오류 시나리오에 맞춤화됩니다.
32. 대리자(Delegates)란?
대리자는 타입 안전한 함수 포인터로, 콜백과 이벤트 처리를 가능하게 합니다.
33. C#에서 클래스를 상속하는 방법은?
콜론 문법 사용:
public class Derived : Base { }
34. 모든 .NET 클래스가 파생되는 기본 클래스는?
System.Object.
35. 메서드 오버라이딩(Overriding)과 오버로딩(Overloading)의 차이점?
오버라이딩은 파생 클래스에서 virtual 메서드의 구현을 변경. 오버로딩은 같은 이름이나 다른 시그니처를 가진 여러 메서드 생성.
36. 메서드를 오버로드하는 다양한 방법은?
매개변수 타입, 순서, 개수를 다르게 함.
37. 인터페이스 내부 메서드에 접근 한정자를 지정할 수 없는 이유는?
인터페이스 멤버는 암시적으로 public이므로 접근 한정자 지정은 중복됨.
38. 클래스 상속은 허용하지만 메서드 오버라이딩은 막으려면?
non-sealed 클래스 내부에서 메서드를 sealed로 선언.
39. 상속받은 인터페이스에 충돌하는 메서드 이름이 있으면?
파생 클래스에서 메서드를 한 번 구현하여 모든 인터페이스 계약을 만족시킴.
40. 구조체(struct)와 클래스(class)의 차이점?
구조체는 스택에 저장되는 값 타입, 다른 구조체 상속 불가, 관례상 불변. 클래스는 힙에 저장되는 참조 타입.
41. .NET에서 nullable 타입 사용하는 방법은?
값 타입 뒤에 ? 추가:
int? id = null; if (id.HasValue) { /* id.Value 사용 */ }
42. 기본값이 아닌 값으로 배열 생성하는 방법은?
Enumerable.Repeat 또는 컬렉션 초기화자 사용.
43. is와 as 연산자의 차이점?
is는 타입 호환성을 검사하여 불리언 반환. as는 캐스팅 시도 후 실패 시 null 반환.
44. 멀티캐스트 대리자(Multicast Delegate)란?
여러 메서드를 참조하는 대리자; 호출 시 연결된 모든 메서드가 순서대로 실행됨.
45. C#의 인덱서(Indexers)란?
인덱서를 사용하면 객체를 배열처럼 인덱싱할 수 있음:
public int this[int index] { get { … } set { … } }
46. throw와 throw ex의 차이점?
throw는 원래 스택 트레이스 보존; throw ex는 스택 트레이스를 초기화하여 디버깅을 어렵게 만듦.
47. C# 특성(Attributes)과 그 의의는?
특성은 타입과 멤버에 메타데이터를 추가하며, 리플렉션을 통해 런타임에 조회 가능.
48. 싱글톤 디자인 패턴 구현 방법은?
예시:
public sealed class Singleton { private static readonly Singleton _instance = new Singleton(); public static Singleton Instance => _instance; private Singleton() { } }
49. DirectCast와 CType의 차이점?
DirectCast는 런타임 타입이 대상 타입과 정확히 일치해야 함. CType은 대상 타입에 정의된 변환을 수행하며 변환 연산자를 호출할 수 있음.
50. C#은 관리 코드인가 비관리 코드인가?
C#은 관리 코드; CLR이 MSIL로 컴파일하고 메모리 관리를 담당.
51. 콘솔 애플리케이션이란?
콘솔 애플리케이션은 명령 프롬프트 창에서 실행되며, .NET 초보자의 첫걸음으로 자주 사용됨.
52. 큐(Queue)에서 요소 제거 예시
Dequeue()로 앞쪽 요소 제거:
Queue queue = new Queue(); queue.Enqueue(1); queue.Enqueue(2); queue.Enqueue(3); int removed = queue.Dequeue(); // removed = 1