면접질문

2) 유니티 신입 개발자 면접 질문 [ 가비지컬렉터, 최적화, C#, C++, 디자인패턴 ]

공훈이 2023. 7. 23. 17:49
반응형

1. 가비지 컬렉터에 대해 설명해 주세요.

가비지 컬렉터란? 동적으로 할당된 메모리 중에서 더 이상 사용하지 않는 개체를 자동으로 탐지하고 해제하는 메모리 기법이다. 이는 메모리 누수와 같은 문제점을 방지하여 프로그램의 안정성과 성능을 향상하는 데 사용한다. 


C#은 가비지 컬렉터를 사용하여 자동으로 메모리를 관리합니다. 가비지 컬렉터는 동적으로 할당된 객체의 메모리를 추적하고, 필요하지 않은 개체를 검출하여 자동으로 해제합니다. 이를 통해 개발자가 따로 메모리 할당, 해제를 하는 번거로움을 줄여줍니다. 

 

C++의 가비지 컬렉터는 C#과 달리 기본적으로 제공하지 않는다. C++은 개발자가 개체의 메모리 할당과 해제를 수동으로 관리해야 하는 언어로써 메모리 누수나 메모리 포인터 관리에 신경 써야 합니다. 


2. 최적화 작업으로 어떤 것이 있을까요

C#과 C++은 다른 환경에서 작동한다. C#은 .NET 프레임워크에서 실행되며 가비지 컬렉션을 사용하여 메모리 관리를 처리합니다. 하지만 C++은 개발자가 명시적으로 메모리를 할당하고 해제해야 합니다. 

 

- 반복문의 최적화 :

반복문을 최적화하여 불필요한 계산을 줄이거나 루프 안에서 발생하는 반복 횟수를 미리 계산하여 설정하여 루프 조건 검사를 줄이거나 루프 안에 불필요한 객체 생성을 피하는 작업을 하여 최적화 작업을 한다. 

 

- 컬렉션 사용 :

적절한 데이터 구조와 컬렉션을 사용하여 데이터 처리를 빠르고 쉽게 할 수 있도록 한다. 

List 보다 HashData, Dictionary를 사용하여 데이터 접근을 효율적으로 한다.

 

- 문자열 처리 :

문자열 작업은 메모리와 시간을 많이 소비하게 된다. 대신 StringBuilder를 사용하여 문자열 연산을 수행하여 성능을 개선한다. 

 Code)

StringBuilder sb = new StringBuilder();

//데이터 추가 

sb.Append(string data);

//데이터 삽입

sb.Insert(int putIndex, string data);

//데이터 교체 

sb.Replace(int putIndex, string replaceData);

//데이터 삭제

sb.Remove(int startIndex, int length); 

 

- 지역변수 사용 :

지역 변수는 데이터 접근이 빠르기 때문에 반복해서 사용하는 객체나 값은 지역 변수에 할당하여 재사용하게 된다면 성능이 향상될 수 있다. 

 

- 프로파일링 :

코드를 프로파일링 하여 실행시간과 메모리 사용을 분석하고 병목현상을 찾습니다. 이를 통해 성능 저하의 원인을 파악할 수 있으며 개선할 수 있다. 

 

주의 사항 ! 너무 과도한 최적화 작업은 개발자에게 가독성과 유지 보수성을 저하시킬 수 있기 때문에 필요한 부분에만 적용하는 것이 중요합니다. 



4. 알고 있는 또는 사용해 본 디자인 패턴이 있다면 설명해 주세요. 

디자인 패턴은 프로그램 개발에서 발생하는 문제를 해결하고 재사용 가능한 솔루션을 제공하는 설계 방법입니다. 


4.1. 싱글턴/옵서버/스트레이트지/팩토리/빌더/커맨드/브리지

싱글턴 패턴 (Singleton Pattern) : 

클래스에 하나의 인스턴스만 필요한 경우에 사용된다. 프로그램의 설정, 데이터베이스 접근 등 단일 인스턴스를 유지하는 경우에 사용되며 자원 낭비를 줄일 수 있다. 

옵저버 패턴 (Observer Pattern) : 

객체의 상태를 변화를 감지하고 이에 관련된 객체들이 자동으로 업데이트를 진행할 때 사용된다. 

스트레이트지 패턴 (Strategy Pattern) : 

동일한 작업을 수행하지만 구현방법이 다양한 경우 사용된다. 같은 작업이라도 다른 알고리즘으로 교체하여 작업할 때 선택하여 진행한다. 

팩토리 패턴 (Factory Method Pattern) :

객체 생성에 대한 구체적인 클래스를 노출시키지 않고 객체를 생성할 때 유용하다. 이는 클래스의 유연성을 높이고 코드 수정 없이 다른 객체 생성 방법을 적용할 때 사용된다. 

빌더 패턴 (Builder Pattern) : 

복잡한 객체의 생성 과정을 추상화하여 객체를 조립하는 설계 방법이다. 객체를 생성하고 구성하기 위해 여러 단계가 필요한 경우 사용되며, 객체의 생성과정을 단계별로 처리하며 서로 다른 구조를 가진 객체를 동일한 알고리즘에서 구현할 수 있다. 

커맨드 패턴 (Command Pattern) : 

사용자가 여러 파일에 관련된 작업(파일 생성, 삭제, 복사 등..)을 커맨드 객체로 캡슐화하여 파일 관리자가 해당 커맨드 객체를 실행할 수 있도록 할 때 사용된다. 또한, 요청 내역을 큐에 저장하거나 로그에 기록하여 작업 추적과 취소 기능을 구현할 때 사용된다. 

브리지 패턴 (Bridge Pattern) : 

추상화와 구현을 분리하여 서로 독립적으로 변형가능하도록 구현하는 방식이다. 구현부를 추상화로부터 분리하여 두 가지 영역이 독립적으로 확장가능하도록 구현한다. 

반응형