CS면접 준비

Date:     Updated:

카테고리:

Chapter 01 주요 면접 질문

01-1 C++ 프로그래밍 언어 ( 중요도 최상 )

// https://shaeod.tistory.com/362

int * ptr = 0x0000000000000000;

// 이것의 출력 결과를 예측해보면?
cout << "(int*) sizeof : " << sizeof(ptr);

// 아래 구문 이후에 가리키는 주소값은?
ptr = ptr + 1;
  • rvalue와 lvalue에 대해 설명하면? lvalue는 표현식 이후에도 사라지지 않는 값 즉 이름을 지니는 변수이다 rvalue는 표현식 이후에는 사라지는 값 즉 임시 변수이다 (참고)
  • 추상 클래스와 인터페이스의 차이점은? 인터페이스는 상태나 구현을 가질 수 없다, 인터페이스를 구현하는 클래스는 해당 인터페이스의 모든 메소드를 구현해야 한다, 추상 클래스는 상태(data members) 및/또는 구현(method)을 포함할 수 있다, 추상 클래스는 추상 메소드를 구현하지 않고 상속될 수 있다 이때 유도 클래스 역시 추상 클래스가 된다 (참고)
  • 객체지향(C++)의 특징에 대해 설명하면? 첫번째는 상속으로 부모 클래스의 메소드와 필드를 자식 클래스에서 그대로 물려 받는 것을 말한다 두번째는 추상화로 어떤 실체들에서 관심이 있는 공통적인 특성을 뽑아내어 하나의 분류로 만드는 것을 말한다 세번째는 다형성(Polymorphism)으로 하나의 객체가 여러 가지 타입을 가질 수 있는 것을 말한다 네번째는 캡슐화로 관련있는 속성과 메소드를 하나의 클래스로 묶는것을 말한다 (참고)
  • 다형성의 예시에 대해서 설명하면? 연산자 오버로드, 함수 오버로드, 함수 템플릿, 가상함수가 있다 (참고)
  • 추상클래스란 무엇인가? C++에서는 하나 이상의 순수 가상 함수를 포함하는 클래스를 추상 클래스(abstract class)라고 한다 (참고)
  • 인터페이스란 무엇인가? 인터페이스는 구현이 없다 즉, 인터페이스 클래스에는 가상 소멸자와 순수 가상함수만 포함된다 (참고)
  • 생성자는 왜 가상함수가 될 수 없는가? 객체를 만들려면 완전한 정보가 필요합니다 특히 생성하려는 정확한 유형을 알아야 합니다 결과적으로 생성자 호출은 가상이 될 수 없습니다 (참고)
  • 가상함수와 순수 가상 함수에 대해서 설명하면? 순수 가상 함수는 인터페이스(Interface)를 자식 클래스에게 전달하기 위해 사용하는 함수이고, 일반(단순) 가상 함수는 인터페이스(Interface) + 함수의 선언(내부 구현) 까지 자식 클래스에게 전달하기 위해 사용하는 함수입니다 (참고)
  • malloc, new에 대해서 차이점을 설명하면? 4가지 중요한 차이점이 있다 첫째, new를 이용해 객체를 생성하면 생성자가 호출된다 즉 초기값을 줄 수 있다, malloc은 생성자 호출 기능이 없다 즉 초기값을 줄 수 없다 두번째, malloc은 해당 포인터의 타입을 모르기 때문에 리턴 값의 자료형이 void* 이고 new는 해당 객체에 맞는 포인터을 리턴값으로 반환한다 세번째, new를 통해 객체생성시 에러가 발생하면 try, catch문을 활용한 예외처리가 가능하지만 malloc은 예외처리 없이 NULL값을 반환하게 됩니다 네번째, malloc은 realloc으로 할당된 메모리 크기를 재조정이 가능하다 하지만 new는 할당된 크기에 대한 메모리 재조정이 불가능하다 (참고)
  • null과 nullptr의 차이점? null은 상수 0이고, nullptr은 포인터이다 그래서 포인터 변수를 초기화해줄 때 nullptr를 사용해줘야 한다 (참고)
  • C++ 상속에서 부모 클래스 소멸자에 virtual(가상 키워드)를 사용해야 하는 이유는? 다형성과 관련한 객체 소멸 과정에서 발생할 수 있는 문제를 방지하기 위함입니다 부모 클래스의 포인터로 자식 클래스를 호출할때 가상 함수로 정의되지 않은 자식 클래스의 함수를 호출하면 부모 클래스의 멤버 함수가 호출된다 소멸자도 자식 클래스의 소멸자가아닌 부모클래스의 소멸자가 호출이된다 즉 가상 함수로 소멸자가 사용되었다면 자식 클래스에서 재정의 될 수 있음을 명시하기 때문에 자식 클래스의 소멸자부터 차례대로 부모 클래스의 소멸자가 호출된다 (참고), (참고), (참고)
  • 하이딩, 오버로딩, 오버라이딩의 차이는? 하이딩은 슈퍼클레스에 정의된 이름과 동일한 이름을 서브클레스에서 정의해서 사용하게 되면, 서브클래스 내에서는 슈퍼클레스의 이름이 모두 가려지게 되는것을 의미한다, 오버로딩은 같은 이름의 함수에 매개변수만 다르게 사용하여 매개변수에 따라 다른 함수가 실행되는 것을 의미한다 오버라이딩은 상속받을 때 부모클래스의 함수를 자식클래스에서 재정의하여 사용하는 것을 의미한다 (참고), (참고)
  • static_cast와 dynamic_cast의 차이는? static_cast는 컴파일타임에 형변환이 가능한지 검사한다, 기본 자료형간의 형변환이 가능하다, 부모클래스와 자식클래스 양방향으로 형변환을 허용한다 dynamic_cast는 런타임타임에 안정성을 검사한다, 기본 자료형간의 형변환이 불가능하다, 자식 클래스에서 부모 클래스로 형변환이 가능한것은 static_cast와 같지만 부모 클래스에서 자식 클래스로의 형변환은 하나 이상의 가상함수를 가진 다형성 클래스에 한해서만 가능하다 (참고)
  • 스마트 포인터에 대해서 설명하면? C++에서 메모리 누수(memory leak)로부터 프로그램의 안전성을 보장하기 위해 스마트 포인터를 제공하고 있다 포인터처럼 동작하는 클래스 템플렛으로 사용이 끝난 메모리를 자동으로 해제해준다 종류별로 설명하면 shared_ptr은 어떤 하나의 객체를 참조하는 스마트 포인터의 개수를 참조하는 스마트 포인터이다, unique_ptr은 하나의 스마트 포인터만이 해당 객체를 가리킬수 있도록 한다, weak_ptr은 하나 이상의 shared_ptr이 가리키는 객체를 참조할수 있지만 reference count를 늘리지않는 스마트 포인터이다 (참고)
  • const 키워드를 자료형 앞에 사용했을때와 변수명 앞에 사용했을때 차이를 설명하면? const int* c 에서 c가 가리키는 대상은 변경이 가능하지만 가리키는 값은 변경할 수 없다 int* const c = &a; 에서 c가 가리키는 대상은 변경할 수 없지만 가리키는값은 변경이 가능하다 (참고)
  • 정적 바인딩에 대해서 설명하면? 어떤 함수가 호출될지 컴파일시 결정된다 (참고)
  • 동적 바인딩에 대해서 설명하면? 어떤 함수가 호출될지 런타임 중에 결정된다 (참고)
  • 클로져와 람다에 대해서 설명하면? 런타임시 이름은 없지만, 메모리 상에 임시적으로 존재하는 객체를 클로져(Closure)라고 한다 람다는 이름 없는 함수 즉, 익명 함수이다 람다와 클로져의 관계는 클래스(람다)를 정의하고 클래스의 객체(클로져)를 만드는 것과 같다 (참고)
  • 람다란? 쉽게 말해 이름 없는 함수입니다. 반환형, 인자, 몸통, 캡쳐로 구성되어 있으며 런타임 시 이름은 없지만, 메모리 상에 임시적으로 존재하는 클로져 객체가 생성됩니다 (참고)
  • explicit 키워드에 대해서 설명하면? 묵시적 형변환을 할 수 없게 만들고 명시적인 형변환만 가능하도록 만드는 것 (참고)
  • virtual 키워드에 대해서 설명하면? virtual 키워드는 함수에 붙일 수 있다 이 키워드를 붙이면 가상 테이블(virtual table)이 생성된다 여기에는 실제 호출될 함수와 상속 관계 정보가 있다 이를 통해서 오버라이딩이 가능해진다 (참고)
  • C++ 가상함수의 동작 원리에 대해서 설명하면? 클래스에 한 개 이상의 가상 함수가 있을 경우, 컴파일러는 실제 호출되어야할 함수의 위치 정보를 가지고 있는 가상 함수 테이블을 만들고, 클래스 객체에는 가상 함수 테이블을 위한 포인터를 추가합니다 가상 함수가 있는 객체는 가상 함수 테이블을 참조해 호출할 함수를 결정합니다 또한 가상 함수 테이블에는 상속 관계에 관한 정보도 있습니다 (참고)
  • C++ 가상함수 테이블에 대해 설명하면? 컴파일 시 가상함수가 정의된 클래스가 있다면 가상함수테이블(Virtual function table)이 만들어지고, 해당 클래스로 만들어진 객체의 함수가 호출될 때 만들어진 가상함수 테이블이 참조되어 함수가 호출된다 (참고)
  • 복사생성자에 대해서 설명하면? 자신과 같은 클래스 타입의 다른 객체에 대한 참조(reference)를 인수로 전달 받아, 그 참조를 가지고 자신을 초기화 하는 방법 입니다 (참고)
  • static 멤버 메소드에 대해 설명하면? 클래스의 인스턴스(instance)와 무관하게 호출될 수 있는 메소드이다 static 멤버 메소드 안에서는 일반 멤버변수 접근이 불가능하다 오직 static 멤버만 접근가능하다 (참고)
  • static 클래스에 대해 설명하면? static 클래스는 모든 멤버가 static 멤버로 되어 있으며, 인스턴스화 하지 않는 클래스 이기 때문에 객체 생성이 불가능 합니다 (참고)
  • 다중 상속의 문제점은? 가장 큰 문제점은 모호함 이다 즉 둘 이상의 기본 클래스로부터 같은 이름의 함수등을 물려받을 가능성이 생긴다 ( Effective C++ 286 페이지 참조 ), (참고)
  • 바이트 패딩(Byte Padding) 이란? 클래스(구조체)에 바이트를 추가해 CPU 접근에 부하를 덜어주는 기법입니다 (참고)
  • RAII에 대해 설명하면? 자원을 안전하게 사용하기 위해 객체가 쓰이는 스코프를 벗어나면 자원을 해제해주는 기법이다 (참고)
  • static의 의미를 상황별로 설명하면? 전역변수에 선언된 static은 선언된 파일 내에서만 참조를 허용한다는 의미 입니다 함수 내에 선언된 static은 지역변수와 달리 함수를 빠져나가도 소멸되지 않음을 의미합니다 (참고)
  • RTTI에 대해 설명하면? 객체 타입을 런타임중에 알아내는 매커니즘을 RTTI(Run Time Type Information)라고 한다 (참고)
  • new와 delete가 짝이 안맞으면 어떻게 될까요? 단일객체에 delete[]를 사용하면 앞쪽의 메모리 몇 바이트를 읽고 그것을 배열 크기라고 해석한다 이윽고 배열 크기에 해당하는 횟수만큼 소멸자를 호출하기 시작하지만 자신이 밟고 있는 메모리가 배열에 속해 있지 않으며 그 메모리에는 자신이 소멸시키려는 타입의 객체가 이미 들어 있지 않다는 사실에 도달한다 배열객체에 delete를 사용하면 소멸자 호출 횟수가 너무 적기 때문에 미정의 동작이 발생한다 (참고)
  • 스마트 포인터의 순환 참조를 해결하는 방법은? 서로를 참조하는 스마트 포인터 중 하나를 weak_ptr로 만드는 것이다 (참고)
  • 전방선언이 필요한 이유는? 불필요한 헤더 파일이 복잡하게 포함되는 것을 방지하여, 컴파일 속도를 향상시켜준다 (참고)
  • 정적 라이브러리(Static Link Library)와 동적 라이브러리(Dynamic Link Library)의 차이는? 정적 라이브러리는 필요한 함수를 프로그램 코드에 붙여 프로그램 자체에서 참조한다 동적 라이브러리는 프로그램 실행 시 필요시에만 외부 DLL 파일에서 함수를 참조한다 (참고)
  • 정적 멤버 변수(static member variable)에 대해 설명하면? C++에서 정적 멤버란 클래스에는 속하지만, 객체 별로 할당되지 않고 해당 클래스의 모든 객체가 공유하는 멤버를 의미합니다 (참고)
  • 변환 생성자란? 매개변수가 하나뿐인 생성자를 변환 생성자라고 한다 묵시적 변환을 통해 임시 객체가 생성될 가능성을 가지고 있다 (참고), (참고)
  • 생성자 앞에 explicit 키워드를 붙여주면 어떻게 되는가? 변환 생성자의 무작위 호출을 막고 명확성을 높여준다 (참고)
  • override 키워드에 대해 설명하면? override 키워드를 붙여주면 해당 함수가 상속 받아서 오버라이딩이 가능한 함수인지, 그 함수의 이름과 매개 변수등이 잘 맞는지를 컴파일러가 확인해준다 또한, 명확하게 이게 상속 받은 함수인지 눈으로 확인할 수 있습니다 (참고)
  • final 키워드에 대해 설명하면? 부모 클래스의 특정 멤버 함수를 자식 클래스에서 재정의 하지 못하도록 막을때 사용한다거나, 부모 클래스를 자식 클래스에서 상속 받을때 클래스 자체를 더이상 상속이 불가능하게 하려고 할 때 쓰입니다 (참고)
  • 전역 변수와 정적 변수의 차이는? 전역변수는 해당 프로그램(실행파일 기준)의 어느 함수, 어느 파일에서도 접근이 가능한 반면 정적변수는 변수가 선언된 파일이나 함수내에서만 접근이 가능하다 (참고)
  • 이동 생성자란? 다른 객체 멤버 변수들의 소유권을 가져오는 개념이다 복사 생성자와 달리 메모리 재할당을 하지 않기 때문에 빠르다 (참고), (참고), (참고)
  • 인터페이스, 추상 클래스, 다형성 클래스의 차이점은? 인터페이스는 구현이 없다 즉, 인터페이스 클래스에는 가상 소멸자와 순수 가상함수만 포함된다 C++에서는 하나 이상의 순수 가상 함수를 포함하는 클래스를 추상 클래스(abstract class)라고 한다 다형성 클래스는 하나 이상의 가상함수를 가진 클래스이다
  • 순환 참조란? 서로가 상대를 참조하는 상황을 순환 참조(Circular Reference)라고 한다 (참고)
  • 생성자 안에서 가상함수를 호출하면 어떻게 되는가? 부모클래스의 생성자 안에서 가상함수를 호출하면 개발자가 만들려는 객체가 자식클래스의 객체여도 자식 자식클래스의 생성자에서 호출하길 원했던 가상함수가 호출되지 않는다 이유는 Parent의 생성자가 호출될 시점에는 Child가 생성되어 있지 않아서 이다 ( Effective C++ 101 페이지 참조 ), (참고)
  • 소멸자 안에서 가상함수를 호출하면 어떻게 되는가? 파생 클래스의 소멸자가 호출되고 나면 파생 클래스의 멤버는 정의되지 않은 것으로 가정하기 때문에, 파생 클래스의 가상함수를 더이상 호출할 수 없다 ( Effective C++ 102 페이지 참조 )
  • 포인터와 참조의 차이는? 포인터는 NULL 할당을 허용하지만 참조는 NULL 할당이 허용되지 않는다 포인터는 할당 할 때 참조 대상에 대해 앰퍼샌드 연산을 통해 주소값을 할당합니다 반면 레퍼런스에는 참조 대상을 직접 할당한다 따라서 선언과 동시에 초기화를 하지 않으면 컴파일 오류가 발생한다 포인터 변수는 포인터 자체의 값을 변경할 수 있지만, 참조는 한 번 대상을 지정하면 변경할 수 없습니다 (참고)
  • std::move에 대해 설명하면? 전달된 파라미터를 강제로 rvalue 참조로 캐스팅하여 리턴하는 함수입니다 (참고), (참고)
  • std::forward에 대해 설명하면? 전달된 파라미터가 lvalue인지 rvalue인지에 따라 조건부 캐스팅을 진행한뒤 리턴한다 (참고), (참고)
  • weak_ptr의 lock 함수에 대해 설명하면? weak_ptr 가 가리키는 객체가 아직 메모리에서 살아 있다면 (참조 개수가 0이 아니라면) 해당 객체를 가리키는 shared_ptr 를 반환하고, 이미 해제가 되었다면 아무것도 가리키지 않는 shared_ptr 를 반환한다 (참고)
  • 보편 참조에 대해 설명하면? 보편 참조의 의미는 rvalue 참조이거나 lvalue 참조 중 하나라는 의미이다 (참고)

01-2 자료구조, C++ STL ( 중요도 상 )

  • vector와 list의 차이는? vector를 중간삽입시 원소를 밀어내지만 list는 노드를 연결만 하기 때문에, 삽입 삭제 부분에서 시간복잡도의 우위를 가진다 그리고 vector는 메모리가 연속적이기 때문에 랜덤 접근이 가능하지만 list는 더블링크드리스트로 되어 있어 x[2]와 같은 랜덤 접근이 되지 않는다 즉 검색적인 측면에서는 vector가 우위에 있다 (참고)
  • 단일 연결 리스트 뒤집기를 손코딩 하면? (참고), (참고)
  • Hash란 무엇인가? 데이터와 연관된 고유한 숫자를 생성해 인덱스로 사용하는 방법 (참고), (참고)
  • 백터에 객체를 담는 것과 포인터를 담는 것의 차이는? 객체를 담을때는 복사생성자가 호출되고 clear을 통해 해당 원소를 제거할 수 있다 포인터를 담을때는 복사생성자가 호출되지 않고 해당 포인터가 가리키는 메모리를 직접해제 해줘야 한다 (참고), (참고)
  • unordered_map과 비교하여 map의 장점에 대해 설명하면? unordered_map은 key를 이용하여 정렬을 할 수 없고, map은 key를 이용하여 정렬을 할 수 있다 (참고), (참고)
  • 힙 자료구조란? 우선순위 큐를 위해 고안된 완전이진트리 형태의 자료구조이다 여러 개의 값 중 최댓값 또는 최솟값을 찾아내는 연산이 빠르다는 특징이 있다 (참고)
  • 우선순위 큐란? 우선순위가 높은 데이터가 먼저 나가는 형태의 추상적인 자료구조이다 일반적으로 힙(Heap)을 이용하여 구현한다 (참고)
  • 해싱의 충돌 해결책에 대해 설명하면? 키에 해당하는 데이터들을 연결하는 방식인 체이닝 기법과 재해싱을 통해 다른 버킷에 데이터를 저장하는 개방주소법이 있다 (참고)
  • stl vector에서 push_back과 emplace_back의 차이에 대해 설명하면? push_back은 삽입할 객체를 받아 임시 객체를 만들고 push_back 내부에서 복사가 일어난 뒤 vector에 추가를 한다 emplace_back은 삽입할 객체의 생성자를 위한 인자들을 받아 std::vector 내에서 직접 객체를 생성하여 삽입하므로 임시 객체의 생성과 파괴, 복사(혹은 move)를 하지 않아도 되어 성능상 push_back에 비해 유리하다 (참고)
  • map의 장점은? Key 값으로 자동 정렬이 된다는 점과 이 Key를 통해 인자에 접근이 가능하다는 점이 장점이다 (참고)
  • 시퀀스 컨테이너란? 데이터를 선형으로 저장하는 자료구조 이며 vector, list, deque등이 이에 해당합니다 (참고)
  • 연관 컨테이너란? 일정한 규칙에 따라 자료를 조직화하여 저장하는 자료구조 이며 대표적으로 map, set이 이에 해당합니다 (참고)
  • 어댑터 컨테이너란? 시퀀스 컨테이너를 변형시켜 스택, 큐, 우선순위 큐 형태로 저장하는 것을 말합니다 (참고)
  • 컨테이너란? 같은 타입의 여러 객체를 저장하는 일종의 집합이라고 할 수 있습니다 (참고)
  • 이터레이터(반복자)란? 이터레이터는 컨테이너에 저장된 원소를 순회하고 접근하는 일반화된 방법을 제공합니다 또한 컨테이너와 알고리즘이 하나로 동작하게 묶어주는 인터페이스 역할을 합니다 (참고)
  • List 클래스의 추가/삭제 함수를 손코딩 하면? (참고)
  • 시간복잡도란 무엇인가? 시간 복잡도는 문제를 해결하는데 걸리는 시간과 입력의 함수 관계를 가리킨다 (참고)
  • 벡터와 일반 배열의 메모리 구조의 차이는 뭘까요? 벡터는 Heap 메모리를 사용하고, 배열은 Stack 메모리를 사용한다 (참고)
  • 해싱이란? 통상적인 반복 비교를 통하지 않고, 특정 계산 만으로 바로 자료 저장 위치를 알아내는 탐색 방법 (참고)
  • 우선순위 큐의 동작 원리는? (1) 삽입할 원소는 완전 이진트리를 유지하는 형태로 순차적으로 삽입된다 (2) 삽입 이후에는 루트 노드까지 거슬러 올라가면서 최대 힙을 구성(상향식) (참고)
  • 이진트리와 이진탐색트리 차이는? 이진탐색트리는 이진트리의 특성 외에 왼쪽 자식 노드는 부모보다 작고, 오른쪽 자식 노드는 부모보다 크다는 특성을 갖고있다 (참고)
  • 우선순위큐(PriorityQueue)의 동작원리는? 부모 노드와 자식 노드를 비교해 최대힙은 원소 값이 큰 노드가 위로가게 자리를 바꾸고 최소힙은 원소 값이 작은 노드가 위로가게 자리를 바꾼다 (참고)
  • 우선순위큐와 힙의 차이는? 우선순위 큐는 추상적인 자료형이다 힙은 자료구조이다 (참고)

01-3 알고리즘 ( 중요도 상 )

  • QuickSort를 설명하면? 리스트 안에 있는 한 요소를 선택한다 이렇게 고른 원소를 pivot 이라고 한다 -> 피벗 앞에는 피벗보다 값이 작은 모든 원소들이 오고, 피벗 뒤에는 피벗보다 값이 큰 모든 원소들이 오도록 피벗을 기준으로 리스트를 둘로 나눈다 이렇게 배열을 둘로 나누는 것을 분할(Divide) 이라고 한다 분할을 마친 뒤에 피벗은 더 이상 움직이지 않는다 -> 분할된 부분 리스트들에 대해 재귀(Recursion)적으로 이 과정을 반복한다 (참고)
  • QuickSort에서 pivot을 선택하는 방법은? Median Of Three Pivot 이라는 방법이 있으며 3개의 원소를 후보로 두고 그 중간 값을 선택하는 방법이다 (참고)
  • 퀵소트와 버블 소트의 차이는? 퀵소트는 데이터가 불규칙하거나 규칙적인 것에 따라 비교 수가 변한다 버블 소트는 데이터가 불규칙하거나 규칙적인 것에 따라 비교 수가 변하지는 않는다 (참고)
  • 병합정렬(Merge Sort) 구현 방법은? 주어진 배열을 원소가 하나 밖에 남지 않을 때까지 계속 둘로 쪼갠 후에 다시 크기 순으로 재배열 하면서 원래 크기의 배열로 합친다 (참고)
  • 퀵소트의 시간 복잡도가 O(n제곱)인 경우 즉 최악의 경우는 어떻게 발생할 수 있는가? 배열이 오름차순 정렬되어있거나 내림차순 정렬되어있는 경우에 재귀 호출의 깊이 곱하기 각 재귀 호출 단계의 비교 연산 = n제곱 이라는 최악의 시간복잡도를 갖는다 (참고)
  • 병합 정렬과 퀵 정렬의 성능적인 차이는 무엇인가? 퀵 정렬은 pivot을 선택하는 방식에 따라서 최악의 경우 O(n^2)의 성능을 보일 수 있습니다 반면에 병합 정렬은 항상 O(nlogn)의 성능을 보장합니다 또한 퀵 정렬은 in-place sorting이 가능하기 때문에 추가적인 메모리 사용이 없습니다 반면에 병합 정렬은 분할된 리스트를 병합하기 때문에 추가적인 메모리를 사용해야 합니다 참조 지역성 관점에서 퀵 정렬은 일반적으로 병합 정렬보다 더욱 빠르게 동작합니다 (참고), (참고), (참고)

01-4 그래픽스 ( 중요도 상 )

  • 벡터의 내적 외적에 대해 설명하면? 내적은 두 벡터의 각 성분끼리의 곱의 합이다 내적은 두 개의 벡터가 있을때 한 벡터의 방향으로 나머지 하나를 projection(투영) 시킨 것과 다른 한 벡터의 크기의 곱이다 두 벡터의 외적은 그들이 이루는 평면에 수직이며, 크기는 두 벡터가 이루는 평행사변형의 넓이와 같은 새로운 벡터를 만드는 연산입니다 참고로 투영이란 3차원 입체에서 2차원 평면, 2차원 평면에서 1차원 직선, 직선에서 다른 직선 등으로 주로 차원을 단순화시키며 도형을 변환시키는 것을 의미한다 (참고), (참고), (참고), (참고), (참고), (참고)
  • 짐벌락에 대해 설명하면? 짐벌락은 같은 방향으로 오브젝트의 두 회전 축이 겹치는 현상을 말한다 회전행렬을 이용해 물체를 회전시키려 할때 발생한다 (참고)
  • 쿼터니언에 대해 설명하면? 두 사원수의 곱으로 3D 공간 상에서의 회전을 표현할 수 있다 회전축은 허수부 i,j,k를 활용하고 각도는 실수부를 활용한다 (참고)
  • 렌더링 파이프라인에 대해 설명하면? 입력 조립기 - 버텍스 셰이더 - 테셀레이션 - 지오메트리 셰이더 - 레스터라이저 - 픽셀 셰이더 - 출력 병합기 순으로 3차원의 가상 세계를 2차원의 이미지로 생성한다 (참고)
  • 포워드 렌더링과 디퍼드 렌더링의 차이에 대해서 설명하면? 포워드 렌더링은 3D공간에서 존재하는 폴리곤을 픽셀화하여 그 픽셀 마다 쉐이딩과 라이팅 연산을 더하는 방식입니다 일반적으로 O(NP)의 시간복잡도를 가지며, 여기서 N은 오브젝트의 수이고 P는 픽셀의 수입니다 해상도가 올라가도 요구하는 메모리가 디퍼드보다 적지만 라이팅 연산이 느립니다 디퍼드 렌더링은 한 화면에 수많은 라이팅 효과를 넣고 싶어서 만든 렌더링 기법입니다 실시간으로 라이팅에 반응 하는 쉐이더를 쓰는 게임은 기본적으로 디퍼드 렌더링입니다 구현방식은 폴리곤을 픽셀화하여 포토샵의 레이어처럼 정보를 나누어 비디오 메모리에 저장합니다 여기에서 각종 쉐이더와 라이팅효과를 처리한 후 화면에 보여줍니다 시간복잡도는 O(R * L)입니다 여기서 R은 화면 해상도 이고 L은 라이트 소스의 수입니다 (참고), (참고), (참고)
  • 컬링 기법들을 아는대로 나열하고 설명하면? 컬링의 종류는 백페이스 컬링(BackFace Culling), 오클루전 컬링(Occlusion Culling), 프러스텀 컬링(ViewFrustum Culling)이 있다 백페이스 컬링은 물체의 뒷면을 렌더링에서 제외하는 것이다 오클루전 컬링은 다른 오브젝트에 가려진 오브젝트들은 렌더링하지 않는 것이다 프러스텀 컬링은 카메라의 뷰 프러스텀(View Frustum) 영역 밖의 오브젝트들은 렌더링하지 않는 것이다 (참고)
  • World, View, Projection Transfrom 특징과 연산 과정을 작성하시오 (참고), (참고)
  • 깊이버퍼란? 현재 프러스텀에서 모든 픽셀의 깊이값을 기록하는 데 사용합니다 같은 위치에 여러 픽셀이 자리하는 경우 깊이값을 이용하여 어느 픽셀을 사용할 지 고르게 됩니다 (참고)
  • Ambiet, Diffuse, Specular, Emissive의 각각의 특징과 연산과정을 작성하시오 (참고)

