C# Flashcards

C# 관련 개발자 면접 질문 정리

1
Q

C++과 비교할 때 메모리 측면에서 차이점은 무엇인가?

A

C++은 포인터와 new, delete를 사용하여 메모리 할당 및 해제를 수동으로 제어하는 반면에, C#은 CLR이 GC(가비지 컬렉터)를 활용하여 메모리를 자동으로 해제한다.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

가비지 컬렉션은 어떻게 동작하는가?

A

가비지 컬렉션을 통해 개발자는 메모리 관리에 대한 직접적인 관여를 줄이고, 메모리 누수와 같은 문제를 방지합니다. 스택 메모리에 있는 루트를 기준으로 매니지드 힙에 참조되지 않는 데이터들을 해제하고 세대를 나누어 관리하는데 이는 0부터 2세대로, 총 3세대로 구성되어 있습니다. 0세대에 새로운 객체가 할당되고 0세대가 가득차게 되면, 메모리를 압축한 뒤 1세대로 승격시킵니다. 마찬가지로 1세대 역시 가득차면 메모리를 압축한 뒤 2세대로 승격시킵니다.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

C#의 타입 시스템은 어떻게 구성되는가?

A

크게 값 타입과 참조 타입으로 나눌 수 있습니다. 값 타입은 변수에 실제 데이터를 저장하며, 주로 스택에 할당됩니다. 기본값 타입과 구조체, 열거형 등이 값 타입에 해당합니다. 참조 타입은 변수에 데이터의 주소를 저장하며, 주로 힙에 할당됩니다. 클래스, 인터페이스, 배열, 델리게이트 문자열 등이 참조 타입에 해당합니다.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

박싱과 언박싱이란 무엇인가?

A

박싱은 값 타입을 오브젝트 또는 값 타입에서 구현된 임의의 인터페이스 타입으로 변환하는 프로세스입니다. 언박싱은 박싱된 인스턴스를 원래의 값 타입으로 변환하는 프로세스입니다.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

C#에서의 구조체와 클래스는 어떤 차이가 있는가?

A

구조체는 값 타입으로 스택에 할당되며, 상속이 불가능합니다. 일반적으로 작은 크기의 데이터를 나타내는 데 사용되며, 불변성을 가질 때 유용합니다. 클래스는 참조 타입으로 힙에 할당되며, 상속이 가능합니다. 복잡한 객체를 나타내는 데 사용되며, 객체 지향 프로그래밍의 주요 구성 요소입니다.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

템플릿과 제너릭의 차이점은 무엇인가?

A

템플릿은 컴파일 타임에 타입이 지정되며, 동일한 템플릿을 서로 다른 타입으로 사용할 경우에 각각의 타입에 대해 별도의 코드가 생성됩니다. 제네릭은 런타임에 타입을 안전하게 지정되며, 실제 코드는 하나만 존재합니다.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

델리게이트와 이벤트의 차이점은 무엇인가?

A

델리게이트는 메소드 참조를 저장하고 호출하는 데 사용되는 타입입니다. 이벤트는 델리게이트 기반이지만 주로 이벤트 기반 프로그래밍에서 객체 간의 통신을 구현하는 데 사용됩니다. 외부 코드에서 직접 호출할 수 없도록 접근을 제한하며, 발행-구독 모델을 지원합니다.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

델리게이트와 함수 포인터의 차이점은 무엇인가?

A

델리게이트는 C#에서 타입 안전성, 다중 캐스트를 제공하며 더 높은 수준의 추상화를 제공합니다. 함수 포인터는 C나 C++에서 사용되며, 단순히 함수의 메모리 주소를 가리키는 포인터로 더 낮은 수준입니다.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

리플렉션이란 무엇인가?

A

리플렉션은 C#에서 프로그램의 메타 데이터를 런타임에 검사하고 조작하는 것으로 프로그램이 자신에 대한 정보를 런타임에 동적으로 탐색하고 사용할 수 있도록 하는 기능입니다. 동적 타입의 객체를 처리할 때, 애플리케이션의 확장성을 높일 때, 테스트 프레임워크에서 테스트 메소드를 동적으로 호출할 때, 직렬화 및 역직렬화 과정에서 타입 정보를 사용할 때 유용합니다. 주요 기능으로는 어셈블리 로드 및 탐색, 타입 정보 조회, 동적 객체 생성 및 메소드 호출, 속성 및 필드 접근 등이 있습니다.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

어트리뷰트란 무엇인가?

A

어트리뷰트는 코드에 대한 메타 데이터를 추가할 수 있는 기능으로 클래스, 메소드, 속성, 필드, 어셈블리 등 다양한 코드 요소에 부가적인 정보를 첨부하는 데 사용됩니다. 런타임에 리플렉션을 통해 읽어낼 수 있으며, 프로그램의 동작을 변경하거나 추가 기능을 제공하는 데 유용하게 사용됩니다.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

String이 불변인 이유는 무엇인가?

A

C#에서 String이 불변인 이유는 주로 안전성, 성능, 보안 그리고 설계의 단순성을 위해서입니다. 불변 객체는 상태 변경을 허용하지 않으므로, 여러 스레드 환경에서 안전하고 효율적으로 사용할 수 있으며, 해시코드 캐싱과 문자열 인터닝을 통해 메모리 효율성을 높일 수 있기 때문입니다.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly