유니티,Unity,C#

C++, C# 면접 질문 모음집

기상사건 2024. 6. 12. 09:58
728x90

C++ new / delete 의 내부 동작

• new: 메모리 할당 연산자로, 힙(heap) 메모리에서 객체를 동적으로 생성하며, malloc 함수를 호출하여 메모리를 할당하고, 생성자를 호출하여 객체를 초기화합니다.

• delete: 동적으로 할당된 메모리를 해제하는 연산자로, free 함수를 호출하여 메모리를 해제하고, 소멸자를 호출하여 객체를 정리합니다.

 

가상 함수란 무엇이고 어떻게 동작하는가?

• 가상 함수(Virtual Function): 부모 클래스에서 선언되고 자식 클래스에서 재정의(override)되는 함수입니다. 다형성을 지원하여 객체의 실제 타입에 따라 적절한 함수가 호출되도록 합니다.

• 동작 방식: 가상 함수 테이블(vtable)을 사용하여 런타임에 올바른 함수가 호출되도록 합니다. 각 클래스는 가상 함수 테이블을 가지고 있으며, 객체는 이 테이블을 참조하여 가상 함수를 호출합니다.

 

오버로딩과 오버라이딩의 차이점

• 오버로딩(Overloading): 같은 이름의 함수를 여러 개 정의하되, 매개변수의 수나 타입이 다르도록 하는 것. 컴파일 타임에 결정됩니다.

• 오버라이딩(Overriding): 부모 클래스의 가상 함수를 자식 클래스에서 재정의하는 것. 런타임에 결정됩니다.

 

정적 바인딩과 동적 바인딩

• 정적 바인딩(Static Binding): 컴파일 타임에 함수 호출이 결정되는 것. 함수 오버로딩과 비가상 함수가 이에 해당합니다.

• 동적 바인딩(Dynamic Binding): 런타임에 함수 호출이 결정되는 것. 가상 함수가 이에 해당합니다.

 

가상 소멸자는 왜 필요한가?

• 가상 소멸자(Virtual Destructor): 부모 클래스의 포인터로 자식 클래스 객체를 삭제할 때, 자식 클래스의 소멸자가 올바르게 호출되도록 하기 위해 필요합니다. 그렇지 않으면 자식 클래스의 소멸자가 호출되지 않아 메모리 누수가 발생할 수 있습니다.

 

템플릿이란 무엇이고 어떻게 동작하는가?

템플릿(Template): 함수나 클래스를 정의할 때 데이터 타입을 일반화하여 코드 재사용성을 높이는 기능입니다.

• 동작 방식: 컴파일 타임에 구체적인 타입으로 인스턴스화되며, 필요한 모든 타입에 대해 템플릿 코드가 생성됩니다.

템플릿을 왜 헤더 파일에 작성해야 하는가?

• 템플릿 정의와 선언이 동시에 필요하기 때문에 헤더 파일에 작성해야 합니다. 컴파일 타임에 인스턴스화되므로 정의가 필요합니다.

 

메모리를 간접 참조할 수 있는 방법과 차이점

• 포인터(Pointer): 메모리 주소를 직접 참조하여 접근.

• 참조(Reference): 간접적으로 메모리를 참조하며, 포인터와 달리 null일 수 없습니다.

• 스마트 포인터(Smart Pointer): 메모리 관리 기능을 포함한 포인터로, unique_ptr, shared_ptr, weak_ptr 등이 있습니다.

 

Call By Value / Call By Reference 의 차이

• Call By Value: 함수에 인수로 전달된 값을 복사하여 함수 내에서 사용.

• Call By Reference: 함수에 인수로 전달된 변수의 주소를 전달하여 함수 내에서 원본 변수를 수정.

 

C++의 4가지 cast

• static_cast: 컴파일 타임에 타입 변환을 수행.

• dynamic_cast: 런타임에 타입 변환을 수행하며, 안전한 다운캐스팅에 사용.

• const_cast: const 또는 volatile 속성을 추가하거나 제거.

• reinterpret_cast: 포인터나 정수형을 다른 타입으로 변환.

 

구조체 패딩이란 무엇인가?

• 구조체 패딩(Struct Padding): 구조체의 멤버들이 정렬(alignment)되어 접근 속도를 높이기 위해 빈 공간이 추가되는 것.

 

다중 상속의 문제점

• 다이아몬드 상속 문제(Diamond Problem): 다중 상속 시 동일한 조상 클래스를 두 번 상속받게 되어 모호성이 발생. 이를 방지하기 위해 가상 상속을 사용합니다.

 