01-5 운영체제 ( 중요도 중 )

  • 운영체제가 사용하는 메모리 영역에 대해 설명하면? OS 메모리 구조는 2가지 영역으로 나누는데 바로 유저 영역, 커널 영역이다 유저영역 메모리는 4가지로 나눠지는데 데이터영역, 힙영역, 코드영역, 스택 영역으로 구분이 된다 그리고 커널 영역은 시스템 운영에 필요한 메모리로 운영체제가 올려져 있다 (참고)
  • 지역변수와 전역변수는 메모리상 에서 어디에 놓이나요? 지역변수는 stack 영역에, 전역변수는 data 영역에 놓인다 (참고)
  • 스레드란 무엇인가? 프로세스가 할당받은 자원을 이용하는 실행 단위다 (참고)
  • 프로세스가 사용하는 메모리 영역과 스레드가 사용하는 메모리 영역의 차이점은? 프로세스는 각자 본인이 사용하는 메모리 영역과 레지스터 값을 가지며 프로세스의 메모리 영역은 데이터, 힙, 코드, 스택 영역으로 구성된다 그리고 스레드는 각자의 레지스터와 스택을 가지지만, 나머지 영역은 가지지 않는다. 대신에 데이터, 힙, 코드 영역을 공유해서 병렬적인 수행이 가능하다. (참고)
  • 컴퓨터에 존재하는 메모리들의 액세스 속도를 설명 하면? 레지스터는 프로세서에 위치한 고속 메모리로 프로세서가 바로 사용할 수 있는 데이터를 담고있다, 캐시는 레지스터 다음으로 빠른 메모리이며 CPU 내부에 존재한다 CPU가 필요로 하는 데이터가 레지스터에 없는 경우에 주기억장치로부터 데이터를 읽어오기 위해서는 상당히 긴 시간이 필요하다 때문에 자주 사용되는 데이터를 주기억장치에서 복사해와 CPU의 메모리 접근시간을 줄이기 위해 사용한다, 주기억장치는 CPU가 처리하고 있는 내용이 가져와지는 곳을 말한다, 보조기억장치는 주기억장치보다는 느리지만 많은 양의 데이터를 영구적으로 보관할 수 있는 장치이다 (참고)
  • context switching에 대해 설명하면? 현재 진행하고 있는 Task(Process, Thread)의 상태를 저장하고 다음 진행할 Task의 상태 값(PCB)을 읽어 적용하는 과정을 말합니다 (참고)
  • 블로킹(blocking) vs 논블로킹(non-blocking)에 대해서 설명하면? blocking은 A 함수가 B 함수를 호출 할 때, B 함수가 자신의 작업이 종료되기 전까지 A 함수에게 제어권을 돌려주지 않는 것 non-blocking은 A 함수가 B 함수를 호출 할 때, B 함수가 제어권을 바로 A 함수에게 넘겨주면서, A 함수가 다른 일을 할 수 있도록 하는 것 (참고)
  • 프로세스와 스레드의 차이는? 프로세스는 메모리 상에서 실행중인 프로그램을 말하며, 스레드는 이 프로세스 안에서 동작하는 실행 단위다 (참고)
  • 교착상태(데드락)가 무엇이며 4가지 조건은? 프로세스 또는 쓰레드가 자원을 얻지 못해 다음 처리를 하지 못하는 상태이며 상호배제, 점유대기, 비선점, 순환대기 이 4가지 조건 중 하나라도 만족하지 않게 하면 교착상태는 발생하지 않는다 (참고), (참고)
  • 교착상태를 해결하는 방법은? 예방, 탐지, 회피, 무시 (참고)
  • 페이지 폴트란 무엇인가? CPU가 프로그램을 실행하면서 필요한 페이지가 물리적 메모리에 없는 경우도 생기게 되는데 이것을 페이지 폴트(Page Fault)라고 한다 (참고)
  • 내부 단편화와 외부 단편화를 설명하면? 내부 단편화는 메모리를 할당할 때 프로세스가 필요로 하는 크기보다 더 큰 메모리가 할당되어 프로세스에서 사용하는 메모리 공간이 낭비 되는 현상이다 외부 단편화란 남아있는 총 메모리 공간이 요청한 메모리 공간보다 크지만, 남아있는 공간이 연속적(contiguous)이지 않아 사용하지 못하는 공간이 발생하는 현상이다 (참고), (참고)
  • 가상메모리란? 실제로 프로그램 수행에 필요한 부분만 주메모리에 올려놓음으로써 주기억장치의 용량보다 큰 프로세스라도 사용자가 메모리에 올려놓을 수 있게 하는 기법이다 (참고), (참고)
  • 페이징의 정의와 작동하는 원리를 설명하면? 프로세스의 주소 공간을 동일한 크기의 페이지 단위로 나누어 물리적 메모리의 서로 다른 위치에 페이지들을 저장하는 방식을 말한다 (참고), (참고)
  • 세그먼테이션에 대해 설명하면? 메모리를 서로 크기가 다른 논리적인 블록 단위인 세그먼트(segment)로 분할하고 메모리를 할당하여 물리 주소를 논리 주소로 변환하는 것을 말한다 (참고)
  • 세마포어, 뮤텍스의 차이점을 설명하면? 세마포어는 동기화 대상이 여러개 일 때 사용하고, 뮤텍스는 동기화 대상이 오로지 하나 일 때 사용된다 (참고), (참고), (참고)
  • Race Condition이란? 두 개 이상의 cocurrent한 프로세스(혹은 스레드)들이 하나의 자원(리소스)에 접근하기 위해 경쟁하는 상태를 말합니다, 여기서 cocurrent하다는 말은 동시성(병행성)을 가진다는 말이다 (참고), (참고), (참고)
  • Race Condition을 해결하기 위한 방법은? 임계 영역에 대한 상호배제를 실현해줘야 한다 대표적으로 mutex를 활용하는 방법이 있다
  • 동기(Synchronous) vs 비동기(Asynchronous)에 대해서 설명하면? 함수 A가 함수 B를 호출한 뒤, 함수 B의 리턴값을 계속 확인하면서 신경쓰는 것이 동기이다 비동기는 함수 A가 함수 B를 호출한 뒤, 함수 B의 리턴값이 반환 되었는지 신경쓰지 않는다 (참고)
  • context switching의 오버헤드의 주원인은? context switching 때 해당 프로세서는 아무런 일을 하지 못한다, 따라서 컨텍스트 스위칭이 잦아지면 오버헤드가 발생해 효율(성능)이 떨어진다 (참고)
  • 메모리 단편화와 해결책에 대해서 설명하면? 사용가능한 메모리가 충분히 존재하지만 할당(사용)이 불가능한 상태를 보고 메모리 단편화가 발생했다고 한다 해결책에는 세그먼테이션(내부단편화), 페이징(외부단편화), 메모리풀(모두해결), 통합(모두해결), 압축(모두해결)과 같은 기법들이 있다 (참고)
  • 시스템 콜이란? 프로세스가 운영체제(system)에게 파일 생성이나 쓰기 또는 읽기, 키보드 입력, 그래픽 출력과 같은 기능을 요청(call)하는 것입니다 (참고)
  • 메모리풀의 정의와 장단점을 설명하면? 메모리풀은 메모리를 미리 할당 받아놓고, 사용자가 필요할 때 메모리를 제공하는 것을 말합니다 장점은 메모리 단편화가 줄어듭니다 단점은 공간 효율성이 떨어질 수 있습니다 (참고)
  • 메모리 구조에 대해 설명하면? 실행할 프로그램의 코드가 저장되어 프로그램이 종료되어야 소멸되는 코드영역, 전역변수와 정적변수가 저장되고 프로그램이 종료되어야 소멸되는 데이터 영역, 함수의 호출과 관계되는 지역변수와 매개변수가 저장되며 함수의 호출과 함께 할당되고 함수의 호출이 완료되면 소멸하는 스택영역, 사용자가 직접 관리할 수 있고 사용자에 의해 메모리 공간이 동적으로 할당되고 해제되는 힙영역이 있습니다 (참고)
  • 멀티프로세스와 멀티쓰레드의 차이는? 멀티프로세스는 어떤 일을 여러 프로세스가 처리하며 프로세스간 통신 코스트가 크다는 특징이 있습니다 멀티쓰레드는 어떤 일을 여러 쓰레드가 처리하는 것인데 Data, Heap과 같은 메모리 영역을 공유하며 일처리를 분산할 수 있지만, 쓰레드간의 간섭이 있어 잘 예상하고 구현해야합니다 (참고)
  • 임계 영역(크리티컬 섹션)의 두가지 의미에 대해서 설명하면? (1) 둘 이상의 쓰레드가 동시에 실행될 경우 접근 문제를 발생시킬 수 있는 코드 블록을 임계 영역이라고 한다 (2) 임계 영역에 대한 문제를 해결하는 동기화 기법을 의미하기도 한다, 특정 임계 영역에 대한 키를 가져야만 해당 영역에 접근할 수 있도록 하는 기법이다 (참고)
  • 멀티 쓰레드란? 하나의 프로세스 내에서 둘 이상의 스레드가 동시에 작업을 수행하는 것을 의미합니다 (참고)
  • 크리티컬 섹션과 뮤텍스의 차이는? 크리티컬 섹션은 한 프로세스 내의 쓰레드 사이에서만 동기화가 가능한 반면, 뮤텍스는 여러 프로세스의 스레드 사이에서 동기화가 가능하다 뮤텍스를 가장 흔히 사용하는 예가 프로세스 다중 실행을 막을 때이다 (참고)
  • 시간적 지역성과 공간적 지역성에 대해 설명하면? 시간적 지역성은 최근 액세스 된 기억 장소가 가까운 미래에 다시 액세스 될 가능성 높다는 의미이다 공간적 지역성은 액세스된 기억장소와 인접한 기억장소가 액세스될 가능성 높다는 의미이다 (참고)
  • Heap Overflow와 Stack Overflow에 대해 설명하면? Heap Overflow는 heap이 위에서부터 주소값을 채우며 내려오다가 stack영역을 침범하는 경우이다 Stack Overflow는 밑에서 부터 주소값을 채우며 올라가다가 heap 영역을 침범하는 경우이다 (참고)
  • 스택을 스레드마다 독립적으로 할당하는 이유는? 스택은 함수 호출 시 전달되는 인자, 되돌아갈 주소값 및 함수 내에서 선언하는 변수 등을 저장하기 위해 사용되는 메모리 공간이므로 스택 메모리 공간이 독립적이라는 것은 독립적인 함수 호출이 가능하다는 것이고 이는 독립적인 실행 흐름이 추가되는 것이다 따라서 스레드의 정의에 따라 독립적인 실행 흐름을 추가하기 위한 최소 조건으로 독립된 스택을 할당한다 (참고)
  • 스레드가 프로세스보다 콘텍스트 스위칭이 빠른 이유는? 스레드는 콘텍스트 스위칭될 때 스택(Stack)을 제외한 코드(Code), 데이터(Data), 힙(Heap) 영역은 프로세스의 것이기 때문에 자신의 TCB에는 스택 및 간단한 정보만 저장해서 프로세스 콘텍스트 스위칭보다 빠르다 그러나 프로세스 간의 콘텍스트 스위칭은 코드, 데이터, 힙 영역 모두 전환해야 하므로 스레드 간의 콘텍스트 스위칭보다 오버헤드가 크고 느릴 수 있습니다 (참고), (참고)
  • 동기화란 무엇인가? 프로세스 또는 스레드들이 수행되는 시점을 조절하여 서로가 알고 있는 정보가 일치하는 것을 의미합니다 (참고)
  • 스핀락이란? 스핀락(spinlock)은 임계 구역(critical section)에 진입이 불가능할 때 진입이 가능할 때까지 루프를 돌면서 재시도하는 방식으로 구현된 락을 가리킨다 (참고)
  • 인터럽트란 무엇인가? 프로그램을 실행하는 도중에 예기치 않은 상황이 발생한 경우, 현재 실행중인 작업을 즉시 중단하고, 발생된 상황을 우선 처리한 후 실행중이던 작업으로 복귀하여 계속 처리하는 것이다 (참고)
  • 멀티스레드에서 발생할 수 있는 두가지 문제는? 동기화 문제와 데드락 문제가 발생할 수 있다 동기화 문제는 크리티컬 섹션 혹은 뮤텍스로 해결할 수 있고 데드락 문제는 중첩된 Lock을 사용하는것을 피하거나 한 쓰레드에 우선권을 주는 방법으로 해결할 수 있다 데드락 문제를 해결하기 위해 다른 방법으로는 스레드가 자원을 요청할 때 타임아웃(Time-out) 값을 설정하는 방법이 있다 이 방법은 자원을 점유하고 있는 스레드가 다른 스레드에게 자원을 양보하지 않으면, 일정 시간이 지난 후 자동으로 자원을 반납하도록 하는 방법이다 또한, 데드락이 발생한 경우에는 데드락 탐지 알고리즘을 사용하여 데드락이 발생했음을 감지하고, 해당 스레드나 자원을 해제하여 문제를 해결할 수 있습니다 (참고), (참고), (참고), (참고)
  • 만약 크리티컬 섹션에 진입한 객체가 락을 해제하지 않고 destroy되면 어떻게 되는가? 데드락(deadlock) 상태에 빠진다 C++에서는 RAII(Resource Acquisition Is Initialization) 기법을 사용하여 객체가 생성될 때 락을 획득하고, 객체가 파괴될 때 자동으로 락을 해제하는 방법을 사용할 수 있다
  • 동적 할당과 정적 할당의 개념과 둘의 차이점은 무엇인가? 정적 할당(Static Allocation)은 컴파일 시간에 메모리가 할당되며 프로그램 실행 중에는 변경되지 않습니다 동적 할당(Dynamic Allocation)은 프로그램 실행 중에 메모리를 할당하고 해제하는 것입니다 (참고)
  • 리틀 앤디언과 빅 앤디언의 차이는? 빅 앤디언은 빅 엔디안 방식은 낮은 주소에 데이터의 높은 바이트(MSB, Most Significant Bit)부터 저장하는 방식입니다 리틀 엔디안 방식은 낮은 주소에 데이터의 낮은 바이트(LSB, Least Significant Bit)부터 저장하는 방식입니다 (참고)
  • 32bit 운영체제와 64bit 운영체제의 차이는? 32비트와 64비트 운영체제의 가장 큰 차이점은 주소 버스의 크기입니다 32비트 운영체제는 4GB의 주소 공간을 가지며, 한 번에 32비트의 데이터를 처리할 수 있습니다 그러나 64비트 운영체제는 16EB(엑사바이트)의 주소 공간을 가지며, 한 번에 64비트의 데이터를 처리할 수 있습니다 즉, 64비트 운영체제는 더 많은 메모리에 접근할 수 있으며, 더 큰 데이터를 한 번에 처리할 수 있습니다 이로 인해 더 빠르고 효율적인 작업이 가능합니다 (참고)

Chapter 02 기타 면접 질문

