기술면접
+인성면접
조금 코딩을 못치더라도 금방 말이통하고
그래도 최소한 기술지식과 문제해결능력
약 1시간
1인분 하는가?
얼마나 빨리 배울 수 있는가?(잠재력)
- 기초체력 : CS/C# 기본기, 자료구조
- 학습태도 : 논리적 사고, 성장가능성
- 여정 : 포트폴리오(왜 만들었는가?)
어떤 문제를 어떻게 해결했는가?(경험)
- 경험의 깊이 : 왜 그 기술을 썼는가?
- 실무역량 : 최적화, 아키텍처, 협업
- 주도성 : 스스로 문제를 찾고 해결한 사례-> 꼭물어봄
좋은대답 vs 나쁜대답
what:델리게이트는 메서드를 참조하는 타입입니다
why:델리게이트는 코드의 결합도를 낮추기 위해 사용합니다
how:A가B를 직접 호출하는대신, a는 신호만 보내고 b는 그 신호를 구독하게 만듭니다
ex:유니티의 ui버튼 onclick이나 c# 이벤트가 대표적 예시입니다.
경험: 내가 활용한 경험
포트폴리오에서 오브젝트풀링을 왜 쓰셨죠?
what:최적화를 위해 썼습니다. 좋다고 들었습니다
->bad 추상적임, 들은지식
why how result : 프로파일러를 확인하니 총알발사시 gc 스파이크가 심했습니다
instantiate/destory대신
모르겠습니다를 현명하게 말하는 법
내 포트폴리오를 확인하는게 우선임
bad : 모르겠습니다.. 대화단절, 배운적없습니다 안써봐서 모릅니다(수동적태도) 아는척둘러대기(신뢰도하락)
good :
인정 죄송합니다 해당 개념은 답변드리기 어렵습니다.
유추 optional 다만 이름으로 보아 혹시 000가 관련된 내용일까요
의지 면접이 끝난후 이부분은 가장 먼저 찾아서 학습하고 정리해두겠습니다
면접관은 함께 일할 동료를 찾고 있다(모르는걸 왜물어봐가 아니라, 모르는것을 인정하고 배워오려는 책임감과 의지)
단순 what이 아닌 why, how를 설명
경험을 근거로 문제해결과정을 어필
모르는것은 솔직하되 학습의지를 보여라
CS 기초이론 day1
- cpu와 gpu의 역할을 구분하고 병목의 의미를 이해, 설명
- stack과 heap 메모리 구조를 C#의 struct/class와 연결하여 설명
- gc가 왜 게임성능에 치명적인지 이해
- 캐시메모리와 데이터 지역성이 왜 최적화의 핵심인지 설명
- 렌더링 파이프라인의 기본ㄴ흐름과 드로우콜의 의미를 이이해하고 설명
- 자료구조의 의미와 기초적인 자료구조에 대해 이해 설명
- 기초적인 정렬 탐색 알고리즘 동작원리
컴퓨터구조
: 컴퓨터 구조를 알아야 하는 이유
ex) 나눗셈보다 곱셈 연산을 쓴다?(속도 6배 7배 차이)
- 최적화는 병목을 찾는 여정
- 병목을 찾으려면 누가cpu/gpu 어디서memory 무슨일process을 하는지 알아야 한다
cpu memory disk
cpu : 똑똑한 작업자 뇌
memory(ram): cpu의 작업책상, 휘발성 빠름
disk(ssd/hdd): 거대한 책장 영구보관
cpu
- 똑똑한 작업자 1~16cores
- 직렬처리 serial, 복잡한 연산 빠른두뇌
- 유니티에서 C#스크립트실행 update 물리연산 ai 오브젝트관리
gpu
- 단순한 일꾼 10000 cores
- 병렬처리 parallel 단순반복연산
- 유니티에서는 화면에 픽셀그리기(렌더링) 쉐이더연산, 파티클
병목현상 cpu bound vs gpu bound
- cpu가 너무 바싸서 gpu가 놀고있음
- 증상 : update에 무거운로직, 과도한 물리연산, 많은 드로우콜
- gpu가 너무바빠서 cpu가 놀고있음
- 증상: 고해상도, 복잡한쉐이더, 과도한라이트, 많은 폴리곤
- 최적화란 cpu와 gpu가 사이좋게 일하도록 일감을 나눠주는 것
OS기초 process vs thread
- program : 결과물 disk공간
- process : 독립된 작업장 ram공간
- thread : 실제일꾼 process공간
메모리구조
- 메모리구조란 : 운영체제가 프로세스에게 준 ram 공간의 전체 설계도

