공통 면접 질문
절차지향, 객체지향
절차 지향에 대해 설명해주세요.
절차 지향은 물이 위에서 아래로 흐르는 것처럼 순차적으로 실행하는 프로그래밍 패러다임
으로
명령들을 순서대로 실행
하여 기능을 수행하는 것을 말합니다.
절차 지향의 장점으로는 속도가 빠르다는 점이 있고
단점으로는 유지 보수가 어렵다는 점이 있습니다.
객체 지향에 대해 설명해주세요.
객체 지향은 프로그램을 객체들의 집합으로 모델링하여 설계하는 프로그래밍 패러다임
으로
객체들의 상호작용
으로 기능을 수행하는 것을 말합니다.
객체 지향의 특징으로는 추상화
, 캡슐화
, 상속성
, 디형성
이 있습니다.
추상화
는 객체의 속성과 행위를 하나로 묶는 것
입니다.
캡슐화
는 낮은 결합도를 유지하도록 설계하는 것을 말하며 정보 은닉을
할 수 있습니다.
상속성
은 기능을 상속받아 코드의 중복을 줄이고 재사용성을 높히는 것
입니다.
다형성
은 오버라이드, 오버로드와 같이 객체가 여러 형태를 가질 수 있음
을 의미합니다.
객체 지향의 장점으로는 높은 코드 재사용성과 유지 보수가 좋다는 점이있고
단점으로는 실행 속도가 느리고 개발 속도도 느리다는 점이 있습니다.
SOLID원칙에 대해 설명해주세요
SOLID원칙은 객체 지향에서 사용되는 원칙으로 5가지 설계 원칙이 존재합니다.
5가지 설계 원칙으로 단일 책임 원칙
, 개방 폐쇄 원칙
, 리스코프 치환 원칙
, 인터페이스 분리 원칙
, 의존 역전 원칙
이 있습니다.
단일 책임
원칙은 클래스는 단 한개의 책임을 가져야하고 클래스를 변경하는 이유는 단 하나여야 한다는 원칙
입니다.
개방 폐쇄
원칙은 확장에는 열려있어야 하고, 변경에는 닫혀 있어야 한다는 원칙
입니다.
리스코프 치환
원칙은 하위 타입 객체는 상위 타입 객체에서 가능한 행위를 수행할 수 있어야 한다는 원칙
입니다.
인터페이스 분리
원칙은 클라이언트의 목적과 용도에 적합한 인터페이스 만을 제공한다는 원칙
입니다.
의존 역전
원칙은 의존 관계를 맺을 때, 변하기 쉬운 것보다는 변하기 어려운 것에 의존한다는 원칙
입니다.
디자인 패턴
싱글톤 패턴에 대해 설명해주세요
싱글톤 패턴은 클래스의 인스턴스를 하나로 보장
해주는 디자인 패턴입니다.
싱글톤 패턴은 클래스의 인스턴스를 하나만 필요로 할때 사용됩니다.
예시로 Unity의 ResourceManager와 SceneManager가 있습니다.
옵저버 패턴에 대해 설명해주세요
옵저버 패턴은 객체의 상태가 바뀌었을 때 다른 객체들에게 알리는
디자인 패턴입니다.
옵저버 패턴을 사용하여 코드의 결합도를 낮출 수 있습니다.
예시로 Unreal Engine의 UCharacterMovementComponent의 OnLanded가 있습니다.
팩토리 패턴에 대해 설명해주세요
팩토리 패턴은 객체 생성 과정을 추상화하여 객체를 생성하는
디자인 패턴입니다.
팩토리 패턴의 종류로는 심플 팩토리 패턴
, 팩토리 매서드 패턴
, 추상 팩토리 패턴
이 있습니다.
컴포넌트 패턴에 대해 설명해주세요
컴포넌트 패턴은 객체 지향에서 사용되는
디자인 패턴으로
객체의 기능을 컴포넌트로 분리하여, 각 컴포넌트가 특정 기능을 제공
하도록 합니다.
컴포넌트 패턴을 사용하여 모듈 간의 결합도를 낮출 수 있습니다.
예시로 Unity와 UnrealEngine의 컴포넌트가 있습니다.
오브젝트 풀 패턴에 대해 설명해주세요
오브젝트 풀 패턴은 객체의 생성과 제거에 사용되는 비용을 줄이기 위해 객체를 재사용
하는 디자인 패턴입니다.
오브젝트 풀 패턴은 사용하지 않는 객체를 제거하지 않고 재사용
하는 디자인 패턴입니다.
함수, 클래스
추상 함수에 대해 설명해주세요
추상 함수는 선언은 되었지만 구현되지 않은 함수
입니다.
추상 함수는 파생 클래스에서 반드시 재정의
해주어야 합니다.
가상 함수에 대해 설명해주세요
가상 함수는 파생 클래스에서 재정의가 가능한 함수
에 사용됩니다.
순수 가상 함수에 대해 설명해주세요
순수 가상 함수는 구현되지 않은 가상 함수
입니다.
콜백 함수에 대해 설명해주세요
콜백 함수는 함수 또는 메서드를 다른 함수나 메서드의 매개변수로 전달
하여
특정 이벤트나 조건이 발생하였을 때
호출되도록 하는 프로그래밍 패턴`입니다.
람다 함수에 대해 설명해주세요
람다 함수란 이름 없는 함수
입니다.
주로 한 번만 사용되거나, 코드를 간결하게 유지하고 싶을 때
사용됩니다.
추상 클래스에 대해 설명해주세요
추상 클래스는 하나 이상의 추상 함수를 가지고 있는 클래스
입니다.
추상 클래스는 인스턴스화 할 수 없습니다.
인터페이스에 대해 설명해주세요
인터페이스는 순수 가상 함수로만 이루어진 클래스
입니다.
인터페이스는 순수 가상 함수외의 다른 함수와 멤버 변수를 가질 수 없습니다.
캐스팅
업 캐스팅에 대해 설명해주세요
업 캐스팅은 자식 클래스 객체를 부모 클래스 객체로 변환하는 것을 말합니다.
다운 캐스팅에 대해 설명해주세요
다운 캐스팅은 부모 클래스 객체를 자식 클래스 객체로 변환하는 것을 말합니다.
복사
객체를 생성하고 초기화시킬 때 멤버변수를 어떻게 초기화
하느냐에 따라 얕은 복사, 깊은 복사로 나눕니다.
얕은 복사에 대해 설명해주세요
얕은 복사는 한 객체의 모든 멤버 변수의 값을 다른 객체로 복사
합니다.
깊은 복사에 대해 설명해주세요
깊은 복사는 모든 멤버 변수의 값뿐만 아니라, 포인터 변수가 가리키는 모든 객체에 대해서도 복사
합니다.
Call By
Call By Value에 대해 설명해주세요
Call By Value
는 인자로 받은 값을 복사
하여 처리하는 방식입니다.
그렇기 때문에 Call By Value에 의해 받은 값을 변경하여도 원래의 값은 그대로
입니다.
값을 복사하여 사용하기 때문에 메모리 사용량이 늘어납니다.
Call By Reference에 대해 설명해주세요
Call By Reference
는 인자로 받은 값을 그대로
사용하는 방식입니다.
그렇기 때문에 Call By Reference에 의해 받은 값을 변경하면 원래의 값도 변경
됩니다.
값을 복사하여 사용하지 않기 때문에 속도가 빠릅니다.
Value
R-Value에 대해 설명해주세요
R-Value는 접근할 수 있는 메모리 주소가 없는
값을 의미합니다.
예시로
1
2
3
"Hello"; // R-Value
123; // R-Value
'c'; // R-Value
가 있습니다.
L-Value에 대해 설명해주세요
L-Value는 접근할 수 있는 메모리 주소가 있는
값을 의미합니다.
예시로
1
2
3
4
int a = 15;
a; // L-Value
string str = "ABC";
str; // L-Value
가 있습니다.
바인딩
정적 바인딩에 대해 설명해주세요
정적 바인딩은 컴파일 타임에 호출될 함수가 결정
되는 것으로 대부분의 함수는 기본적으로 정적 바인딩됩니다.
동적 바인딩에 대해 설명해주세요
동적 바인딩은 런타임에 호출될 함수가 결정
되는 것으로, 가상 함수는 동적 바인딩됩니다.
테스트 주도 개발(TDD)
테스트 주도 개발에 대해 설명해주세요
테스트 주도 개발은 매우 짧은 개발 사이클의 반복
에 의존하는 개발 프로세스로
개발자는 요구되는 기능에 대한 테스트케이스를 작성하고
그에 맞는 코드를 작성하여 테스트를 통과한 후에 상황에 맞게 리팩토링
하는 개발 방식을 의미합니다.