02-1 C++ 프로그래밍 언어 ( 중요도 최상 )

  • 빌드 과정이란? 전처리 과정 - 컴파일 과정 - 어셈블리 과정 - 링킹 과정을 묶어서 빌드 과정이라고 한다 (참고)
  • 전처리 과정이란? 전처리기(Preprocessor)를 통해 소스 코드 파일(.c)을 전처리된 소스 코드 파일(.i)로 변환하는 과정이다 (참고)
  • 컴파일 이란 무엇인가? 인간이 이해할 수 있는 언어로 작성된 소스 코드(고수준 언어 : C, C++, Java 등)를 CPU가 이해할 수 있는 언어(저수준 언어 : 기계어)로 번역(변환)하는 작업을 말한다 (참고)
  • 컴파일 과정에 대해 설명하면? 전처리된 소스 코드 파일(.i)을 컴파일러(Compiler)를 통해 어셈블리어 파일(.s)로 변환하는 과정이다 (참고)
  • 어셈블리(Assembly) 과정에 대해서 설명하면? 어셈블리어 파일(.s)을 어셈블러(Assembler)를 통해 오브젝트 파일(.o)로 변환하는 과정이다 (참고)
  • 링킹(Linking) 과정에 대해서 설명하면? 오브젝트 파일(.o)들을 링커(Linker)를 통해 묶어 실행 파일로 만드는 과정이다 (참고)
  • 구조체와 클래스의 차이는? 구조체는 접근 제어 지시자를 따로 선언하지 않으면 모든 변수와 함수가 public으로 선언되고, class의 경우 접근제어 지시자를 따로 선언하지 않으면 모든 변수와 함수가 private로 선언된다 (참고)
  • 객체직렬화(Object Serialization)에 대해 설명하면? 객체의 메모리를 연속적인 바이트로 만들고, 만들어진 연속적인 바이트를 원래의 객체로 복원하는 작업을 말한다 (참고)
  • C++과 C언어의 차이는? C++은 예외처리를 지원하고 C는 예외처리를 지원하지 않는다 또한 C++은 namespace 개념을 사용하지만 C에는 해당 개념이 없다 (참고)
  • volatile 키워드에 대해서 설명하면? volatile 키워드는 해당 변수의 컴파일러 최적화를 제한하는 용도로 사용합니다 (참고) (참고)
  • 언제 malloc을 사용하고 new를 사용해야 하는가? 재할당이 빈번하게 일어나는 경우 realloc이 가능한 malloc을 사용하는 것이 옳다고 할 수 있고, 생성자 호출이 필요하다면 new를 사용하는 것이 옳다할 수 있다 (참고)
  • inline함수는 무엇인가? 인라인이라는 의미는 코드가 라인 안으로 들어간다는 뜻이다 즉, 함수의 내용을 호출을 통해서 실행시키는 것이 아니라, 호출하는 코드 자체가 함수 내용의 코드가 된다 함수 호출없이 삽입된 함수 코드를 그 자리에서 처리하므로 해당 함수를 수행하기 위해 프로그램이 다른 주소로 점프했다가 되돌아올 필요가 없어 속도면에서 유리합니다 (참고)
  • call by value와 call by reference의 차이는? call by value의 경우 데이터 값을 복사해서 함수로 전달하기 때문에 원본 데이터가 변경될 가능성이 없습니다 call by reference의 경우 데이터 주소를 복사해서 함수로 전달하기 때문에 참조한 데이터를 변경시 원본 데이터 값이 변경 됩니다 (참고)
  • auto 키워드에 대해서 설명하면? auto 키워드는 선언된 변수의 초기화 식을 사용하여 해당 형식을 추론하도록 컴파일러에 지시한다, 해당 키워드를 사용할 때의 주의점은 선언만하고 초기화를 하지않으면 사용이 불가능하다 이유는 초기화 식을 기준으로 자료형을 선택하기 때문이다 (참고)
  • 템플릿 메타프로그래밍 이란? 템플릿을 이용하여 컴파일 타임에 코드를 생성하는 것을 말한다 C++ 컴파일이 진행되는 동안에 실행되기 때문에, 기존 작업을 런타임 영역에서 컴파일 타임 영역으로 전환할 수 있다는 것이 장점이다 문법이 비 직관적이고 개발도구의 지원도 아주 미약하다(디버깅 불가능)는 것이 단점이다 (참고), (참고), (참고)
  • 전위 연산과 후위 연산의 차이는? 전위 연산자는 증감된 값을 참조형(l-value)으로 반환하지만 후위 연산자는 값은 증가시키지만 증감 전의 값을 임시객체(r-value)로 만들어서 반환한다 Debug모드에서의 후위연산자는 증감 전의 값을 임시객체로 만들어 리턴하기 때문에 전위연산보다 느리지만 release 모드에서는 컴파일러의 최적화로 둘의 성능은 같다고 한다 (참고), (참고)
  • 오버로딩의 조건에 대해서 설명하면? 함수의 오버로딩이 가능 하려면 매개변수의 타입이나 개수가 달라야 한다 반환형은 함수호출 시, 호출되는 함수를 구분하는 기준이 될 수 없다 (참고)
  • 오버라이딩 개념에서 리턴 타입이 같아야 되나? 다를수 있다 (참고)
  • 두 객체의 데이터형 같은지 어떻게 알수 있는가? RTTI를 지원하는 요소중 typeid 연산자를 활용해 두 객체의 데이터 형이 동일한지 여부를 결정할 수 있습니다 (참고), (참고)
  • 객체지향과 절차지향의 차이는? SW 개발에 있어 절차지향은 실행순서, 절차가 중점이 된다 객체지향은 필요한 객체들의 종류와 속성 등이 중점이 된다 (참고)
  • 소멸자란 무엇인가? 객체를 더이상 사용하지 않을 때 객체를 제거하기 위해 호출되는 함수이다 (참고)
  • 디폴트 생성자란 무엇인가? 생성자가 없는 경우 컴파일러에 의해 자동으로 생성되는 생성자를 디폴트 생성자라고 한다 (참고)
  • 역슬레시n과 endl의 차이는 무엇인가? endl은 출력 버퍼를 비워주는 과정(flush)이 들어가 있어서 역슬레시n보다 느리다 (참고)
  • 입출력 실행속도 높이는 방법은? ios::sync_with_stdio(false); 코드를 추가해 높일수 있다, 이는 C++의 iostream과 stdio와의 동기화를 끄는 기능인데, iostream과 stdio의 버퍼를 모두 사용하면 딜레이가 발생되기 때문에 이를 끊어 실행 속도를 높일수 있는 것이다 (참고)
  • 업캐스팅과 다운 캐스팅의 차이는? 업캐스팅은 클래스 상속구조에서 자식타입에서 부모타입으로의 타입변환을 말하고, 다운캐스팅은 부모타입에서 자식타입으로의 변환을 말합니다 (참고)
  • GetMessage()와 PeekMessage() 차이는? GetMessage 함수는 메시지가 도착 해야지만 리턴되는데 반해(동기, Synchronous), PeekMessage 함수는 메시지 큐에 도착한 메시지가 없어도 리턴한다(비동기, Asynchronous) (참고)
  • 객체 지향의 5대 원칙에 대해 설명하면? (1) 개방폐쇄의 원칙, 요구사항의 변경이나 추가사항이 발생하더라도 기존 구성요소는 수정이 일어나지 말아야하며 쉽게 확장이 가능하며, 재사용할 수 있어야 한다 (2) 인터페이스 분리의 원칙, 꼭 필요한 인터페이스만 상속하자는 의미 (3) 의존성 역전의 원칙, 구체적인 클래스에 의존하지 말고 최대한 추상화한 클래스에 의존하라는 뜻 (4) 리스코브 치환의 원칙, 부모 클래스를 카리키는 포인터에 해당 클래스를 상속하는 자식 클래스를 할당하더라도 모든 기능이 정상적으로 작동해야 하며 자식 클래스의 내부를 부모 클래스는 알 필요가 없다는 뜻 (5) 단일 책임의 원칙, 모든 클래스는 각각 하나의 기능만 가진다는 뜻 (참고)
  • 얕은 복사, 깊은 복사에 대해 설명하면? 얕은 복사는 메모리 자체를 복사하지 않고 주소만 복사한다 깊은 복사는 메모리 자체의 복사본을 만든다 (참고)
  • dynamic_cast가 업, 다운 캐스팅 가능성을 검사하는 원리는? 가상함수 테이블을 이용하여 캐스팅이 가능한 자료인지 검사합니다 (참고)
  • C++ 11의 새로운 점은? auto 키워드가 처음 등장했으며 해당 키워드는 변수의 자료형을 컴파일 시간에 자동으로 추론해줍니다, lvalue, rvalue, 이동생성자 (참고)
  • 객체란 무엇인가? 데이터와 데이터를 처리하는 함수를 묶어 놓은(캡슐화한) 하나의 소프트웨어 모듈입니다 (참고)
  • 상속과 포함을 결정하는데 있어 본인의 기준은 무엇인가? 상속은 is-a 관계가 확실할때 사용하는 것이 좋습니다 포함은 has-a 관계 즉 하나의 객체가 다른 객체를 파트로써 갖는 경우 사용하는 것이 좋습니다 (참고)
  • C++에서 public 상속과 protected 상속의 차이점은? public 상속시 변수를 외부에서 접근하는 것이 가능하고, protected 상속시 상속관계에 있는 클래스만 변수 접근을 허용한다 (참고)
  • 텅 빈 클래스 또는 구조체는 왜 0 사이즈가 아닐까? 클래스 또는 구조체가 사이즈 0이 될 경우 서로 다른 2개의 인스턴스가 같은 주소를 가질 수 있게 되므로, 텅 빈 클래스 또는 구조체라도 최소 1바이트 이상의 크기를 가진다 (참고)
  • 생성자가 호출되기전에 멤버들을 초기화 시킬려면 어떻게 해야 하는가? 이니셜라이저를 활용한다 (참고), (참고)
  • Friend 클래스에 대해 설명하면? 지정한 대상에 한해 해당 객체의 모든 멤버에 접근할 수 있는 권한을 부여해 줍니다 Friend 클래스를 사용하면 자신의 객체뿐만이 아닌 다른 타입의 객체를 접근하는 것이 가능해지기 때문에 코드의 확장이 수월하게 이루어집니다 단 이렇게 프렌드를 사용할 경우 개발자의 입장에서는 개발에 편리하겠지만 캡슐화 파괴의 주범이 되어 설계가 꼬여버리는 경우가 생길 수 있습니다 (참고), (참고)
  • stdcall과 cdecl의 차이를 설명하면? stdcall은 호출된 쪽(Callee)에서 직접 스택을 정리하고 가변 인자 사용이 불가능하다 cdecl은 함수를 호출한 쪽(Caller)에서 스택을 정리하고 가변 인자 사용이 가능하다 (참고)
  • 포인터와 배열의 차이는? 포인터와 배열은 둘다 변수 자체는 메모리 번지를 뜻하지만, 배열은 포인터 상수여서 다른 번지를 가리킬 수 없고, 포인터는 변수이므로 대입이 가능합니다 배열은 상수이므로 증감 연산자를 사용할 수 없고, 포인터 변수는 증감 연산자를 사용할 수 있습니다 (참고), (참고)
  • 함수 객체란? 함수 객체는 함수처럼 객체가 동작한다 하여 함수 객체라고 할 수 있는데, 연산자 오버로딩에서 ()라는 연산자를 오버로딩하여 객체를 함수처럼 쓸 수 있습니다 (참고)
  • 표현식이란 무엇인가? C++의 표현식은 값을 반환하는 모든 문장을 말한다 (참고)
  • 람다식의 장점과 단점은? 장점은 함수를 인라인화 할 수 있다는 것이고 단점은 함수 재사용성이 낮다는 점이다 (참고), (참고)
  • float나 double 자료형을 비교할때 == 연산자를 사용하면 안되는 이유는? float나 double은 값을 도출할 수 있는 수식에 대한 정보를 저장하는 방식인 부동소수점 방식을 사용하기 때문에 범위를 표현할수 있는 연산자를 활용해야 한다 (참고), (참고)
  • 벡터를 직접 클래스로 구현한다면, 값의 이동 복사 비용이 커서 메모리 오버 헤드가 생기는데, 이를 줄일 수 있는 방법은 무엇이 있는가? 이동 생성자를 사용하면, 객체를 복사하는 대신 객체의 소유권을 이전할 수 있습니다 이를 통해 메모리 복사 비용을 줄일 수 있습니다
  • Modern C++ 이란 무엇인가? Modern C++은 C++11 이후의 C++을 말합니다 (참고)

02-2 자료구조, C++ STL ( 중요도 상 )

  • vector와 array의 차이점은? array의 크기는 고정이지만 vector는 동적으로 변하는 점이 vector와 array 자료구조의 가장 큰 차이점이다 (참고)
  • 백터를 at(0)으로 접근 할때와 [0]으로 접근할 때의 차이는? at()은 범위를 체크하여 out_of_range 예외를 발생시킨다 [] 연산자 접근 방식은 범위를 체크하지 않는다 (참고)
  • 백터의 공간이 가득 찼을 때 어떻게 되는가? 현재 할당된 크기의 1.5배로 재할당된다, 벡터 생성시 reserve로 공간을 크게 할당해 놓으면 성능을 향상할 수 있다 (참고)
  • 부스트 라이브러리란? 단위 테스트, 멀티 스레딩, 이미지 처리, 의사 난수 생성, 선형 대수 및 정규 표현식과 같은 여러 작업 및 구조를 지원하는 라이브러리이다 (참고)
  • STL이란 무엇인가? 표준 라이브러리중 하나로 프로그램에 필요한 자료구조와 알고리즘을 템플릿으로 제공합니다 (참고)
  • 이진탐색트리(Binary Search Tree)이란? 다음과 같은 특징을 갖는 이진트리를 말한다 (1) 각 노드에 중복되지 않는 키가 있다 (2) 루트노드의 왼쪽 서브 트리는 해당 노드의 키보다 작은 키를 갖는 노드들로 이루어져 있다 (3) 루트노드의 오른쪽 서브 트리는 해당 노드의 키보다 큰 키를 갖는 노드들로 이루어져 있다 (4) 좌우 서브 트리도 모두 이진 탐색 트리여야 한다 (참고)
  • 스택과 큐의 차이는? 스택은 후입선출로 가장 마지막에 삽입된 자료부터 순서대로 꺼내지는 것이고, 큐는 선입선출로 먼저들어온 순서부터 먼저 꺼내지는 것입니다 (참고)
  • map 자료구조는 어떤 형태로 되어있는가? 레드블랙이진트리의 형태로 되어 있는데, 레드블랙이진트리의 규칙은 다음과 같습니다 (1) 모든 노드는 블랙, 아니면 레드입니다 (2) 루트 노드는 블랙 노드입니다 (3) 리프 노드는 블랙 노드입니다 (4) 레드 노드의 두 자식은 모두 블랙 노드입니다 (5) 루트 노드에서 임의의 한 리프노드까지의 블랙 노드의 갯수는 모두 동일합니다 이러한 규칙을 지키는 이유는 균형잡힌 이진트리를 만들기 위함입니다 (참고), (참고)
  • 정렬 알고리즘에는 어떤 것들이 있는가? 많이 사용되는 알고리즘으로 계수정렬, 선택정렬, 삽입정렬, 퀵정렬이 있다 (참고)
  • 트리에 대해 설명하면? 계층적인 자료를 표현하는데 이용되는 자료구조이다 관련 용어로 루트노드는 부모가 없는 최상위 노드를 뜻하며 리프노드는 자식이 없는 노드를 뜻한다 depth(깊이)는 루트 노드로부터의 거리를 뜻하고 height(높이)는 depth(깊이) 중 최댓값을 뜻한다 (참고)
  • 재귀함수와 반복문의 차이는? 재귀함수는 함수 자체를 재귀적으로 호출하기 때문에 스택 프레임이 쌓여 실행 속도가 느리다 하지만 가독성이 좋다 반복문은 명령을 반복적으로 실행해 실행 속도가 빠르다 하지만 코드 길이가 길어지고 변수가 많아져 가독성이 떨어진다 (참고)
  • 해시테이블(Hash Table)과 이진탐색트리(Binary Search Tree)의 장단점을 설명하면? 이진탐색트리는 딱 필요한 원소 만큼의 공간만을 할당하는 반면, 해시테이블은 데이터가 저장되기 전에 미리 공간을 만들어놔야 하므로 공간 효율성이 떨어집니다 때문에 메모리 측면에서는 이진탐색트리가 유리하다 하지만 이진탐색트리는 노드 기반 자료구조로 메모리 파편화가 진행되어 캐시 적중률이 떨어지게 된다 반면, 해시 테이블은 배열 기반 자료구조로 연속된 메모리를 유지하기 때문에 캐시 적중률이 상당히 높다 그리고 이진탐색트리의 탐색속도는 O(LogN) 이고 해시 테이블은 O(1) 이다 (참고), (참고)
  • STL에서 erase와 remove의 차이점은? erase는 데이터 공간까지 지우기 때문에 capacity가 감소한다 remove는 지워야 할 원소의 뒤에 원소들을 하나씩 앞으로 당겨 덮어 씌움으로써 지워진 것처럼 보이게 하기 때문에 capacity가 그대로이다 (참고)
  • 그래프를 정의한다면? 노드(N, node)와 그 노드를 연결하는 간선(E, edge)으로 이루어진 자료구조 (참고)
  • 전위 순회, 중위 순회, 후위 순회를 각각 설명하면? 전위 순회는 뿌리->왼쪽 자식->오른쪽 자식 순으로 방문한다 중위 순회는 왼쪽자식-> 뿌리-> 오른쪽 자식 순으로 방문한다 후위 순회는 왼쪽자식->오른쪽 자식-> 뿌리 순으로 방문한다 (참고)
  • 해시 테이블에서 버킷과 슬롯에 대해 설명하면? 버킷은 여러개의 슬롯을 저장하는 자료구조이다 슬롯은 한 개의 데이터를 저장할 수 있는 공간이다 (참고)
  • std::sort와 list.sort의 차이에 대해 설명하면? 구현 방식의 차이는 std::sort는 QuickSort 알고리즘을 사용하여 구현되고 list.sort는 MergeSort 알고리즘을 사용하여 구현된다 두 방식 모두 시간복잡도가 N(logN) 이다
  • stable_sort에 대해 설명하면? sort() 기존 순서를 보장하지 않고 stable_sort() 기존 순서를 보장한다 sort()는 퀵 정렬(QuickSort) 방식이며 stable_sort()는 합병 정렬(MergeSort) 방식이다 (참고)
  • 벡터의 크기를 재할당할 때 무엇을 사용해야하는가? vector::resize를 사용해야 한다 (참고)
  • 각종 손코딩 작성 (참고)
  • 이진트리의 장점과 삽입, 삭제 과정을 설명하면?

02-3 알고리즘 ( 중요도 상 )

  • 다익스트라 알고리즘에 대해 설명하면? 특정한 노드에서 출발하여 다른 노드로 가는 최단 경로를 구해주는 알고리즘이다, 동작 원리는 ( 1 ) 출발 노드를 설정한다 -> ( 2 ) 최단 거리 테이블을 초기화한다 -> ( 3 ) 방문하지 않은 노드 중에서 최단 거리가 가장 짧은 노드를 선택한다 -> ( 4 ) 해당 노드를 거쳐 다른 노드로 가는 비용을 계산하여 최단 거리 테이블을 갱신한다 (5) 위 과정에서 3번과 4번을 반복한다 (참고), (참고)
  • DFS와 BFS 알고리즘의 차이는? DFS는 현재 노드에서 갈 수 있는 만큼 최대한 깊게 방문하고, 더이상 방문할 곳이 없으면 이전 노드로 돌아간다 너비우선탐색인 BFS는 같은 레벨의 인접 노드를 모두 방문한뒤 다음 레벨 인접 노드를 방문한다 (참고)
  • BFS와 다익스트라 알고리즘의 차이는? BFS는 간선을 이동하는 비용(가중치)을 고려하지 않고, 다익스트라 알고리즘은 해당 비용(가중치)을 고려한다 (참고)
  • 평소 자주 사용하는 정렬 알고리즘은 무엇인가? STL Sort 함수를 자주 사용하기 때문에, QuickSort 알고리즘을 주로 사용한다고 할 수 있다 (참고)
  • 정렬된 원소를 가지고 있는 배열에서 원하는 원소를 찾는 방법에는 어떤 것이 있는가? 이진탐색(Binary Search)과 파라메트릭서치(Parametric Search)가 있습니다 이진 탐색은 중간값을 선택하여 찾으려는 값과 비교해 찾으려는 값이 더 클 경우 선택했던 중간값을 최솟값으로, 작을 경우 중간값을 최댓값으로 하여 원하는 값을 찾을 때까지 이 과정을 반복하는 알고리즘입니다 파라메트릭서치는 조건을 만족하는 최소/최댓값을 구하는 문제( 최적화 문제 )를 결정 문제 로 변환해 이분탐색을 수행하는 방법입니다 (참고), (참고)
  • 신장트리란(Spanning Tree)? 하나의 그래프가 있을 때 모든 노드를 포함하면서 사이클이 존재하지 않는 부분 그래프를 의미한다 (참고)
  • 크루스칼 알고리즘에 대해 설명하면? 크루스칼 알고리즘은 신장 트리 중에서 최소 비용으로 만들 수 있는 신장트리를 찾는 알고리즘인 최소 신장 트리 알고리즘의 대표적인 예이다 ( 내 블로그 참조 )
  • 프림 알고리즘이란? 무향 연결 그래프가 주어질 때, 최소 신장 트리 라고 부르는 서브 그래프를 찾는 알고리즘입니다 (참고)
  • MST(Minimum Spanning Tree) 대해 설명하면? Spanning Tree 중에서 사용된 간선들의 가중치 합이 최소인 트리 (참고)
  • 벨만 포드 알고리즘과 다익스트라 알고리즘 차이점은? 두 알고리즘의 차이점은 간선의 가중치에 음수가 있느냐(벨만 포드) 없느냐(다익스트라)이다 (참고)
  • 플로이드 워셜 알고리즘에 대해 설명하면? 모든 지점에서 다른 모든 지점까지의 최단 경로를 모두 구해야 하는 경우에 사용할 수 있는 알고리즘이다 ( 내 블로그 참조 )
  • DFS와 백트래킹의 차이는? DFS는 모든 경우의 수를 탐색하고 백트래킹은 불필요한 탐색을 하지 않는다 (참고)
  • 슬라이딩 윈도우 알고리즘과 투 포인터 알고리즘의 차이는? 투 포인터 알고리즘은 부분 배열의 길이가 가변적이지만 슬라이딩 윈도우 알고리즘은 부분 배열의 길이가 고정적입니다 (참고)
  • in-place sorting 알고리즘 이란? 원소들의 개수에 비해서 충분히 무시할 만한 저장 공간만을 더 사용하는 정렬 알고리즘 이다 (참고)

