게임 클라이언트 프로그래머가 준비해야 할 실무면접 리스트입니다.
취준 할 때 만들었던건데 공유하려고 올립니다.
준비해야 될 영역을 간략하게 비중과 함께 이야기하면,
1. C / C++ (40% ~ 60%)
2. 그래픽스 개념 (20%)
3. 운영체제 (10%~20%)
4. 데이터베이스 (10%)
5. 알고리즘, 자료구조 (20%~30%) : 실무면접 기준입니다.
알고리즘과 자료구조는 코딩테스트는 당연히 100%이고
필기 테스트라면 50%라고 생각하시면 될거 같습니다.
대답하는 형식으로 준비했으니 고려해주세요.
첫번째 C++기초 프로그래밍 기초 예상 질문
1. C++의 특징을 말해주세요.
C++언어는 객체지향언어로 4가지의 특징이 있습니다.
첫번째 다형성입니다. 하나의 객체가 여러 가지 타입을 가질수 있는 것을 의미합니다. 관용적인 개념의 다형성은 같은 모양의 코드가 다른 행위를 하는 것을 나타냅니다.
두번째 캡슐화입니다. 캡슐화란 비슷한 속성과 메소드를 하나의 클래스로 묶는 것을 말합니다. 그리고 클래스 내부를 외부에 공개하지 않음으로써 외부에서 이 클래스를 마음대로 수정하는 일을 못하게 합니다. 따라서 정보은닉이 뛰어납니다. 예를들어 멤버 변가 Private가 아닌 public으로 되어 있다면 객체외부에서 마음대로 멤버 변수를 수정할 수 있기 때문에 그 멤버 변수를 이곳 저곳에서 참조하게 되면서 유지보수하기가 어려워집니다.
세번째 상속입니다. 부모 클래스의 메소드와 필드를 자식 클래스에서 그대로 물려 받는 것을 의미합니다. 상속을 활용하게 되면 코드가 재활용되기 때문에 생산성을 높일수 있습니다. 상속은 클래스의 재사용과 확장을 위해 사용됩니다.
네번째 추상화입니다. 어떤 실체들에서 관심이 있는 공통적인 특성을 뽑아내어 하나의 분류로 만드는 것을 말합니다. 즉 어떤 객체로부터 공통적이고 관심있는 부분만을 추출하여 한 곳에 모아 놓는 클래스를 말 합니다.
2. C++과 C언어의 차이를 말해주세요. (객체지향언어 vs 절차지향언어)
속도적인 차이에 대한 이유에 대해서 말씀드리겠습니다. C++이 C언어보다 상대적으로 느립니다. 그 이유는 템플릿이나 객체 지향 언어가 제공하는 기능에서 발생합니다. 객체지향 언어의 특성상 데이터 타입 변환이나 다형성의 기능을 지원하기 위해 다수의 메모리 테이블을 추가합니다. 결과적으로 더 많은 메모리가 필요하며, 또한 메모리 관리하는 기능들이 추가되다 보니 전반적으로 느려지게 됩니다.
그리고 객체를 이용한 출력, 함수를 이용한 출력이 다르고 C++은 namespace 개념을 사용개념을 사용합니다. C를 배울 때는 흔히 식별자의 이름은 같을 수 없다고 배웁니다. 하지만 C++에서는 식별자의 이름이 같을 수 있습니다. 마지막으로 표준 입출력 라이브러리가 다릅니다.
3. 추상 클래스와 인터페이스의 차이는 무엇인가요?
추상클래스는 순수 가상함수를 하나 이상 갖고 있는 클래스입니다.
추상클래스가 되면 인스턴스를 만들수 없게 됩니다. 다른 자식 클래스를 파생시켜 모든 순수 멤버 가상함수를 오버라이딩하면 해당 자식 클래스부터 인스턴스를 다시 생성할 수 있습니다.
즉, 추상클래스는 말 그대로 추상적인 형태만 제안하고 실제 구현은 자식 클래스로 미루기 위한 용도입니다.
추상 클래스는 생성자 멤버변수 일반 메소드를 자유롭게 포함할 수 있으며, 여기 1개 이상의 추상 메소드가 포함되어져 있으면 됩니다. 그러나 인터페이스는‘추상 메소드’만으로만 이루어져 있다는 차이가 있습니다.
4. 가상함수란, 순수 가상 함수란?
virtual 키워드를 함수 앞에 붙이면 가상함수로 선언이 됩니다. 자식 클래스에서 재정의 할 것으로 기대하는 멤버함수를 의미합니다. 이러한 가상함수는 자신을 호출하는 객체의 동적 타입에 따라 실제 호출할 함수가 결정이 됩니다. 순수 가상 함수와 다른 점은 함수의 선언 내부 구현까지 자식 클래스에게 전달하기 위한 함수입니다.
순수가상함수란, 자식 클래스에서 반드시 재정의해야 하는 멤버 함수를 의미합니다. 이러한 순수 가상 함수는 일반적으로 함수의 동작을 정의하는 본체를 가지고 있지 않습니다. 따라서 자식 클래스에서 재정의 하지 않으면 사용할 수 없습니다. 구현 대신 가상함수 선언 맨뒤에 = 0 값을 대입하면 해당함수는 순수가상함수가 됩니다.
5. volatile 키워드에 대해서 설명하세요.
voliatile로 선언한 변수는 컴파일러가 해당 변수를 최적화에서 제외하여 항상 메모리에 접근하도록 하는 키워드입니다.
6. calloc, malloc, new에 대해서 차이점을 설명하세요.
malloc과 new의 차이점은 총 3가지가 있습니다. 리턴값, 매개변수, 라이브러리 제공 함수라는 차이점이 있습니다. 리턴값의 경우 malloc void new할당할 타입만 지정하게 되면 자동으로 할당할 타입의 자료형의 포인터를 리턴합니다. 두번째 매개변수입니다. malloc의 경우 데이터 타입의 사이즈와 공간을 할당할 개수를 곱한 값을 매개변수로 받습니다. 그럼 malloc은 메모리만 할당해주고 new의 경우에는 할당과 동시에 초기화가 가능합니다. new은 C++자체 라이브러리이고 malloc은 라이브러리 제공함수를 필요로 합니다.
malloc과 calloc의 차이는 calloc으로 메모리 할당을 하면 할당된 공간의 값을 모두 0으로 초기화하는 작업이 있습니다. 또한 calloc은 매개변수를 두개를 요구합니다. 데이터 타입의 사이즈와 할당할 메모리 개수를 매개변수로 요구합니다.
7. 언제 malloc을 사용하고 new를 사용해야하죠?
재할당이 빈번하게 일어나는 경우 realloc이 가능한 malloc을 사용하는 것이 옳다고 생각합니다. realloc은 malloc으로 동적할당된 메모리 크기를 변경시켜주는 함수입니다. realloc에도 한계는 있습니다. 새로운 영역을 할당 받더라도 현재 내용을 잃어버리는 일은 절대 없습니다. 그러나 동적으로 할당한 메모리가 있고 여러 개의 포인터가 공유하고 있다면 절대 realloc을 사용하면 안 됩니다. 댕글링 포인터가 발생합니다. 그 원인은 메모리가 부족해 확장을 못하고 새로운 공간으로도 옮길수도 없다면 nullptr을 반환합니다. 원래 공간에 값은 남아 있는데 주소를 잃어버리게 됩니다.
8. null과 nullptr의 차이점은 뭔가요?
기본의 NULL의 의미는 0으로 치환되어 상수로 취급되어 처리되었습니다. 반면에 nullptr은 포인터 취급을 받습니다. 따라서 nullptr을 씀으로서 오버로딩 같은 상황에서 NULL이 갖던 모호함을 해결할 수 있습니다.
포인터가 들어와야하는데 NULL이 들어왔을 때~!
9. inline함수는 무엇인가요?
컴파일러가 함수를 호출하는 대신 그에 대응하는 함수 코드를 대체한다는 것을 의미하여 함수 호출없이 삽입된 함수 코드를 그 자리에서 처리하므로 해당 함수를 수행하기 위해 프로그램이 다른 주소를 점프했다가 되돌아올 필요가 없어 속도면에서 유리합니다.
10. 하위 클래스의 소멸자를 만들어야 하는 이유는?
상속을 받는 자식 클래스의 인스턴스를 생성하고 다형성의 원칙에 따라 해당 객체를 부모 클래스 타입의 변수에 할당하였다고 가정할 때 소멸시 정상적으로 부모 클래스의 소멸자는 호출되는 반면 자식 클래스의 소멸자는 호출되지 않습니다. 해결방법은 참조를 만들고 상위 클래스를 가상 소멸자로 만들어 줍니다.
11. 하이딩, 오버로딩, 오버라이딩의 차이는?
하이딩: 자식 멤버와 부모의 멤버 간의 서로 메소드를 가리키는 것을 의미합니다.
오버로딩: 함수 중복 정의 같은 이름의 함수에 매개변수만 다르게 사용하여 매개변수에 따라 다른 함수가 실행되는 것을 말합니다.
오버라이딩: 상속받을 때 부모클래스의 함수를 자식클래스에서 재정의하여 사용하는 것을 말합니다.
12. C++ 캐스팅 연산자
static_cast (컴파일 타임) | dynamic_cast(런타임 타입) | |
특징 | - 논리적으로 변경 가능한 경우에만 변경 허용 - 컴파일타임에 형변환이 가능한지 검사한다. |
- 런타임타임에서 안정성을 검사한다. |
차이점 | - 사용자가 정의한 클래스가 아닌 C++내부에서 이미정의된 기본 자료형간의 형변환을 하고 싶을 때 사용 가능 - 부모 클래스에서 자식 클래스로 형변환 허용 - 자식 클래스에서 부모 클래스로 형변환 허용 |
- 기본 자료형으로 형변환 불가능 - 자식 클래스에서 부모 클래스 형변환 허용 - 하나 이상의 가상함수를 가진 다형성 클래스에 한해서 부모 클래스에서 자식 클래스로 형변환을 허용한다. - 업케스트 허용 - 다운케스트 제약 |
parent* _parent = new child(); child* _child = static_cast<child*>(_parent);허용 parent* _parent = new parent(); child* _child = static_cast<child*>(_parent);허용 |
parent* _parent = new child(); child* _child = static_cast<child*>(_parent);불허 parent* _parent = new parent(); child* _child = static_cast<child*>(_parent);불허 child* _ child = new child(); parent* _parent = static_cast<parent*>(_child);허용 |
- const_cast: const의 성질을 제거하고 싶을 때 사용합니다. const성향을 제거했지만 실제 데이터가 가지는 메모리 배열이 바뀌거나 하는게 아니기 때문에 처음부터 읽기전용으로 만들어진 메모리를 억지로 접근해서 바꾸려면 에러가 발생합니다. char*를 매개변수로 받는 함수를 정의하는 경우가 종종 있는데 그렇게 되면 const char* 타입의 리터럴 문자열은 전달하지 못하게 됩니다. 이때 사용하는 경우가 많습니다.
- reinterpret_cast: 포인터/참조와 관련된 형변환만 지원합니다. 거의 C스타일의 형변환 수준으로 말 그대로 재해석 한다고 볼수 있습니다.
13. call by value, call by reference
value의 경우 데이터 값을 복사해서 함수로 전달하기 때문에 원본 데이터가 변경될 가능성이 없습니다. 또한 인자를 넘겨줄 때 마다 메모리 공간을 할당하기 때문에 메모리 공간을 좀 더 사용해야합니다.
reference의 경우는 메모리 공간 할당의 문제를 벗어납니다. 참조한 데이터를 변경시 원본 데이터 값이 변경되기 때문에 신경써서 사용해야 합니다.
14. auto란?
C++11에서 추가된 기능으로 초기값을 입력하면 컴파일러에게 타입을 추론하도록 명령하는 키워드입니다. 컴파일 타입에 실행됩니다.
decltype 주어진 이름이나 표현식의 구체적인 타입을 알려주는 키워드입니다. 컴파일 타임에 실행됩니다. auto가 값에 상응하는 타입을 추론시켜주는 키워드라면 decaltype은 값으로부터 타입을 추출해 낼 수 있는 키워드입니다.
15. 얕은 복사, 깊은 복사에 대해서 설명해주세요.
16. 스마트 포인터에 대해서 설명해주세요.
C++에서 메모리 누수(memory leak)로부터 프로그램의 안전성을 보장하기 위해 스마트 포인터를 제공하고 있다. 포인터처럼 동작하는 클래스 템플렛으로 사용이 끝난 메모리를 자동으로 해제해줍니다.
memory헤더 파일에 정의되어 있습니다.
- unique_ptr 하나의 스마트 포인터만이 특정 객체를 소유할 수 있도록 객체에 소유권 개념을 도입한 포인터입니다. 이 스마트 포인터는 해당 객체의 소유권을 가지고 있을 때만, 소멸자가 해당하는 객체를 삭제할 수 있습니다.
- shared_ptr는 참조하는 스마트 포인터가 총 몇 개인지 참조하는 스마트 포인터입니다. 이렇게 참조하고 있는 스마트 포인터의 개수를 참조 횟수라고 합니다. 참조 횟수는 특정 객체에 새로운 shared_ptr이 추가될 때 마다 1씩 증가하고 수명이 다할 때 1씩 감소합니다. 참조 횟수가 0이 되면 자동으로 delete 키워드가 불러 메모리를 해제합니다.
- weak_ptr 하나 이상의 shared_ptr인스턴스가 소유하는 객체에 대한 접근을 제공하지만, 소유자의 수에는 포함되지 않는 스마트 포인터입니다. 만약 서로가 상대방을 가리키는 shared_ptr를 가지고 있다면, 참조 횟수는 절대 0이 되지 않으므로 메모리는 영원히 해제되지 않습니다. 이렇게 서로가 상대방을 참조하고 있는 상황을 순환 참조라고 합니다. weak_ptr은 바로 shared_ptr인스턴스 사이의 순환 참조를 제거하기 위해 사용됩니다.
17. 해시란 무엇인가요?
해시? 해시 테이블이라는 저장공간 내에 key들이 어떤 위치에 있을지 정해서 hash table 안에 값들을 저장하는 구조를 말합니다. 해시는 key와 value쌍으로 이루어져 있습니다.
해시 함수란? hash table안에 key들이 어떤 위치에 있을 지 정해줍니다. 가급적이면 서로 다른 칸에 들어가도록 작동됩니다.
hash bucket? hash table 내 각각의 칸을 말합니다. hash function은 hash bucket의 총 개수에 맞게 구성되어야 합니다.
해시 충돌이란? 두 개 이상의 key가 같은 bucket에 사상되는 경우를 말합니다.
18. 동기와 비동기의 개념 차이
“명령이 끝날 때까지 사용자에게 제어권을 돌려주지 않으면 동기, 명령이 끝나기 전에 사용자에게 제어권을 돌려주면 비동기입니다.”
말 그대로 동기는 동시에 일어난다는 뜻입니다. 요청과 그 결과가 동시에 일어난다는 약속인데요 A노드와 B노드 사이의 작업 처리 단위를 동시에 맞추겠다는 뜻입니다. 반면 비동기란 동시에 일어나지 않는다는 것을 의미합니다. 노드 사이의 작업 처리 단위를 동시에 맞추지 않아도 된다는 뜻입니다. 동기는 설계가 매우 간단하고 직관적이지만 결과가 주어질 때까지 아무것도 못하고 대기해야 한다는 단점이 있고, 비동기방식은 동기보다 복잡하지만 결과가 주어지는데 시간이 걸리더라도 그 시간 동안 다른 작업을 할 수 있으므로 자원을 효율적으로 사용할수 있는 장점이 있습니다.
19. const
변수는 상황에 따라 그 값이 변경가능하지만 상수인 const로 지정을 하면 그 값을 절대로 바꿀수 없다. 변수와 달리 처음 상수를 정의할 때 값을 지정해 주어야 한다.
const int* c c는 상수만을 가리키는 포인터라는 의미이다. C가 가리키는 대상은 변경이 가능하지만 가리키는 값은 변경할 수 없다.
int* const c = &a; 포인터가 가리키는 위치는 변경할 수 없고 가리키는값은 변경이 가능하다.
20. 동적 바인딩
부모 클래스형 포인터로 자식 클래스를 가리키는 업캐스팅 상황에사 오버라이딩 된 부모 쿨래스의 메소드를 호출하게 되면 실행시간에 동적으로 자식 클래스의 메소드를 호출하는 것을 의미합니다.
21. 템플릿 메타프로그래밍
템플릿을 사용하는 프로그래밍 기법으로 컴파일러에게 프로그램 코드를 생성하도록 하는 방식이다. 이러한 기법은 컴파일 시점에 많은 것을 결정하도록 하여, 실행 시점 계산을 줄여줍니다.
22. 람다란?
쉽게 말해 이름 없는 함수입니다. 캡쳐, 인자, 반환형, 몸통으로 구성되어 있으며 런타임 시 이름은 없지만, 메모리 상에 임시적으로 존재하는 클로져 객체가 생성됩니다.
23. 캡쳐 하는 방법 (캡쳐의 범위는 전역)
- [a,&b] a를 복사로 캡처, b를 참조로 캡처.
- [this] 현재 객체를 참조로 캡처.
- [&] 몸통에서 쓰이는 모든 변수나 상수를 참조로 캡처하고 현재 객체를 참조로 캡처.
- [=] 몸통에서 쓰이는 모든 변수나 상수를 복사로 캡처하고 현재 객체를 참조로 캡처.
- [] 아무것도 캡처하지 않음.
24. explicit: 자신이 설정된 방식으로만 객체를 생성하도록 하는 기능을 제공한다.
25. 콘텍스트 스위치
26. constexpr
27. rvalue, lvalue
28. 전위 연산과 후위 연산의 차이
:: 전위연산과 후위연산과의 차이는 임시객체를 만들어서 리턴하냐? 안하냐의 차이 입니다.
Debug모드의 경우에는 후위연산자의 경우에는 임시객체를 만들어 리턴하여 당연히 전위연산보다 느리지만
release 모드에서는 컴파일러의 최적화로 둘의 성능은 같다고 합니다.
29. Explict 키워드는?
Explict 키워드는 C와 C++의 공통 특징 중 하나인 묵시적 형변환을 막아주는 키워드 입니다.
묵시적 형변환 때문에 발견하기 힘든 어려운 버그가 생기는 것을 방지하기 위해 도입된 키워드 입니다.
30. C++11에 처음 들어온 문법은?
바로 auto키워드 입니다.
auto는 컴파일 타임에 자동으로 type을 지정할 수 있도록하기 키워드 입니다.
auto는 초기화 값을 보고 자료형을 판단하기 때문에 선언만 하는 것은 불가능 합니다.
'🙋🏻♀️ pinko > ◽ 게임회사' 카테고리의 다른 글
게임 회사 용어 정리 (아마 계속 업데이트 될거임.) (0) | 2024.07.11 |
---|---|
클라이언트 프로그래머 동영상 포트폴리오 (4) | 2022.12.13 |
1분 자기소개 (실제로 면접 때 했던...) (5) | 2021.02.22 |
실무 면접 대비 3번째 운영체제, 그래픽스 기초 (게임 클라이언트 프로그래머 기준) (1) | 2021.02.22 |
실무 면접 대비 2번째 알고리즘, STL, 자료구조 (게임 클라이언트 프로그래머 기준) (0) | 2021.02.22 |
안 하는 것 보다 낫겠지
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!