this 포인터는 무엇이고 언제 초기화 되는가?

• this 포인터: 객체 자신을 가리키는 포인터로, 멤버 함수 내에서 사용됩니다. 객체가 생성될 때 자동으로 초기화됩니다.

 

static 키워드에 대해서 설명하라

• static 변수: 클래스의 모든 객체가 공유하는 변수로, 클래스 로드 시 초기화되고 프로그램 종료 시 해제됩니다.

• static 함수: 객체와 무관하게 클래스 레벨에서 호출 가능한 함수.

 

const 키워드에 대해서 설명하라

• const 변수: 변경할 수 없는 변수를 선언.

• const 함수: 객체의 상태를 변경하지 않는 멤버 함수.

• const 포인터: 포인터 자체 또는 포인터가 가리키는 값을 변경할 수 없도록 선언.

 

C++에서 struct와 class의 차이

• struct: 기본적으로 멤버들이 public.

• class: 기본적으로 멤버들이 private.

 

Iterator 란 무엇인가?

• Iterator: 컨테이너의 요소들을 순차적으로 접근할 수 있는 객체. 일반적으로 STL 컨테이너와 함께 사용.

 

얕은 복사와 깊은 복사

• 얕은 복사(Shallow Copy): 객체의 멤버 데이터를 그대로 복사.

• 깊은 복사(Deep Copy): 객체의 멤버 데이터가 가리키는 대상까지 복사.

 

빌드 과정

1. 전처리(Preprocessing): 헤더 파일 포함, 매크로 처리.

2. 컴파일(Compile): 소스 코드를 목적 코드로 변환.

3. 어셈블리(Assembling): 목적 코드를 기계어로 변환.

4. 링크(Linking): 라이브러리와 결합하여 실행 파일 생성.

 

unique_ptr / weak_ptr / shared_ptr 의 차이점

• unique_ptr: 단일 소유권을 가지며, 소유권을 전달할 수 있지만 복사 불가.

• shared_ptr: 참조 횟수를 카운트하여 소유권을 공유.

• weak_ptr: shared_ptr 을 참조하지만, 참조 횟수를 증가시키지 않음. 주로 순환 참조를 방지하기 위해 사용.

 

C# vs C++ 메모리 관리의 차이점

• C++: 메모리 관리를 개발자가 직접 수행합니다. new와 delete를 사용하여 메모리 할당과 해제를 관리합니다. 메모리 누수와 같은 문제가 발생할 수 있습니다.

• C#: 가비지 컬렉션(Garbage Collection, GC)을 사용하여 자동으로 메모리를 관리합니다. 개발자가 명시적으로 메모리를 해제할 필요가 없습니다. 메모리 관리의 부담이 덜하지만, GC가 수행되는 동안 성능 저하가 발생할 수 있습니다.

 

가비지 컬렉션(GC)의 동작 방식

• GC 동작: 마크 앤 스윕(Mark and Sweep): 사용되지 않는 객체를 찾아내어(heap에서 참조되지 않는 객체) 메모리를 해제합니다.

세대별 수집(Generational Collection): 객체를 생애 주기에 따라 세대로 구분하여 효율적으로 수집합니다. 일반적으로 3세대로 나뉩니다.

압축(Compaction): 메모리 단편화를 줄이기 위해 사용되지 않는 메모리를 모아 재배치합니다.

 

C#의 타입 시스템

• 값 타입(Value Type): 스택(stack)에 저장되며, 구조체(struct), 열거형(enum) 등이 포함됩니다. 복사가 이루어질 때 값 자체가 복사됩니다.

• 참조 타입(Reference Type): 힙(heap)에 저장되며, 클래스(class), 배열(array), 인터페이스(interface) 등이 포함됩니다.

복사가 이루어질 때 참조(포인터)가 복사됩니다.

 

박싱(Boxing) / 언박싱(Unboxing)

• 박싱(Boxing): 값 타입을 참조 타입으로 변환하여 힙에 저장합니다. 예: int i = 123; object o = i;

• 언박싱(Unboxing): 박싱된 객체를 다시 값 타입으로 변환합니다. 예: object o = 123; int i = (int)o;

 

C#에서 struct와 class의 차이

• struct: 값 타입이며 스택에 저장됩니다. 기본적으로 멤버들이 public. ,상속을 지원하지 않습니다.

• class: 참조 타입이며 힙에 저장됩니다. 기본적으로 멤버들이 private. ,상속을 지원합니다.

 