02-4 그래픽스 ( 중요도 상 )

  • AABB, OBB 충돌 판별에 대해 설명하고 코드로 구현하면? AABB는 좌상단 꼭짓점을 min, 우하단 꼭짓점을 max라고 했을 때 한쪽 사각형의 max가 다른 사각형의 min보다 작거나 한쪽 사각형의 min이 다른 사각형의 max보다 크면 두 사각형은 만나지 않는다에 기반을 둔 충돌 판별법이다 OBB는 두 블록을 분리할 수 있는 축이 있으면 두 블록은 만나지 않는다에 기반을 둔 충돌 판별법이다 분리 축이 존재한다면, 어느 직선에 도형을 투영시켰을 때 투영된 구간이 겹치지 않는 경우가 생긴다 (참고), (참고)
  • 행렬 법칙에 대해 설명하면? 행렬은 덧셈의 교환법칙, 덧셈의 결합법칙, 곱셈의 결합법칙이 성립한다 (참고)
  • 소프트웨어 렌더러가 삼각형을 그리는 원리에 대해 설명하면? 스캔 라인 알고리즘으로 그리면 된다 삼각형을 세로로 한 줄씩 나누고 가로 일직선으로 분해한 후 그 선분을 위에서부터 차례대로 그리는 것이다 (참고)
  • DirectX 9과 DirectX 11의 차이점은? 렌더링 파이프라인에서 차이가 있다 DirectX 9은 3D 좌표를 2D로 표현하기 위해 로컬 정점 -> 월드 스페이스 -> 뷰 스페이스 -> 조명 연산 -> 컬링 연산 -> 투영 연산 -> 클리핑 -> 뷰 포트 -> 레스터라이즈 과정을 거친다 DirectX 11은 입력 조립기 - 버텍스 셰이더 - 테셀레이션 - 지오메트리 셰이더 - 레스터라이저 - 픽셀 셰이더 - 출력 병합기 과정을 거친다 (참고)
  • DirectX 에서 w 나누기를 하는 이유는? 투영을 할때 동차좌표 개념을 도입해 각점을 해당 z값으로 나누기 위함이다, 차원의 좌표를 1차원 증가시켜 표현하는 방법을 동차좌표계라고 한다 (참고), (참고)
  • 더블 버퍼링과 스왑 체인에 대해 설명하면? 프레임이 갱신되는 과정에서 스크린에 깜빡거림(Flickering)이 생길 수 있다 이 현상을 방지하기 위해서 전면 버퍼(front buffer)외에 화면 밖(off screen)의 후면 버퍼(back buffer)를 추가적으로 두는데, 이 방식을 이중 버퍼링 이라고 하고 한다 또한 후면 버퍼에 그리기가 완료되면 전면 버퍼와 후면 버퍼를 교환하는데 이때 비디오 컨트롤러는 전면 버퍼 만을 참조해 스크린을 갱신한다 이 방식을 스왑체인 이라고 한다 (참고)
  • 알파블렌딩과 알파테스트의 차이는? 알파블렌딩은 블랜딩 설정에 따라 색상이 혼합되는 것이고, 알파테스트는 설정값을 기준으로 해당되는 범위의 값을 제거 하는 것이다 (참고)
  • 알파소팅에 대해 설명하면? 알파가 없는 오브젝트들은 화면 앞의 오브젝트부터 뒤에 있는 오브젝트 순으로 렌더링하는게 빠르다 이유는 화면 앞의 오브젝트를 렌더링하면 그 뒤에 가려진 오브젝트는 렌더링하지 않아도 되기 때문에 속도가 빨라지는 원리입니다 알파가 있는 반투명,투명 오브젝트는 반대로 뒤에서부터 그려야 합니다 그래야 앞에 반투명 오브젝트를 그리더라도, 먼저 그려진 뒤의 오브젝트가 비춰서 보이기 때문이다 이런 이유 때문에 게임에서는 알파가 없는것들 따로 그리고, 알파가 있는것들을 따로 그린다 이것을 알파 소팅 이라고 한다 (참고)
  • 인덱스 버퍼를 사용하는 이유는? 버텍스 버퍼는 각 폴리곤 마다 정점이 3개씩 존재하기 때문에 큰 도형을 표현할 경우 부하가 발생할 수 있다 이때 인덱스 버퍼를 활용해 특정 포인트 마다 정점을 생성하고, 순서를 지정하면 중복되는 점을 출력하지 않아도 되기에 도형을 표현하는 부하를 줄일 수 있다 참고로 인덱스 순서는 컬링 모드를 사용하기 위해 되도록 시계방향으로 하자 (참고), (참고)
  • 역행렬에 대해 설명하면? 어떤 행렬 A와 곱했을 때 곱셈에 대한 항등원인 단위행렬 E가 나오게 하는 행렬을 행렬 A의 역행렬 이라고 한다 (참고)
  • 컬링과 클리핑의 차이점은 무엇인가? 컬링은 불필요한 객체를 제거하고 클리핑은 보이는 영역을 정의하여 그 안의 객체만을 보여주는 기술입니다 (참고)
  • 프러스텀 컬링의 원리에 대해 설명하면? 절두체 내부에 점이 포함되는지 판단하기 위해서 6개의 평면에 대한 평면의 방정식에 점의 좌표를 대입해서 모든 평면 방정식의 결과값이 양수(+)면 이 점은 절두체 내부에 포함되어 있는 것이다 (참고)
  • 노멀맵이란 무엇인가? 노말정보(Polygon의 Vertex에서 수직으로 뻗어 나오는 벡터가 Normal Vector)를 텍스쳐 이미지 형태의 저장공간에 저장한 것 (참고)
  • 노멀맵은 어떻게 만드는 것인가? 하이폴리곤 모델의 노말정보를 얻기 위해 로우폴리곤 텍셀로부터 하이폴리곤 표면을 향해 반직선을 투영합니다 이 투영을 통해 반직선과 하이폴리곤 모델표면과의 교점을 얻고 그 부분의 노말정보를 얻습니다 이렇게 얻어진 노말 정보를 로우폴리곤 모델의 텍셀에 저장하는 것입니다 이렇게 얻어진 텍스쳐 이미지가 노말 텍스쳐 이미지 입니다 (참고)
  • 탄젠트 스페이스란 무엇인가? 물체의 표면마다 다른 공간(좌표계)이 존재하는 데, 이 공간을 탄젠트 스페이스 라고 한다 이때 세 점으로 평면을 만들고 그 평면의 수직인 법선 벡터를 구할 수 있는데, 이 벡터를 알면 평면이 어떤 식으로 기울어져(기울기) 있는지 알 수 있다 (참고)
  • 법선 벡터란? 면의 앞면으로부터 멀어질 방향을 뜻한다 (참고)
  • 쿼터니언을 사용하여 3차원 공간에서의 회전 변환을 구현하는 방법은? (1) 회전 축(axis)과 회전 각(angle)을 정합니다 (2) 회전 축을 단위 벡터(unit vector)로 정규화합니다 (3) 쿼터니언 q를 다음과 같이 정의합니다 q = ( cos(angle/2), sin(angle/2) * axis_x, sin(angle/2) * axis_y, sin(angle/2) * axis_z ) (4) 회전 변환을 적용할 벡터 v를 4차원 벡터로 변환합니다 v’ = (0, v_x, v_y, v_z) (5) 회전 변환을 적용합니다, v’’ = q * v’ * q^-1 (6) 변환된 벡터 v’‘를 다시 3차원 벡터로 변환합니다, v’’’ = (v’‘_x, v’‘_y, v’‘_z) (참고), (참고)
  • 삼각함수(Sin, Cos, Tan)의 개념과 그래프를 그려보면? 삼각함수란 각의 크기를 삼각비로 나타내는 함수이다 (참고)
  • 아핀변환 이란 무엇인가? 아핀 변환은 점과 직선 그리고 평행성을 보존하며 회전, 확대, 축소와 같은 선형 변환과 이동 변환을 합쳐 놓은 것이다 (참고), (참고)
  • DrawCall이란 무엇인가? CPU는 현재 프레임에 어떤 것을 그려야 할지 정하고, GPU에 오브젝트를 그리라고 명령을 호출하는데 이 명령이 바로 드로우 콜(Draw Call)이다 (참고)
  • 쿼터니언을 증명하면?
  • 직선의 방정식을 구하는 방법은 무엇인가?
  • 두 정점간의 거리를 구하는 방법을 무엇인가?
  • 두 직선의 교차점을 구하는 방법은 무엇인가?
  • 평면과 선 충돌하는 방법은 무엇인가?
  • 원 충돌 하는 방법은 무엇인가?
  • 노멀맵 적용 시 어떤 계산을 하는가?
  • 램버트, 퐁 쉐이딩이란 무엇인가?

02-5 운영체제 ( 중요도 중 )

  • 라운드 로빈 알고리즘에 대해서 설명하면? 라운드 로빈(RR) 스케쥴링 알고리즘은 시간 할당량 또는 타임슬라이스 라고 하는 작은 단위의 시간을 정의하고 CPU 스케쥴러는 준비 큐를 돌면서 한 번에 한 프로세스에 정의된 시간 할당량 동안 CPU를 할당한다 (참고)
  • PCB에 대해서 설명하면? 운영체제에서 프로세스에 대한 메타데이터(대량의 정보 가운데에서 확인하고자 하는 정보를 효율적으로 검색하기 위해 원시데이터)를 저장한‘데이터’를 말하며 프로세스 스케줄링 상태, 프로세스 ID 등의 정보로 이루어져 있다 ( 내 블로그 참고 )
  • 스레드 프로그래밍에서 중요한건? 스레드 마다 별도로 주어지는 공간(스택), 모든 스레드가 공유하는 공간(힙, 데이터 영역)에 대해 파악하고 코드를 작성해야 한다 (참고)
  • 멀티 프로세스로 처리 가능한걸 굳이 멀티 스레드로 하는 이유는? 멀티 프로세스 방식에서는 각 프로세스마다 독립적인 메모리 공간과 자원을 할당해야 합니다 이는 프로세스 간의 전환에 많은 시간이 소비되는 단점을 가지고 있습니다 또한 프로세스 간의 통신(IPC)보다 스레드 간의 통신 비용이 적다, 대신 동기화에 신경을 써야한다 (참고)
  • 메모리 할당 알고리즘 3가지는? First fit은 메모리의 처음부터 검사해서 크기가 충분한 첫 번째 메모리에 할당, Next fit은 마지막으로 참조한 메모리 공간에서부터 탐색을 시작해 공간을 찾아 할당, Best fit은 모든 메모리 공간을 검사해서 내부 단편화를 최소화하는 공간에 할당 (참고)
  • 페이지 폴트 발생시 사용하는 알고리즘과 해당 알고리즘에 대해 설명하면? 페이지 교체 알고리즘을 사용하며, OPT는 앞으로 가장 오랫동안 사용하지 않을 페이지를 교체 ( 실현 가능성 없음 ), FIFO는 메모리가 할당된 순서대로 페이지를 교체, LRU는 가장 오랫동안 사용되지 않은 페이지 교체, LFU는 사용 빈도가 가장 적은 페이지를 교체, NUR은 최근에 사용하지 않은 페이지를 교체 (참고)
  • 사용자 수준 스레드의 정의와 장단점을 설명하면? 사용자 스레드는 커널 영역의 상위에서 지원되며 일반적으로 사용자 레벨의 라이브러리를 통해 구현된다 라이브러리는 스레드의 생성 및 스케줄링 등에 관한 관리 기능을 제공한다 장점은 스케줄링과 동기화를 위해 System Call(커널 호출) 하지 않기 때문에 오버헤드 적다는 것이고(Context Switching을 프로세스 내부에서 진행하면 됨) 단점은 하나의 스레드가 System Call(커널 호출)하면 해당 프로세스 내 모든 스레드가 중단된다는 것이다 (참고)
  • 커널 수준 스레드의 정의와 장단점을 설명하면? 커널 스레드는 운영체제가 지원하는 스레드 기능으로 구현되며 커널이 스레드의 생성 및 스케줄링 등을 관리한다 장점은 동작중인 스레드가 System Call(커널 호출) 해도 해당 프로세스 내 다른 스레드가 계속 실행될 수 있다는 것이고, 단점은 스케쥴링과 동기화를 위해 System Call(커널 호출)하는 것이 오래 걸린다는 것이다 (참고)
  • 좀비 프로세스에 대해서 설명하면? 실행이 종료되었지만 아직 삭제되지 않은 프로세스를 말한다 (참고)
  • 고아 프로세스에 대해서 설명하면? 부모프로세스가 필요에 의해서 먼저 종료 되기도 하는데, 이때 자식프로세스만 남게 되는경우 이 자식프로세스를 고아프로세스라고 한다 (참고)
  • 데몬 프로세스에 대해서 설명하면? 백그라운드에서 사용자 모르게 동작하는 프로세스를 말한다 (참고)
  • 싱글스레드와 멀티스레드의 효율성을 비교하면? 단일 작업을 처리하는 경우 싱글스레드가 효율적일 수 있으며, 여러 작업을 동시에 처리하고 병렬성을 활용해야 하는 경우에는 멀티스레드가 효율적일 수 있습니다 (참고)
  • 힙영역에 대해 설명하면? 힙영역은 사용자에 의해 메모리 공간이 동적으로 할당되고 해제되는 영역입니다 (참고)
  • 스택영역에 대해 설명하면? 스택영역은 함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는 영역입니다 (참고)
  • data영역과 bss영역을 구분하는 이유는? 초기화되지 않은 변수는 프로그램이 실행될 때 영역만 잡아주면 되고 그 값을 프로그램에 저장하고 있을 필요는 없으나(bss 영역) 초기화가 되는 변수는 그 값도 프로그램에 저장하고 있어야 하기 때문이다(data 영역) (참고)
  • 유저모드 동기화 커널모드 동기화에 대해서 설명하면? 유저모드 동기화란 커널의 힘을 빌리지 않는(커널 코드가 실행되지 않는) 동기화 기법 이며 크리티컬 섹션 기반 동기화와 인터락 함수 기반 동기화가 있다 커널 모드 동기화는 커널에서 제공하는 동기화 기능을 활용하는 방법이며 뮤텍스 기반의 동기화, 세마포어 기반의 동기화가 있다 (참고)
  • C/C++ free/delete 없이 프로그램을 종료한다면? 현대의 Operating System은 Process 종료 시 Process가 사용중인 메모리를 모두 자동으로 반환 시킨다 (참고)
  • CPU와 GPU의 차이는? 기존의 CPU가 순차적인 처리 방식에 특화되어 있었다면, GPU는 병렬적인(Parallel) 처리 방식에 특화되어 있으며 이로 인해 반복적이고 비슷한 대량의 연산을 수행하는 데에 있어서 속도가 빠릅니다 GPU는 작은 여러개의 코어로 구성된 프로세서입니다 여러 개의 코어가 함께 작동하므로, 여러 코어로 나누어 처리할 수 있는 작업의 경우 GPU가 엄청난 성능 이점을 제공합니다 기존의 CPU가 6-8개의 코어로 구성되어 있다면, GPU는 어떤 GPU인가에 따라 많이 상이하지만 적게는 수백개에서 많게는 수천개의 코어로 구성되어 있습니다 (참고), (참고)
  • System Memory, Video Memory, AGP Memory에 대해서 설명하면? 시스템 메모리 (System Memory)는 컴퓨터의 주 기억장치로서, CPU와 다른 하드웨어 장치들이 데이터를 주고받을 수 있는 공간을 제공합니다 비디오 메모리 (Video Memory)는 그래픽 처리 장치(GPU)에 의해 사용되는 메모리로서, 화면에 그려지는 이미지나 영상을 저장하는 데 사용됩니다 AGP 메모리 (AGP Memory)는 Accelerated Graphics Port(가속 그래픽스 포트)라는 그래픽 카드 인터페이스에서 사용되는 메모리로서, 그래픽 카드에 대한 전용 메모리입니다 AGP 메모리는 비디오 메모리와 유사한 역할을 하지만, 그래픽 카드가 CPU와 직접 데이터를 주고 받을 수 있도록 지원하여 그래픽 성능을 향상시킵니다
  • 콜 스택이란 무엇인가? 현재 실행 중인 함수에 관한 정보를 저장하는 스택 자료구조이다 (참고)
  • 메모리 누수가 발생하면 어떻게 되는가? 프로그램이 작동하며 할당됐던 메모리가 더 이상 사용되지 않는 시점에서도 반환되지 않는 현상입니다 정상적으로 반환되지 않은 메모리가 계속 누적되면 프로그램에 할당할 수 있는 메모리가 부족해지면서 프로그램이 비정상적으로 작동하거나 크래시가 발생할 수 있습니다 (참고)
  • 프로파일러란 무엇인가?