코드영역
- 실행할 기계어 명령어가 저장되는 곳 읽기전용
- C# 스크립트가 JIT컴파일된 기계어 코드가 여기에 올라감
데이터영역
- 프로그램이 끝날때까지 계속 살아있는 데이터
- C#의 static변수가 여기에 저장됨
힙영역
- 어지러운 창고, 동적할당 class new gc대상
- 런타임에 크기가 할당됨
스택영역
- 깔끔한 책상 함수호출, struct, os가 자동관리
- 컴파일 시점에 크기가 할당됨.
값타입(스택) vs 참조타입(힙)
값타입 : struct, int float, bool, enum
- 스택 메모리에 저장됨, 변수 자체가 값을 가짐
참조타입 : class, string List, Array, Gameobject
캐시메모리
자료구조
빅o 표기법
Array와 List의 차이
- Array는 고정크기, List는 가변크기
- List는 내부에 Array를 가지고 있음, 용량이 꽉차면 기존 2배크기의 새 Array를 만들고 복사함. 이 과정에서 비용과 GC가 발생
- List는 용량을 어느정도 미리 적정하게 만드는 것이 최적화
Stack Queue
- 스택 : 후입선출 UI뒤로가기 Undo기능
- Queue : 선입선출, 대기줄대로 실행하는 것, AI행동순서나 네트워크 패킷처리
해시테이블
- 키값을 해시함수로 숫자로 변환, 그 숫자 인덱스에 value를 저장
- 해시 충돌 시 LinkedList 체이닝을 통해 연결하여 저장
- 체이닝 장점 : 구현이 간단 직관, 데이터 삭제가 매우 쉬움(연결리스트에서 해당 노드만 삭제), 테이블이 꽉차도 저장가능
- 체이닝 단점 : 추가 메모리 필요(연결리스트 주소 공간), 캐시효율성이 낮음, 최악의 경우 성능이 저하됨
그래프
트리
- 그래프의 일종
- 루트 노드 부모자식 구조
- 예시 유니티 씬 하이어라키
이진탐색트리
- 탐색을 O log n
- 왼쪽은 작고 오른쪽은 크다
- 정렬된 상태에서만 적용가능
알고리즘
- 느린정렬 n^2
- 버블정렬, 선택정렬, 삽입정렬
- 버블정렬 : 이터레이터가 이동하면서 대상 크기를 비교하며 정렬하는 방법, 가장 큰 데이터가 맨 뒤로 밀려남
- 선택정렬 : 전체에서 최솟값을 선택해 맨 앞으로, 다음범위부터 최솟값을 맨 앞으로
- 빠른정렬 n log n
- 병합정렬, 퀵정렬, 힙정렬
- 분할정복 방식
- 병합정렬 : 반으로 나누고 나중에 정렬하면서 합친다.
- 퀵정렬 : 피봇을 잡고 작은 것은 왼쪽, 큰 것은 오른쪽 그룹으로 나눈다. 나눈 그룹 내에서 다시 위 정렬을 재귀적으로 실행
- 탐색
- 이진탐색 : 정렬된 데이터만 가능
- BFS : 너비우선탐색, 가까운 노드부터 차례대로, 큐, 최단거리 길찾기
- DFS : 깊이우선탐색, Stack또는 재귀, 미로탐색 or 스킬트리 유효성 검사 등
- 에이스타 : BFS + H어림짐작, 다익스트라 알고리즘의 변형 f=g+h g: 시작점부터 현재까지 거리, h는 현재부터 도착점까지 예상거리