템플릿(C++)과 제네릭(C#)의 차이점

• 템플릿(C++): 컴파일 타임에 타입을 결정합니다. 코드의 중복을 줄이기 위해 사용됩니다.

• 제네릭(C#): 런타임에 타입 안전성을 제공합니다. 다양한 타입에 대해 동일한 로직을 구현할 수 있습니다.

 

델리게이트(Delegate)와 이벤트(Event)의 차이점

• 델리게이트(Delegate): 함수 포인터와 유사하며, 메서드를 참조할 수 있는 타입입니다. 콜백 함수로 사용됩니다.

• 이벤트(Event): 델리게이트를 기반으로 한 특정한 형태로, 주로 이벤트 구독/발생 패턴을 구현할 때 사용됩니다. 이벤트는 += 연산자를 사용하여 핸들러를 추가하고, -= 연산자를 사용하여 핸들러를 제거할 수 있습니다.

 

델리게이트와 함수 포인터의 차이점

• 델리게이트(Delegate): 멀티캐스트 가능: 여러 메서드를 호출 목록에 추가할 수 있습니다. 타입 안전성 보장: 델리게이트의 메서드 시그니처가 일치해야 합니다. 객체 지향적: 클래스의 인스턴스 메서드와 정적 메서드 모두 참조 가능합니다.

• 함수 포인터(Function Pointer): 단일 함수만 참조 가능. C/C++에서 사용되며, 타입 안전성을 보장하지 않습니다.

 

리플렉션(Reflection)

• 리플렉션: 런타임에 타입 정보를 조사하고 조작할 수 있는 기능입니다. 어셈블리, 모듈, 타입, 메서드, 프로퍼티 등을 탐색하고 인스턴스화할 수 있습니다.

 

어트리뷰트(Attribute)

• 어트리뷰트: 메타데이터를 클래스, 메서드, 프로퍼티 등에 추가할 수 있는 방법입니다. [Serializable], [Obsolete] 등과 같은 어트리뷰트를 사용하여 추가 정보를 제공하거나 행동을 변경할 수 있습니다.

 

String 이 불변인 이유

• String 이 불변인 이유: 메모리 효율성: 문자열 변경 시 새로운 인스턴스를 생성하여 메모리 단편화를 줄입니다. 보안: 문자열 변경이 불가능하여 보안상의 문제를 방지합니다. 스레드 안전성: 여러 스레드에서 문자열을 안전하게 공유할 수 있습니다.

 

Unity 관련 질문

MonoBehaviour 의 이벤트 함수 주기

• MonoBehaviour 이벤트 함수 주기:

1. Awake: 스크립트 인스턴스가 로드될 때 호출.

2. OnEnable: 스크립트가 활성화될 때 호출.

3. Start: 첫 프레임 업데이트 전에 호출.

4. FixedUpdate: 고정된 시간 간격으로 호출.

5. Update: 매 프레임 호출.

6. LateUpdate: 모든 Update 가 호출된 후에 호출.

7. OnDisable: 스크립트가 비활성화될 때 호출.

8. OnDestroy: 스크립트 인스턴스가 파괴될 때 호출.

 

Coroutine 은 무엇이고 내부적으로 어떻게 동작하는가?

• Coroutine: 여러 프레임에 걸쳐 실행을 중단하고 재개할 수 있는 함수입니다. IEnumerator 를 반환하며 yield return을 사용하여 실행을 제어합니다. Unity의 코루틴 관리 시스템에 의해 실행이 관리됩니다.

 

Unity C#과 MS C#의 차이점

• Unity C#: Mono 런타임을 기반으로 동작. 일부 최신 C# 기능과 라이브러리를 지원하지 않을 수 있습니다.

• MS C#: .NET 프레임워크 또는 .NET Core 런타임을 사용. 최신 C# 기능과 라이브러리를 완전히 지원합니다.

 

Transform 과 RectTransform 의 차이점

• Transform: 일반적인 3D 공간에서 객체의 위치, 회전, 크기를 관리. 주로 3D 게임 오브젝트에 사용됩니다.

• RectTransform: 2D UI 요소의 위치, 회전, 크기를 관리. UI 시스템에서 사용되며 앵커, 피벗 등 UI 관련 속성을 제공합니다.

 

Meta 파일이란 무엇인가?

• Meta 파일: Unity에서 각 에셋 파일에 대한 메타데이터를 저장하는 파일입니다. 에셋의 설정, GUID, 임포트 설정 등을 포함합니다. Unity 프로젝트 내의 에셋 파일과 함께 관리됩니다.

728x90