02-6 네트워크 ( 중요도 중 )

  • TCP/IP 소켓 프로그래밍이란 무엇인가? IP 프로토콜을 기반으로 TCP 송수신 방식을 사용하는 네트워크 프로그래밍이다 (참고)
  • TCP, UDP에 대해 설명하면? TCP는 1:1 연결을 지향하며 신뢰할 수 있는 통신을 제공한다, 여기서 1:1은 각각 클라이언트와 서버를 의미한다, 양 단에 연결을 수립한 뒤 데이터를 전송한다 UDP는 1:1 혹은 1:N 비연결을 지향하며 신뢰할 수 없는 통신을 제공한다, 여기서 ‘비연결’ 이라는 말은 말 그대로 서버와 클라이언트가 연결되어 있지 않다는 뜻이다, TCP 와 달리 연결 설정 과정이 필요 없고 단지 소켓의 생성과 데이터 송수신 과정만 존재한다 (참고)
  • TCP와 UDP의 차이에 대해 설명하면? TCP는 전송 순서를 보장하며 가상 회선 방식을 사용하고 연결형 서비스이며 1:1 통신만 가능하다 UDP는 전송 순서를 보장하지 않으며 데이터그램 방식을 사용하고 비 연결형 서비스이며 N:N 통신이 가능하다 (참고)
  • TCP의 Nagle 알고리즘에 대해 설명하면? 네트워크 전송 횟수는 줄이고 작은 데이터를 여러번 전송하기보단 데이터를 묶어서 한 번에 보내는 방식을 사용한다 (참고)
  • 3-way handshake 과정에서 통신이 안되면 어떤일이 벌어질지 설명하면? 타임아웃(Timeout)이 발생하고, 해당 연결은 실패한 것으로 처리한다 (참고)
  • 4-way handshake(종료과정)을 설명하면? (1) 먼저 통신을 종료하고자 하는 클라이언트는 서버에게 FIN 플래그를 세팅한 패킷을 보내고 자신은 FIN_WAIT_1 상태가 된다 (2) FIN 을 수신한 서버는 ACK를 클라이언트에게 전송하고 소켓의 상태를 CLOSE_WAIT로 변경한다 (3) ACK를 수신한 클라이언트는 서버가 FIN을 잘 받았다고 판단하고 FIN_WAIT_2로 소켓의 상태를 변경한 뒤 다시 FIN 패킷을 기다린다 (4) 잠시뒤 서버는 FIN 패킷을 클라이언트로 전송하고 소켓을 LAST_ACK 상태로 변경한다 (5) FIN을 수신한 클라이언트는 서버에게 ACK를 전송한 뒤 소켓의 상태를 TIME_WAIT 상태로 변경한다 (6) 클라이언트로부터 마지막 ACK를 수신한 서버는 소켓을 CLOSED 한다 (참고)
  • checksum에 대해 설명하면? 네트워크를 통해 전달된 값이 변경되었는지를 검사하는 값으로 무결성을 제공한다 TCP는 checksum이 필수이고 udp는 선택이다 (참고), (참고)
  • TCP/IP란 무엇인가? TCP/IP(Transmission Control Protocol/Internet Protocol)는 데이터가 의도된 목적지에 도착할 수 있도록 보장해주는 통신 규약입니다 (참고)
  • TCP Flag 종류에 대해 설명하면? SYN(연결 요청 플래그) ACK(응답 플래그) FIN(연결 종료 플래그) 등이 있다 (참고)
  • OSI 7계층을 왜 나눴는지 설명하면? 통신이 일어나는 과정을 단계 별로 파악할 수 있기 때문이다 사람들이 이해하기 쉽고, 흐름을 한 눈에 알아보기 쉽고, 7단계 중 특정한 곳에 이상이 생기면 해당 단계만 고칠 수 있다 (참고)
  • http와 https의 차이에 대해 설명하면? HTTP는 암호화가 추가되지 않았기 때문에 보안에 취약한 반면, HTTPS는 암호화가 추가되기 때문에 안전하게 데이터를 주고받을 수 있다 하지만 HTTPS를 이용하면 암호화/복호화의 과정이 필요하기 때문에 HTTP보다 속도가 느리다 (참고)
  • OSI 7계층에 대해 설명하면? 1계층 - 물리계층(Physical Layer), 전기적 신호가 인터넷 케이블, 라우터, 스위치 등의 물리적인 장치에 의해 전달되는 계층이다 2계층 - 데이터 링크계층(DataLink Layer), 물리계층을 통해 송수신되는 정보의 오류와 흐름을 관리하여 안전한 정보의 전달을 수행할 수 있도록 도와주는 역할을 한다 3계층 - 네트워크 계층(Network Layer), 경로를 선택하고 주소를 정하고 경로에 따라 패킷을 전달해주는 것이 이 계층의 주 역할이다 4계층 - 전송 계층(Transport Layer), 이 계층은 통신을 활성화하기 위한 계층이며 보통 TCP 프로토콜을 이용하며, 포트를 열어서 응용프로그램들이 전송을 할 수 있게 한다 5계층 - 세션 계층(Session Layer), 양 끝단의 응용 프로세스가 통신을 관리하는 방법을 제공하는 계층이다 6계층 - 표현 계층(Presentation Layer), 코드 간 번역을 담당하는 계층이다 7계층 - 응용 계층(Application Layer), 응용 프로세스와 직접 관계하여 일반적인 응용 서비스를 수행하는 계층이다 (참고)
  • 3-way handshake 과정에 대해 설명하면? (1) 클라이언트는 서버와 커넥션을 연결하기 위해 SYN을 보낸다 (2) 서버가 SYN을 받고, 클라이언트로 받았다는 신호인 ACK와 SYN 패킷을 보냄 (3) 클라이언트는 서버의 응답인 ACK와 SYN 패킷을 받고, ACK를 서버로 보냄 (참고)
  • HTTP 프로토콜이란? 서버/클라이언트 모델을 따라 데이터를 주고 받기 위한 프로토콜입니다 (참고)
  • 스위치와 라우터의 차이는? 스위치는 데이터 링크 계층에, 라우터는 네트워크 계층에 속한다 그래서 스위치는 MAC 주소를 기반으로 작동하고, 라우터는 IP주소를 기반으로 작동한다 ( 내 블로그 참고 )
  • DNS란? 국제적 단위로 웹사이트의 IP 주소와 도메인 주소를 이어주는 환경/시스템이다 (참고)
  • LAN이란? Local Area Network의 줄인 말로 근거리 통신망입니다 (참고)
  • WAN이란? Wide Area Network의 줄인 말로 LAN보다 범위가 넓은 광대역 통신망입니다 (참고)
  • 4-way handshake(종료과정)에서 TIME_WAIT 과정이 필요한 이유는? 클라이언트의 마지막 ACK가 유실되었을 경우 서버는 FIN을 다시 보내게 된다 이를 받기 위해 잠시동안 해당 소켓의 주소를 다른 소켓에게 할당하는 것을 막기 위함이다 (참고), (참고)
  • 가상회선 방식과 데이터그램 방식의 차이는? 데이터그램 방식은 패킷마다 라우터가 경로를 선택하지만, 가상회선 방식은 경로를 설정할 때 한 번만 수행한다 (참고)

02-7 언리얼 엔진 ( 중요도 중 )

  • Object에 대해 설명하면? Object 클래스는 모든 UE 객체의 기본 클래스이다 (참고)
  • Actor에 대해 설명하면? 레벨에 배치할 수 있는 오브젝트를 말한다 이동, 회전, 스케일과 같은 3D 트랜스폼을 지원한다 (참고)
  • Pawn에 대해 설명하면? Pawn은 플레이어 컨트롤러 또는 AI 컨트롤러에게 조정당하는 Actor이다 (참고)
  • Character에 대해 설명하면? 인간형 Pawn으로 character movement component를 가지고 있다 이를 통해 기본적인 인간형 동작을 할 수 있다 (참고)
  • Controller에 대해 설명하면? Pawn 에 대한 지시를 담당하는 Actor 입니다 두 가지 형태가 있는데, AIController 와 PlayerController 입니다 컨트롤러는 Pawn에 possess(빙의)되어 그 폰을 제어할 수 있습니다 (참고), (참고)
  • 리플렉션 개념에 대해 설명하면? 언리얼에는 자체적으로 C++ 클래스, 구조체, 함수, 멤버 변수, 열거형 관련 정보를 수집, 질의, 조작하는 별도의 시스템이 구축되어 있습니다 전형적으로 이러한 리플렉션은 프로퍼티 시스템 이라고 부릅니다 (참고)
  • 언리얼엔진의 리플렉션 시스템 동작 원리에 대해 설명하면? UBT(Unreal Build Tool)이 리플렉션 키워드를 탐색한뒤, UHT(Unreal Header Tool)이 해당 .cpp를 파싱해 리플렉션 데이터를 수집한다 수집된 데이터는 별개의 C++ 코드(generated.h / .cpp)로 저장됩니다 이후 빌드 시 기존 코드에 생성된 C++ 코드(generated.h)를 추가해 컴파일 합니다 (참고)
  • 델리게이트란 무엇인가? 함수를 바인딩하는 형태로 등록시켜 CallBack함수와 같이 활용 할 수 있는 기능입니다 (참고)
  • 언리얼 리플리케이션 개념에 대해 설명하면? 호스트 컴퓨터가 가진 데이터를 다른 컴퓨터로 복사하는 것으로 캐릭터간의 이동 동기화, HP 동기화가 등이 이에 해당한다 (참고)
  • 언리얼 Garbage Collection 시스템에 대해 설명하면? 언리얼 엔진에서는 참조(Reference) 그래프를 만들어 어느 오브젝트가 사용중이고 어느 것이 사용중이지 않은지 확인한다 루트에는 Root set이 있으며 UObject가 아래에 추가된다 가비지 컬렉션이 발생하면 엔진은 Root set부터 시작해서 트리를 검색한다 여기서 찾지 못한 오브젝트는 참조되지 않는 오브젝트이므로 제거한다 이러한 방식을 Mark-Sweep 방식의 가비지 컬렉션이라고 부른다 참고로 언리얼 엔진은 Mark-Sweep GC로 관리되는 UObject류 객체와 TSharedPtr, TWeakPtr등을 사용하는 일반 C++객체로 분류되어 있다 (참고)
  • 언리얼엔진 플러그인 이란? 에디터 안에서 프로젝트 단위로 개발자가 쉽게 켜고 끌 수 있는 코드 및 데이터 모음입니다 (참고)
  • 언리얼의 강한 참조와 약한 잠조에 대해 설명하면? 강한 참조는 메모리 회수를 위한 카운팅을 하는 참조이고 약한 참조는 메모리 회수를 위한 카운팅을 하지않는 참조이다 (참고)
  • 게임 모드와 게임 스테이트에 대해 설명하면? 게임모드는 게임에 필요한 규칙을 정의하는 클래스이고 게임 스테이트는 클라이언트가 게임의 상태를 모니터링할 수 있도록 도와주는 클래스이다 (참고)
  • 플러그인 컴파일 타임은? 게임 프로젝트 컴파일 타임에 언리얼 빌드 툴에서 자동으로 컴파일 된다 (참고)
  • 언리얼 엔진이 플러그인을 찾는 방법은? 플러그인 폴더 아래의 서브 폴더들을 보며 uplugin 파일을 검색해 플러그인을 찾아낸다 (참고)
  • CDO 개념에 대해 설명하면? 클래스 기본 객체 (참고), (참고)
  • 언리얼 컴포넌트별 특징을 설명하면? UActorComponent는 기본 컴포넌트 USceneComponent는 변환(위치, 회전, 스케일) 정보를 가진 컴포넌트 UPrimitiveComponent는 렌더링 또는 충돌 기능을 가진 컴포넌트 (참고)

02-8 디자인 패턴 ( 중요도 하 )

  • 디자인 패턴이란? 자주 사용하는 설계 형태를 정형화해서 형식을 만들어 두는 것 입니다 (참고)
  • 전략 패턴에 대해 설명하면? 여러 알고리즘을 하나의 추상적인 접근점(인터페이스)을 만들어 접근점에서 알고리즘이 서로 교환 가능하도록 하는 패턴이다 요구사항이 변경되었을 때 기존의 코드를 변경하지 않아도 된다는 것이 전략패턴의 장점이다 클래스가 많이 늘어날 수 있다는 것이 단점이다 (참고)
  • 어댑터 패턴에 대해 설명하면? 클래스의 인터페이스를 사용자가 기대하는 다른 인터페이스로 변환하는 패턴이다 새로운 기능의 추가가 편리한 것이 장점이다 다른 구성요소에 대한 메소드 호출을 처리하기 위해 Wrapper 클래스를 더 만들어야 할 수도 있다는 것이 단점이다 (참고), (참고)
  • 싱글톤 패턴에 대해 설명하면? 오직 한 개의 클래스 인스턴스만 갖도록 보장할 수 있고 전역 접근점을 제공하는 패턴이다 한번도 사용하지 않는다면 인스턴스를 생성하지 않는다는 것이 장점이다 커플링을 조장할 수 있다는 것이 단점이다 (참고)
  • 프로토 타입 패턴에 대해 설명하면? 원형이 되는 인스턴스로 새로운 인스턴스를 만드는 패턴이다 프로토타입이 미리 정의되어 있기 때문에 중복되는 초기화 코드를 제거할 수 있는 것이 장점이다 순환 참조가 있는 객체를 복제하는 것은 매우 까다로울 수 있다는 것이 단점이다 (참고)
  • 추상 팩토리 패턴에 대해 설명하면? 관련성 있는 여러 종류의 객체를 일관된 방식으로 생성할 수 있도록 하는 패턴이다 구체적인 구현 클래스를 분리할 수 있는 것이 장점이다 새로운 분류를 추가하기 어려운 것이 단점이다 (참고)
  • 방문자 패턴에 대해 설명하면? 로직과 데이터구조를 분리하는 패턴이다 로직과 데이터구조가 분리되어, 데이터의 독립성을 높여주는 것이 장점이다 두 객체(방문자와 방문 공간)의 결합도가 높아지는 것이 단점이다 (참고)
  • 중재자 패턴에 대해 설명하면? 클래스간의 복잡한 로직(상호작용)을 캡슐화하여 하나의 클래스에 위임해 처리하는 패턴이다 객체간의 통신을 위해 서로간에 직접 참조할 필요가 없는 것이 장점이다 중재자 객체에 권한이 집중화되어 굉장히 크고 복잡해지는 것이 단점이다 (참고)
  • 스테이트 패턴에 대해 설명하면? 객체 내부의 상태가 바뀜에 따라 객체의 행동을 바꿀 수 있는 패턴이다 메서드 상의 긴 분기문들을 제거할 수 있는것이 장점이다 클래스 갯수가 많아져서 유지보수가 힘들어질 가능성이 존재하는 것이 단점이다 (참고)
  • 컴포넌트 패턴에 대해 설명하면? 한 객체가 여러 분야를 서로 커플링(결합도) 없이 다룰 수 있게 하는 패턴이다 컴포넌트끼리 서로 디커플링 상태를 유지한다는 것이 장점이다 한 무리의 객체를 생성하고 초기화하고 알맞게 묶어줘야 하나의 객체라는 개념을 만들 수 있기 때문에 코드가 복잡해 질 수 있다는 것이 단점이다 (참고), (참고)

02-9 데이터 베이스 ( 중요도 하 )

  • JOIN의 정의에 대해 설명하면? 두 개 이상의 테이블을 묶어서 하나의 결과물을 만드는 것을 말한다 (참고)
  • JOIN의 종류에 대해 설명하면? Inner join은 왼쪽 테이블과 오른쪽 테이블의 두 행이 모두 일치하는 행이 있는 부분만 표기한다, Left outer join은 왼쪽 테이블의 모든 행이 결과 테이블에 표기된다, Right outer join은 오른쪽 테이블의 모든 행이 결과 테이블에 표기된다, Full outer join은 양쪽 테이블에 공통적으로 존재하는 데이터와 한쪽 테이블에만 존재하는 데이터도 모두 결과 테이블에 표기된다 (참고)
  • DB Index의 정의와 사용하는 이유를 설명하면? 인덱스는 데이터베이스 테이블에 대한 검색 성능의 속도를 높여주는 자료구조이다 (참고)
  • DB Index의 자료구조중 B-Tree 구조를 설명하면? Root(기준) / Branch(중간) / Leaf(말단) Node로 구성되며 균형잡힌 트리이다 (참고)
  • 클러스터링 인덱스에 대해 설명하면? 연속된 키 값의 레코드를 묶어서 같은 블록에 저장하는 방법이다 (참고), (참고), (참고)
  • 넌클러스터링 인덱스에 대해 설명하면? 인덱스의 리프노드에 실제 데이터 값이 아닌 테이블상의 데이터 위치를 지정하는 포인터를 저장한다 (참고)
  • 클러스터링 인덱스와 넌클러스터링 인덱스의 차이점는? 클러스터드 인덱스는 물리적으로 행을 재배열하고, 넌클러스터드 인덱스는 물리적으로 행을 재배열 하지 않는다 (참고)
  • DB collision에 대해 설명하고 해결방법을 제시하면? Collision(충돌 현상)은 서로 다른 두 개 이상의 레코드가 같은 주소를 갖는 현상이다 해결법에는 개방 주소법(Open Addressing)이 있다 (참고)
  • DB Isolation에 대해 설명하면? 각각의 트랜잭션은 서로 간섭없이 독립적으로 수행되어야 한다 (참고)
  • Nosql과 RDBMS의 차이는? RDBMS는 정해진 스키마에 따라 데이터를 저장하여야 하므로 명확한 데이터 구조를 보장한다 NoSQL은 스키마가 없기 때문에 유연하며 자유로운 데이터 구조를 가질 수 있다 (참고)
  • 정규화 개념과 각 단계를 설명하면? 관계형 데이터베이스에서 중복을 최소화하게 데이터를 구조화하는 프로세스를 정규화(Normalization)라고 한다 제1 정규화란 테이블의 컬럼이 원자값(Atomic Value, 하나의 값)을 갖도록 테이블을 분해하는 것이다 제2 정규화란 제1 정규화를 진행한 테이블에 에서 기본키가 아닌 모든 속성이 기본키에 완전 함수 종속을 만족하도록 테이블을 분해하는 것이다 제3 정규화란 제2 정규화를 진행한 테이블에 대해 이행적 종속을 없애도록 테이블을 분해하는 것이다 BCNF 정규화란 제3 정규화를 진행한 테이블에 대해 모든 결정자가 후보키가 되도록 테이블을 분해하는 것이다 (참고)
  • 비관적 락과 낙관적 락에 대해 설명하면? 비관적 락은 자원 요청에 따른 동시성문제가 발생할것이라고 예상하고 락을 걸어버리는 방법론입니다 낙관적 락은 자원에 락을 걸어서 선점하지말고, 동시성 문제가 발생하면 그때 가서 처리 하자는 방법론입니다 (참고)
  • 데이터베이스를 사용하는 이유? 데이터를 파일 단위로 저장하면 데이터 무결성 문제, 종속성 문제, 중복성 문제 등이 존재하기 때문에 데이터베이스로 관리하기 시작했다 (참고)
  • 데이터베이스 처리능력의 정의와 계산하는 방법을 설명하면? 처리 능력은 해당 작업을 수행하기 위해서 소요되는 시간이다 계산 방법은 트랜잭션 수 / 시간 (참고)
  • DB Index에 적합한 자료구조는? 해시 테이블, B-Tree, B+Tree (참고)
  • 기본 인덱스(primary index)와 보조 인덱스(secondary index)의 차이점은? 기본 인덱스는 데이터 블록 안의 행들의 조직에 영향을 미친다 보조 인덱스는 데이터 블록에서 실제로 조직화된 행들에 전혀 영향을 미치지 않는다 (참고)
  • Composite index란? 인덱스를 생성할 때 두 개 이상의 컬럼(속성)을 합쳐서 인덱스를 만드는 것을 말합니다 (참고)
  • Index 의 성능과 고려해야할 사항은? 데이터의 형식에 따라 인덱스를 만들면 효율적이고 만들면 비효율적은 데이터의 형식이 존재한다 (참고)
  • 정규화는 어떤 배경에서 생겨났는가? 한 릴레이션(테이블)에 여러 엔티티의 애트리뷰트들을 혼합하게 되면 정보가 중복 저장되며, 저장 공간을 낭비하게 된다 또 중복된 정보로 인해 갱신 이상이 발생하게 된다 동일한 정보를 한 릴레이션에는 변경하고, 나머지 릴레이션에서는 변경하지 않은 경우 어느 것이 정확한지 알 수 없게 되는 것이다 이러한 문제를 해결하기 위해 정규화 과정을 거치는 것이다 (참고)
  • 정규화란 무엇인가? 관계형 데이터베이스에서 중복을 최소화하기 위해 데이터를 구조화하는 작업이다 (참고)
  • 정규화의 장점과 단점은? 장점은 데이터베이스 변경 시 이상 현상(Anomaly)을 제거한다 단점은 릴레이션(테이블)의 분해로 인해 릴레이션(테이블) 간의 연산(JOIN 연산)이 많아진다 (참고)
  • 트랜잭션(Transaction)이란 무엇인가? 데이터베이스에서 하나의 논리적 기능을 수행하기 위한 작업의 단위를 말한다 (참고)
  • 트랜잭션과 Lock의 차이는? Lock은 동시성을 제어하기 위한 기능이고 트랜잭션은 데이터의 정합성을 보장하기 위한 기능이다 (참고)
  • 트랜잭션의 특성은? 원자성, 고립성, 지속성, 일관성을 만족 해야한다 (참고)
  • 트랜잭션을 사용할 때 주의할 점은? 트랜잭션은 꼭 필요한 최소의 코드에만 적용하는 것이 좋다 즉 트랜잭션의 범위를 최소화하라는 의미다 (참고), (참고)
  • 교착상태란 무엇인가? 복수의 트랜잭션을 사용하다보면 교착상태가 일어날수 있다 교착상태란 두 개 이상의 트랜잭션이 특정 자원(테이블 또는 행)의 잠금(Lock)을 획득한 채 다른 트랜잭션이 소유하고 있는 잠금(Lock)을 요구하면 아무리 기다려도 상황이 바뀌지 않는 상태가 되는데, 이를 교착상태라고 한다 (참고)
  • 쿼리문 실행 단계를 설명하면? (1) 쿼리 문장 분석 (2) 컴파일 (3) 실행 (참고)
  • Statement와 PreparedStatement 중에 어느 것이 더 좋은가? Statement를 사용하면 매번 쿼리 실행 단계를 거치게 되고, PreparedStatement는 처음 한 번만 쿼리 실행 단계를 거친 후 캐시에 담아 재사용을 한다 만약 동일한 쿼리를 반복적으로 수행된다면 PreparedStatment가 DB에 훨씬 적은 부하를 주며, 성능도 좋다 (참고)
  • NoSQL의 정의는? 관계형 데이터 모델을 지양 하며 대량의 분산된 데이터를 저장하고 조회하는 데 특화되었으며 스키마 없이 사용 가능하거나 느슨한 스키마를 제공하는 저장소를 말한다 (참고)
  • CAP 이론이란? Network로 연결된 분산된 데이터베이스 시스템은 일관성(Consistency), 가용성(Availability), 분할 허용성(Partition Tolerance)의 3가지 특성중 2가지 특성만을 충족 할수 있고 3가지 모두 충족할 수 없다는 이론입니다 (참고)
  • CAP 이론에서 일관성 이란? 다중 클라이언트에서 같은 시간에 조회하는 데이터는 항상 동일한 데이터임을 보증하는 것을 의미한다 (참고)
  • CAP 이론에서 가용성 이란? 모든 클라이언트의 읽기와 쓰기 요청에 대하여 항상 응답이 가능해야 함을 보증하는 것이다 (참고)
  • CAP 이론에서 분할 허용성 이란? 지역적으로 분할된 네트워크 환경에서 동작하는 시스템에서 두 지역 간의 네트워크가 단절되거나 네트워크 데이터의 유실이 일어나더라도 각 지역 내의 시스템은 정상적으로 동작해야 함을 의미한다 (참고)
  • 저장 방식에 따른 NoSQL 분류중 Key-Value Model에 대해 설명하면? 가장 기본적인 형태의 NoSQL 이며 키 하나로 데이터 하나를 저장하고 조회할 수 있는 단일 키-값 구조를 갖는다 (참고)
  • 저장 방식에 따른 NoSQL 분류중 Document Model에 대해 설명하면? 키-값 모델을 개념적으로 확장한 구조로 하나의 키에 하나의 구조화된 문서를 저장하고 조회한다 (참고)
  • 저장 방식에 따른 NoSQL 분류중 Column Model에 대해 설명하면? 하나의 키에 여러 개의 컬럼 이름과 컬럼 값의 쌍으로 이루어진 데이터를 저장하고 조회한다 (참고)

02-10 HLSL ( 중요도 하 )

  • 셰이더가 뭔가요? 셰이더란 화면에 출력할 픽셀의 위치와 색상을 계산하는 함수 ( P.21 )
  • 3D 파이프라인이 존재하는 이유는 무엇일까요? 3차원 공간에 존재하는 물체를 컴퓨터 모니터라는 2차원 평면 위에 보여주기 위함 ( P.22 )
  • 정점셰이더가 입력 값으로 받는 것은 무엇이며 무슨 역할을 하나요? 정점데이터, 3D 물체의 정점들 위치를 화면 좌표로 변환 ( P.23 )
  • 정점셰이더와 픽셀셰이더는 각각 몇번 실행 되나요? 3D 물체를 구성하는 정점의 수만큼, 래스터라이저가 찾아내는 픽셀 수만큼 ( P.24 )
  • 셰이더 프로그래밍 이란? 정점셰이더와 픽셀셰이더에 사용할 함수를 하나씩 만드는 것이다 ( P.25 )
  • 셰이더에서 사용할 수 있는 입력 값은 무엇이 있는가? 전역변수와 정점데이터가 있다 ( P.51 )
  • 시멘틱이란 무엇인가? POSITION 같은 키워드를 활용해 정점 버퍼 정보(정점의 위치, UV 좌표, 법선 등) 중에서 필요한 정보 테이크 ( P.52 )
  • 각 픽셀의 위치를 찾아내려면 어떤 과정이 필요한가? 정점셰이더가 위치변환 결과를 래스터라이저에 전달해 줘야한다 ( P.52 )
  • VS_OUT에 있는 POSITION은 무엇을 뜻하는가? 투영공간으로 변화된 좌표 ( P.60 )
  • 픽셀셰이더의 가장 중요한 임무는? 픽셀의 색을 반환하는 것 ( P.64 )
  • 비트 수에 상관없이 통일적으로 색을 표현할 방법은 무엇인가? 백분율을 사용하면 된다 ( P.64 )
  • 각 물체마다 만들어야 하는 행렬은? 월드행렬 ( P.71 )
  • GPU에게 앞으로 그릴 모든 물체에 특정 셰이더를 적용하라는 명령어는? BeginPass(), EndPass() ( P.71 )
  • UV 좌표를 (0,0) ~ (0.5, 0.5)로 설정하면 어떻게 되는가? 이미지의 왼쪽 절반과 위쪽 절반만 보여진다 ( P.77 )
  • 텍스처 매핑은 어느 단계에서 해야 되는가? 픽셀셰이더 단계 ( P.80 )
  • UV 좌표는 어디에 지정되는가? 각 정점에 지정된다 때문에 UV좌표는 전역변수가 아닌 정점데이터의 일부로 전달된다 ( P.80 )
  • 특정 픽셀의 UV 값을 구하는 방법은? 현재 위치에서 세 정점까지의 거리를 구한 뒤 그 거리의 비율에 따라 세 UV값을 혼합 ( P.82 )
  • Output 구조체에 UV 좌표를 대입하기 전에 공간변환을 적용해야 하는가? 아니다, UV 좌표는 삼각형의 표면상에 존재하기 때문이다 ( P.84 )
  • 픽셀셰이더는 텍스처에 어떤 일을해야 하는가? 텍스처 이미지에서 텍셀을 구해와 그 색을 화면에 출력한다 ( P.85 )
  • 텍스처 이미지는 전역변수로 받아와야 하는가? 맞다, 텍스처 이미지는 픽셀마다 변하는 값이 아니므로 전역변수로 받아와야 한다 ( P.85 )
  • UV 좌표는 전역변수로 받아와야 하는가? 아니다, UV 좌표는 정점셰이더로부터 보간기를 거쳐 들어온 입력데이터가 된다 ( P.85 )
  • sampler2D 용도는? 2D 텍스처에서 텍셀 하나를 구해오는데 사용한다 ( P.86 )
  • PS_INPUT형에는 무엇이 들어있는가? UV 좌표 값 ( P.86 )
  • tex2D(DiffuseSampler, Input.mTexCoord); 이 코드 설명하면? DiffuseSampler에서 mTexCoord 좌표에 있는 텍셀을 읽어와 반환 ( P.86 )
  • 스위즐이란? rgba나 xyzw를 이용해서 마음데로 순서를 바꿔가면서 벡터의 성분에 접근하는 것 ( P.88 )
  • 람베르트 모델에서 난반사광을 계산할 때 코사인 함수를 활용하면 비용이 너무 커서 나온 대안은? 내적 연산을 활용한다 ( P.99 )
  • 법선 정보는 어디에 있는가? 각 정점에 저장되어 있는 것이 보통이다 ( P.100 )
  • 입사광의 벡터와 법선의 내적을 구해야 하는데 어떤 셰이더에서 하는게 좋을까? 정점셰이더 단계 ( P.103 )
  • 정점셰이더의 입력데이터에 있는 법선을 그냥 사용하면 되는가? 안된다, 로컬 기준 법선을 월드 기준 법선으로 변환해야 한다 ( P.104 )
  • dot(-lightDir, worldNormal); 에서 –lightDir을 해주는 이유는? 두 벡터의 내적을 구할 때, 화살표의 밑동이 서로 만나야 해서 ( P.105 )
  • 프로그래밍을 하다 보면 용도에 딱 맞는 시맨틱이 없는 경우가 종종 있다 이럴 때 어떻게 하면 되는가? TEXCOORD1 시멘틱 사용 ( P.106 )
  • 스펙큘러를 퐁 모델 기반으로 설명하면? 반사광과 카메라벡터가 이루는 각도의 코사인 값을 구하고, 그 결과를 여러 번 거듭제곱해 정반사광을 구하는 것 ( P.108 )
  • 거친 표면 일수록 거듭제곱 수를 늘려야 하는가 줄여야 하는가? 줄여야 한다 ( P.110 )
  • 정반사광 계산은 어느 단계에서 해야 하는가? 픽셀셰이더 단계이다, 정점셰이더 단계에서 해버리면 보간이 일어나기 때문 ( P.112 )
  • 정반사광을 계산하는데 필요한 두 방향벡터는? 카메라벡터와 정반사광의 방향벡터 ( P.112 )
  • 표면이 빛을 흡수하는 성질을 어떻게 표현? 반사할 색을 이미지로 그린 뒤, PS에서 이 텍스처를 읽어와 조명계산의 결과에 곱한다 ( P.122 )
  • 위에서 만든 텍스처를 난반사광에 곱해야 할까 정반사광에 곱해야 할까? 난반사광에 곱해야 한다, 이것을 디퓨즈맵 이라고 한다 ( P.122 )
  • 스펙큘러맵을 따로 만드는 이유는? 난반사광이 반사하는 빛과 정반사광이 반사하는 빛의 스펙트럼이 다른경우 and 조절 용도 ( P.123 )
  • 스페큘러 맵에 저장된 정보는 무엇을 뜻하는가? 각 픽셀이 반사하는 정반사광의 양이다 ( P.124 )

02-11 인성 면접 질문 ( 중요도 상 )

  • 구현해본 기술중 가장 기억에 남는 것을 말하면? 오브젝트 풀링 기법을 직접 구현한 것이 가장 기억에 남습니다 해당 기법은 클래스개념, 자료구조 개념, Level에 대한 개념, 예외처리를 복합적으로 고려해야 했기 때문에 구현할 때 많은 고민을 했던 기억이 납니다 ( 내생각 )
  • 게임을 만들고 싶어하는 이유는 무엇인가? 저는 세상에 즐길거리가 부족하다고 생각합니다 때문에 여행, 스포츠, 음악과 더불어 게임이라는 즐거운 문화를 만드는게 기여하고 싶습니다 (참고)
  • 게임 개발을 위해 노력하는 것은 무엇인가? DirectX와 Unreal Engine 기반으로 게임 모작 프로젝트를 진행하며 그래픽스 지식을 향상시켜 왔다 ( 내생각 )
  • 어떤 개발자가 되고싶은가? 주변 사람들이 믿고 일을 맡길수 있는 든든한 개발자가 되고싶습니다 ( 내생각 )
  • 존경하는 프로그래머가 있다면? 에픽게임즈 창업자 팀 스위니 입니다 언리얼 엔진을 개발하고 코드를 전세계에 공개한 것이 대단하다고 생각합니다 (참고)
  • 무슨 게임 개발을 해보고 싶은가? 대규모 MMORPG를 만들어보고 싶습니다 MMORPG는 게임개발 기술의 집약체이기 때문에 개발자로써 꼭한번 도전해보고 싶습니다 ( 내생각 )
  • 팀 프로젝트 중 팀원이 일을 못하면 어떻게 할 것인가? 회사의 채용 절차를 통과해 입사한 분인 만큼 일을 못하는 이유가 역량의 문제는 아닐 것이라 생각합니다 어떠한 이유로 업무상 어려움을 겪고 있다면, 한 팀인 이상 당연히 함께 잘 해낼 수 있는 방법을 찾아야 한다고 생각합니다 그러기 위해 일단 원인을 찾을 것입니다 이후 상황에 따라 도울수 있는 방법을 찾아 최대한 도울것 입니다 (참고)
  • 팀 프로젝트에서 가장 중요한 것은 무엇인가? 협력이라고 생각합니다 프로젝트는 특출난 한 명이 완성하는 것이 아니라 각 구성원들이 역할을 제대로 수행할 때 완성되기 때문입니다 ( 이를 위해 가장 필요한 능력은 소통 능력 이라고 생각합니다 ) (참고)
  • 좋아하는 게임은 무엇인가? 알아서 잘 답변하기 (참고)
  • 왜 게임 개발자가 되고 싶은가? 저는 세상에 즐길거리가 부족하다고 생각합니다 때문에 여행, 스포츠, 음악과 더불어 게임이라는 즐거운 문화를 만드는게 기여하고 싶습니다 (참고)
  • 살면서 제일 재미있게 했던 게임은 무엇인가? 롤입니다 친구들과 듀오로 합을맞춰 플레이 하는게 즐거웠습니다 ( 내생각 )
  • 개발할 때 중요한 것은 무엇인가? 가독성과, 최적화 입니다 개발은 혼자하는 것이 아닌 같이 하는것이기 때문에 가독성 있는 코드를 작성하는 것이 중요하다고 생각하며 유저가 원활한 서비스를 받을수 있게 항상 최적화를 고려해야 한다고 생각합니다 ( 내생각 )
  • 따로 자기계발을 하고 있는가? 네 현재 유데미 강좌를 통해 언리얼 데디케이티드 서버를 공부하고 있습니다 ( 내생각 )
  • IT 관련 최근 소식에 대해 아는 것이 있는가? Web 3.0(웹 3.0)은 인공지능과 블록체인을 기반으로 맞춤형 정보를 제공하고 데이터 소유를 개인화하는 3세대 인터넷입니다 (참고)
  • 왜 당신을 뽑아야하는가? 이 질문은 회사가 어떤 인력을 필요로 하는지를 잘 이해하고 있는가 알기 위함이다 (참고)
  • 팀원과 갈등이 생기면 어떻게 해결하는 편인지? 상황에 맞는 타협점이 무엇인지를 고민합니다 우선 팀원의 의견을 충분히 들은 후에 양보할 수 있는 부분과 관철시킬 부분을 구분하여 상대가 납득할만한 사례를 들어 제 의견을 주장하는 편입니다 (참고)
  • 리더에 가까운지, 팔로워에 가까운지? 저는 리더에 가깝다고 생각합니다 이후 Git 관련 얘기하기 (참고)
  • 취미, 주말에 뭐 하는지? 여자친구와 식물원(아침고요수목원) 같은곳에 가서 사진찍는게 취미 입니다 (참고)
  • 본인의 스트레스 해소 방법은? 근력 운동을 하며 땀을 흘리고 나면 스트레스가 풀립니다 ( 분위기 좋은 ) 카페에서 제가 좋아하는 음악을 들으며 스트레스를 풉니다 (참고)
  • 일과 사생활(워라벨)에 대해 어떻게 생각하는지? 최고의 업무 성과를 내기 위해서는 적절한 휴식도 함께 해야 한다고 생각 합니다 물론 프로젝트 기한이 얼마 남지 않은 상황 같은 경우 야근이나 주말 근무를 해서라도 주어진 업무를 마무리 해야 겠지만, 그런 다음에는 적절한 휴식을 통해서 다음 업무를 대비 할 수 있어야 할것 입니다 (참고)
  • 우리 회사 야근 잦은데 괜찮은가? 최고의 업무 성과를 내기 위해서는 적절한 휴식도 함께 해야 한다고 생각 합니다 하지만 프로젝트 기한이 얼마남지 않은 상황 같은 경우 야근이 잦아도 제가 맡은 업무를 성실해 해낼 것입니다 (참고)
  • 상사가 부당한 요구를 한다면? 우선 불법적인 요소가 없다면 상사의 지시에 따르겠습니다 불법적인 요소가 있다면 다른 동료분들과의 상담을 통해 행동을 결정할 것 같습니다 (참고)
  • 상사가 나를 싫어한다면? 우선 제가 부족한 부분이 있었는지 고민해볼 것입니다 이후 동료분들과의 상담을 통해 제가 부족했던 부분을 보완하고 기회가 될때 해당 상사분과 대화를 통해 관계회복을 위해 노력할 것입니다 (참고)
  • 다른 사람을 설득할 때 사용하는 방법은? 공감, 이성, 감성을 통해 설득합니다 팀원중 한명이 자신이 맡은 몬스터의 패턴을 최소한만 구현하겠다고 했습니다 우선 왜 그렇게 작업을 진행하려 했는지 들었습니다 해당 팀원은 자신이 원하는 파트가 아니라 의지가 안생긴다고 했습니다 이에, 저는 몬스터 패턴을 화려하게 잘 구현하면 나중에 너가 맡은 부분을 포트폴리오로 만들때 쓸 내용이 많을것이다 라고 이성적으로 설득함고 동시에 열심히 포트폴리오를 만들어서 좋은곳에 취업하자고 감정적으로도 설득했습니다 해당 팀원은 수긍했고 몬스터 패턴을 많이 구현해 팀 포트폴리오의 퀄리티를 향상시킬 수 있었습니다 (참고)
  • 보수와 인간관계 중 하나를 포기하면 어느 것을 포기하겠나? 보수를 포기하겠습니다 인간관계는 조직 내에서 원활한 협업과 팀워크를 구축하는 데 중요한 역할을 합니다 좋은 인간관계를 형성하고 유지함으로써 팀의 성과를 높일 수 있고, 긍정적인 업무 환경을 조성할 수 있습니다 인간관계를 소중히 여기고, 효과적인 커뮤니케이션과 협업을 통해 조직의 목표 달성에 기여하고자 합니다 이를 달성하면 보수는 자동으로 따라온다고 생각합니다 ( ChatGPT )
  • 과정과 결과 중 어느 것이 더 중요한가? 저는 결과가 더 중요하다고 생각합니다 스포츠에서 과정이 아무리 좋아도 득점을 하지 못하면 아무 소용이 없습니다 이는 회사도 마찬가지라고 생각합니다 결과를 낼 수 있는 사원이 되겠습니다 (참고)
  • 업무를 지시받는 것이 편한가 스스로 찾아서 하는 것이 편한가? 지시받는 것이 편합니다 하지만 좋은 아이디어가 있다면 제 의견을 능동적으로 얘기하는 편입니다 (참고)
  • 조직 문화에 적응하는 나만의 방법이 있는지? 경청하는것이 제 노하우 입니다 경청은 불필요한 오해를 없애고, 상대방의 호감을 얻을수 있는 좋은 소통 방법입니다 (참고)
  • 성격이 외향적인지 내향적인지? 외향적인 편이라고 생각합니다 그 이유는 프로그래밍을 할때 제가 구현한 방법이 최선인지를 다른 사람들과 얘기하는것을 즐기기 때문입니다 (참고)
  • 삶에서 가장 중요하게 생각하는 가치는? 신뢰라고 생각합니다 인간과 인간사이에서 진실된 관계는 신뢰를 통해서야 비로소 완성될수 있다고 생각합니다 이러한 신뢰는 하루아침에 이루어지는것은 아니며 자신이 꾸준이 쌓아나가야 합니다 (참고)
  • 꿈이 무엇인가? 제가 개발한 컨텐츠를 통해 전세계 사람들이 즐거움을 느끼게 하는데 기여해보고 싶습니다 (참고)
  • 주변에서 당신을 어떤 사람이라고 생각하나요? 끈기가 있는 사람이라는 평가를 받습니다, 무슨 일이든 불가능하다고 생각하지 않고 방법을 못찾았을 뿐이라고 생각합니다 그래서 프로젝트를 진행할때 문제가 생기면 끝까지 해결할 방법을 찾아냅니다 (참고)
  • 대학 시절 시간 관리는 어떻게 했는지? 대학 시절에는 시간 관리를 하지 않았고 이전 회사에서 업무효율을 높이기 위해 시간관리를 시작했습니다 영국 총리였던 글래드 스턴경은 일정 시간마다 자신이 한 일을 기록했다고 합니다 저도 이방법 처럼 일정시간마다 제가 한일을 기록하고 그 기록을 바탕으로 생산성을 높이려 노력했습니다 (참고)
  • 입사하면 가장 먼저 무엇을 하고 싶은지? 언리얼엔진 플러그인을 개발해 메타버스엔터테이먼트의 VFX 기술을 향상시키는데 기여해보고 싶습니다 (참고)
  • 좋아하는 사자성어, 좌우명 등을 얘기하면? 초부득삼, 첫번에 실패한 것이 세 번째는 성공한다는 뜻으로, 꾸준히 노력하면 성공할 수 있다는 말입니다 저는 어떠한 어려운 일이 있을때 불가능하다고 생각하지 않고 방법을 못찾았을 뿐이라고 생각하기 때문에 해당 사자성어를 좋아합니다 (참고)
  • 최근에 읽은 책은 무엇인가요? 인생 언리얼 교과서 입니다 이 책을 통해 언리얼 엔진에 대한 개념을 좀 더 확실히 잡을수 있었습니다 (참고)
  • 인생에서 가장 큰 일탈은 무엇이었는지? 중학교때 설명절이 끝나고 부모님께서 당분간 용돈은 설날에 어른들께 받은걸로 사용하라고 하셨습니다 저는 그돈으로 가지고 싶었던 플레이스테이션 타이틀을 모두 사버렸습니다 부모님께서는 제가 한일은 스스로 책임지라고 하셨고 이후 저는 용돈이 없어 몇개월동안 간식같은것을 사먹을수 없었습니다 이러한 경험을 통해 책임감이 무엇인지 확실히 깨닳을수 있었습니다 (참고)
  • 친구가 많은 편인지? 많은편 입니다 취업준비 기간이 길어지고 있는데 친구들이 한번씩 맛있는 밥을사주며 응원해줘서 힘이 납니다 (참고)
  • 지난 주말에는 뭘 했는지? 토요일에는 여자친구와 놀러갔고 일요일에는 알고리즘 문제를 풀었습니다 (참고)
  • 최근에 화가 났던 일은 무엇이 있었는지? 최근에 나태해진 제 자신을 보고 화가났습니다 동기부여가 필요한것 같아 김연아, 박지성, 수능만점 받은 분들의 인터뷰를 봤는데 그분들이 공통적으로 하는 얘기는 생각을 비우고 지금 당장 주어진 일에 최선을 다하라 였습니다 이후 이를 실천하고 있습니다 (참고)
  • 존경하는 인물은? 방시혁 대표님을 존경합니다 영상을 통해 서울대 졸업식 축사 하시는것을 보았는데 세상과 타협하지 말고 변화시키라는 말이 크게 와 닿았습니다 (참고)
  • 리더의 역할이란 무엇인지? 많은 역할이 있겠지만 의사결정이 가장 중요하다고 생각합니다 이를위해 리더는 의사결정을 할 수 있는 판단력을 키워야 하며 판단력을 키우기 위해서는 끊임없이 자기계발을 해야한다고 생각합니다 (참고)
  • 가장 힘들었던 경험을 얘기하면? 직무에 관련된 경험을 소재로 목표달성 과정에서 느낀 나의 감정을 얘기해야한다 (참고), (참고)
  • 실패했던 경험을 얘기하면? 실패를 겪고보고 뭘 배웠고 어떻게 같은 실수를 안 하느냐를 물어보는 것이다 (참고), (참고)
  • 지원하신 이유는 어떻게 될까요?
  • 이 직무를 선택한 이유는 무엇인가요?
  • 담당하게 될 업무에서 본인이 가진 장점은?
  • 고치고 싶은 단점은 무엇인가요?
  • 어떤 갈등을 경험하고, 어떻게 해결했나요?
  • 입사 이후에 바라는 점과 계획 혹은 목표는?
  • 인재상 중 본인과 가장 잘 어울리는 것과 그 이유는?
  • 타기업과 우리회사를 함께 지원한 이유는?
  • 다른 기업과 우리회사를 동시에 합격한다면 어디로 가는가?
  • 우리회사에 궁금하신 점이 있으신가요?


참고한 블로그 주소들

목록

  • https://github.com/jobhope/TechnicalNote/blob/master/InterviewQuestions.md
  • https://github.com/JaeYeopHan/Interview_Question_for_Beginner
  • https://woo-dev.tistory.com/163
  • https://iwannabethesenior.blogspot.com/2019/10/blog-post.html
  • https://m.blog.naver.com/nds888/221380832707
  • https://github.com/gyoogle/tech-interview-for-developer
  • https://cclient.tistory.com/m/category/pinko/career
  • https://hmjo.tistory.com/264
  • https://makefortune2.tistory.com/category/Computer%20Science/C%2B%2B
  • https://velog.io/@kkanyo/%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91-C-%EC%9A%94%EC%95%BD-%EC%A0%95%EB%A6%AC-%EA%B3%84%EC%86%8D-%EC%88%98%EC%A0%95
  • https://se-jung-h.tistory.com/entry/C-C-%EA%B8%B0%EC%88%A0-%EB%A9%B4%EC%A0%91-%EC%A7%88%EB%AC%B8
  • https://91ms.tistory.com/category/%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91
  • https://sshoreng.tistory.com/80?category=712983
  • https://geekhub.tistory.com/category/%EB%A9%B4%EC%A0%91%20%EC%A4%80%EB%B9%84
  • https://uncertainty-momo.tistory.com/46
  • https://hakyoug.tistory.com/73
  • https://sb-story.tistory.com/2
  • https://throwbug.com/80/%EB%A9%B4%EC%A0%91%EB%95%8C-%EC%96%B4%EB%96%A4%EA%B1%B0-%EB%AC%BC%EC%96%B4%EB%B3%B4%EB%8A%94%EC%A7%80-%EA%B3%B5%EC%9C%A0%ED%95%B4%EB%B3%B4%EC%95%84%EC%9A%94
  • http://www.gamejob.co.kr/Community/Talk/Detail?talk_Stat=13&idx=9149
  • https://namoeye.tistory.com/entry/%EB%A9%B4%EC%A0%91%EB%8C%80%EB%B9%84-%EC%A7%88%EB%AC%B8-%EC%A0%95%EB%A6%AC?category=678025
  • http://kingpark0304.blogspot.com/2014/11/blog-post.html
  • https://velog.io/@mardi2020/C-%EB%A9%B4%EC%A0%91-%EC%A7%88%EB%AC%B8-%EC%A0%95%EB%A6%AC
  • https://j2hworld.tistory.com/55
  • https://luv-n-interest.tistory.com/1168
  • https://jay94.tistory.com/5?category=1054817
  • https://github.com/Romanticism-GameDeveloper/GameDeveloper-Client-Interview
  • https://shung2.tistory.com/category/%ED%9A%8C%EC%82%AC/%EB%A9%B4%EC%A0%91
  • https://corin-e.tistory.com/entry/%EC%8B%A0%EC%9E%85-IT-%EA%B0%9C%EB%B0%9C%EC%9E%90-%EB%A9%B4%EC%A0%91-%EC%A7%88%EB%AC%B8-%EC%B4%9D-%EC%A0%95%EB%A6%AC-%EC%9D%B8%EC%84%B1%ED%9A%8C%EC%82%AC%EC%A7%81%EB%AC%B4%EA%B2%BD%ED%97%98%EA%B8%B0%EC%88%A0


맨 위로 이동하기

댓글남기기