본문 바로가기
Engineer

면접 시 대답을 잘하려면.. feat. 비전공자 C++ 기술면접 키워드

by _제이빈_ 2022. 10. 4.

저는 꽤나 긴장을 많이 하는 터라, 갑작스런 질문을 통해 대답을 바로 꺼내야하는 면접같은 형태의 시험에서는 머리가 백지상태가 됩니다(사실 서면 시험에서도 똑같다..). 그렇기 때문에 항상 제 방식대로 이해하려고 노력하는데, 즉 머릿속 개념들과 최대한 연결시키며 청킹을 통하여 기억합니다. 작은 실마리라도 잡으면 거기로부터 개념을 확장하도록 말이죠.

 

그래서 이번 면접을 준비하면서도 적용했습니다. 실제 면접에서 긴장할 것이 분명하기 때문이죠. 긴장하는 건 당연하고, 버벅이며 말하는 것과는 별개로 진짜 이해했다고 어필할수 있는 대답을 할수 있었으면 했습니다. 해서 정답을 달달 외운다기 보다는 주요 키워들에 대해 저 만의 이해를 하고, 나만의 언어로 설명할 수 있는 개념으로 정리하려 노력했습다. 실제로 회사에서 가끔 면접을 들어가다보면, 당연히 면접자는 긴장을 하는데 더듬거리더라도 외운것 같지 않은 자신만의 이해로 대답하는 사람이 오히려 청산유수처럼 교과서를 읊는 것보다 오히려 더 좋았던 것 같다.(너드 숨은고수 느낌)

 

돌아돌아 왔지만, 아래는 각 키워드들의 전통적인 외우는 방식 + 나만의 언어로 정리한 내 전용 답안지입니다. 혹 면접을 준비하고 있다면 아래 주제들이나 추가적인 자신의 분야에 맞는 지식들을 몸에 배인 이해로 대답할 수 있도록 "나만의 언어로 정리" 해보시길 바랍니다.

 

CS기본 / C++ 기술 면접 단골 질문

 

원본* 내용들을 공부하고 짜집기한 내용입니다.

*mangkyu.tistory.com / se-jung-h.tistory.com 

 

1. OOP (Object-oriented programming)

더보기

"OOP는 현실 세계를 프로그래밍으로 옮겨와 현실 세계의 사물들을 객체로 보고, 그 객체로부터 개발하고자 하는 특징과 기능을 뽑아와 프로그래밍하는 기법이며 OOP로 코드를 작성하면 재사용성과 변형가능성을 높일 수 있습니다."라고 설명하는데, 내가 느꼈던 "객체"라는 개념의 큰 특징은 데이터와 매서드가 함께 묶여있다는 것이었다. 그리고 객체들 간에 상호작용을 하는 걸 프로그램으로 짜는 느낌이랄까? 그래서 인지 결합도는 낮고 응집도가 높은 모듈을 탄생시키지 않을까 그래서 재사용과 변형이 쉽지 않을까 싶은데, 실무를 통해 더 더 체감해야한다. 

 

1.1 OOP의 5가지 설계 원칙

더보기

1. SRP(Single Responsibility Principle, 단일 책임 원칙): 클래스는 단 하나의 목적을 가져야 하며, 클래스를 변경하는 이유는 단 하나의 이유여야 한다.
2. OCP(Open-Closed Principle, 개방 폐쇠 원칙): 클래스는 확장에는 열려 있고, 변경에는 닫혀 있어야 한다.
3. LSP(Liskov Substitution Principle, 리스코프 치환 원칙): 상위 타입의 객체를 하위 타입으로 바꾸어도 프로그램은 일관되게 동작해야 한다.
4. ISP(Interface Segregation Principle, 인터페이스 분리 원칙): 클라이언트는 이용하지 않는 메소드에 의존하지 않도록 인터페이스를 분리해야 한다.
5. DIP(Dependency Inversion Principle, 의존 역전 법칙): 클라이언트는 추상화(인터페이스)에 의존해야 하며, 구체화(구현된 클래스)에 의존해선 안된다.

단일책임 / 개방 폐쇠 / 리스코프 치환 / 인터페이스 분리 / 의존 역전 5가지 원칙을 다 외우리라고 기대하지 않는다. 하지만 마음속에 원칙을 깊이 새겨놓고 설계시에 자연스래 묻어나오도록 하겠다. 클린코드에서도 주구장창 외치던 조언들이 5가지 원칙에 녹아있다. 최대한 작게! 각 클래스간 결합도를 낮춰라! 추상화 수준을 나눠라! 정보교환 및 접근은 매서드를 통해서만! 

 

1.2 절차지향 프로그래밍 VS 객체지향 프로그래밍

더보기
절차지향 프로그래밍 객체지향 프로그래밍
순차적인 처리를 중요 실제 세계의 사물들을 객체로 모델링하여 개발
C언어 Java
코드의 순서가 바뀌면 동일한 결과를 보장하기 어렵다. 캡슐화, 상속, 다형성(하나의 메소드나 클래스가 다양한 방법으로 동작)
컴퓨터의 처리구조와 유사해 실행속도가 빠르다. 절치지향 언어보다 실행속도가 느리다.

이름에서 바로 알 수 있는 것 빼고는 C언어vsJAVA 정도랄까. 근데 자바는 hello world 응애응애 수준이라 아직 잘 모른다. 아참 C와 JAVA차이는 직접 컴터를 조정하는거랑 무슨 가상머신을 사용하는 차이도 있었다. 

 

 

1.3 함수형 프로그래밍

더보기

"함수형 프로그래밍의 가장 큰 특징은 immutable data와 first class citizen으로서의 함수입니다. 함수형 프로그래밍은 부수효과가 없는 순수 함수를 이용하여 프로그램을 만드는 것이다. 부수 효과가 없는 순수 함수란 데이터의 값을 변경시키지 않으며 객체의 필드를 설정하는 등의 작업을 하지 않는 함수를 의미합니다."

사실 이건 진짜 모르겠다. C# 이나 JavaScript가 함수형 프로그래밍 언어라고 언뜻 봤는데 아직 경험이 부족한지 이해가 낮다. 링크 형님이 잘 정리해주셨는데, 이에 따르면 대입문을 사용하지 않는 프로그래밍이며, 작은 문제를 해결하기 위한 함수를 작성하는 것이란다. 부수효과*가 없는게 특징이라는데, 이렇게 하면 Thread가 하는 일이 보장받아서 병렬화에 좋다고 한다. 오? 병렬화 때문에 사용하는 것 같다. 근데 SIMD 최적화를 주로 고민 하는 나로서는 함께 적용되는 건지 싶긴한데 한번 고민해봐야겠다. 

*(변수의 값이 변경됨, 자료 구조를 제자리에서 수정함, 객체의 필드값을 설정함, 예외나 오류가 발생하며 실행이 중단됨, 콘솔 또는 파일 I/O가 발생함)

 

2. 메모리 구조

더보기

코드(code) 영역
메모리의 코드(code) 영역은 실행할 프로그램의 코드가 저장되는 영역으로 텍스트(code) 영역이라고도 부릅니다. CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리하게 됩니다.

데이터(data) 영역
메모리의 데이터(data) 영역은 프로그램의 전역 변수와 정적(static) 변수가 저장되는 영역입니다. 데이터 영역은 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸합니다.

스택(stack) 영역
메모리의 스택(stack) 영역은 함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는 영역입니다. 스택 영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸합니다. 이렇게 스택 영역에 저장되는 함수의 호출 정보를 스택 프레임(stack frame)이라고 합니다. 후입선출(LIFO, Last-In First-Out) 방식에 따라 동작하므로, 가장 늦게 저장된 데이터가 가장 먼저 인출됩니다. 스택 영역은 메모리의 높은 주소에서 낮은 주소의 방향으로 할당됩니다.

힙(heap) 영역
메모리의 힙(heap) 영역은 사용자가 직접 관리할 수 있는 '그리고 해야만 하는' 메모리 영역입니다. 힙 영역은 사용자에 의해 메모리 공간이 동적으로 할당되고 해제됩니다. 힙 영역은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당됩니다.

 

작성한 프로그램의 명령어는 코드영역에 있고 데이터/힙/스택영역에서 메모리를 불러다가 ALU에게 계산을 맡기겠지..? 이게 맞나.. 여튼 그때 데이터 영역에는 정적 변수가, 스택영역에는 프로그램에서 함수들을 타고타고 깊고 얕은 수준을 타고들어갔다 나왔다 해야하니까 고때 마다 사용되는 지역변수가 매개변수들을 저장했다 비웠다 하는 곳이고.. 힙영역에는 직접 관리하고 싶은 주요 데이터들을 할당해놓고 편하게 사용하는 곳이다..!

 

3. 자료구조

더보기

스택은 FILO / 큐는 FIFO / 트리는 고모양 그대로 계층을 나타내고 / 힙 구조는 좀 이해하기 난해했던 완전이진트리이다. 우선순위큐를 생각하면 되는데 시간복잡도가 O(logn)이다. 

 

3.1 해시테이블

더보기

처음에는 C++ STL의 map이랑 비슷한건가 싶었는데, 이건 그냥 정렬해놓은 것이고 hash_map이라는게 따로 존재했다. 시간오더가 O(1)이라고 한다. 아마 정렬된 구조의 몇번째 값이 아니라 hashtable을 통해서 바로 데이터 위치를 찍어주는 갑다.. 맞나..? 암튼 이게 더 빠르다고 한다. 근데 pair랑은 뭐가 다르지? pair 자료구조를 까보니까 그냥 2개의 맴버변수를 가진 구조체이다. 뭐 여러 기능이 붙어있지만.

 

 

 

4. 알고리즘

 

4.1 정렬 알고리즘

더보기

버블소트는 앞에서부터 두개씩 비교하면서 큰거 뒤로 작은거 앞으로 (물론 반대도 가능) 보내면서 다 될때까지 계속 회독. 시간복잡도는 O(n2)

 

힙소트는 완전이진트리를 이용해서 리스트에 추가하면서 완전 이진트리를 구축하며 타고올라가면서 교환! 시간복잡도는 O(nlog2n)

머지소트는 일단 두개를 비교할수 있을때까지 촤락 나누고 두개를 비교해서 정렬, 2개+2개를 합병하며 정렬, 4개+4개 합병하며 정렬 .. 전체 정렬! 시간복잡도는 O(nlog2n)

 

퀵 소트는 피봇을 정해놓고 나머지 데이터를 피봇보다 크고 작은 애들로 2집단으로 나누고 그 사이에 피봇을 껴넣는 식. 계속 하다보면 정렬됨 ㅇㅇ 시간복잡도는 O(nlog2n) 최악으로는 n2까지도 된단다.

 

삽입정렬은 손으로 카드 순서 맞출때랑 같은 알고리즘인데 이게 보통 O(n2)수준인데 빠르면 O(n)까지도 된단다. O(n)이 되는 상황을 알면 적재적소에 쓸 수 있겠다.

 

 

4.2 동적 프로그래밍

더보기

분할정복과 비슷하지만 다른데, 여러개의 하위 문제로 나누고 결합하여 문제를 푸는 방식인데, 여러번 계산하는 대신 저장해놓고 속도를 향상 시킬 수도 있다고 한다. 사실 잘 이해가 안가는데, 링크 의 피보나치 수열을 예시로한 설명이 아주 이해를 도와준다. 그러니까. 뭔가 분할정복마냥 독립적인 문제가 여러개가 아닌 서로 연관된 하지만 연산의 추상적의미는 같은 피보나치같은.. 것인가 보다.

 

4.3 허프만 코딩?

더보기

이건 굳이 필요없을거 같은데 그냥 궁금해서 찾아보았다. 뭔가 글자를 압축해서 저장하는 인코딩 방법인거 같은데, 역시나 괜히 찾아봤다. 링크형님이 잘 정리해두셨다.

 

5. C/C++ 질문들

 

5.1 C와 C++ 차이

더보기

절차 지향과 객체지향 차이다. 링크 형님이 잘 정리해주고 계신데, ( 오버로딩 / 연산자 오버로딩 / 디폴드 매개변수 / 참조 / 참조로 함수호출 / new&delete / 제네릭 함수, 그리고 클.래.스 ) 가 추가되었다고 한다. 뭐 꼭 객체지향을 위한 기능만 추가된거 같진 않은데, 아닌가 그런가?? 참조로 함수호출은 const로 받으면 호출시 복사도 안일어나고  수정도 막을 있어서 좋다. 이것도 객체지향인가? 끙 

 

5.2 Virtual 함수

더보기

가상함수인데, 파생클래스에서 정의(오버라이딩)하라고 껍데기만 제시해주는것이다. 바인딩이 동적으로 이뤄진다는 특징도 있는데, 이는 코드영역에 계속 올려놓고 사용하는가 혹은 사용할때 그에 맞춰서 바인딩 시켜주는가의 차이이다. 

 

5.3 접근 지정자

더보기

이건 용어가 안 익숙해서 메-모. public private protected 요놈들이다. 구조체나 클래스 작성할때 맴버변수나 메소드를 누구한태 까지 공개할지!

 

 

6.1 멀티스래드 / 멀티프로세스

더보기

윈도우에서 작업관리자를 열면 프로세스 목록이 주르륵 뜨는데 이걸 지금 CPU가 동시에 처리하는 것처럼 보이는 것 뿐이다. 해서 프로세스를 계속 교차해가면서.. 멀티스래드는 SIMD같은.. 비슷한거 같다. 아니 이건 지금 몰라도 될듯. OS관련 질문인 것 같다.

 

6.2 렌더링 파이프라인

더보기
  1. 데이터 로드 :
    버텍스 버퍼에 데이터 저장 및 버텍스 어레이로 어떤 자료인지 정해서 전달
  2. 버텍스 쉐이더 :
    받아온 정점 데이터는 삼차원 공간 좌표계이므로 원하는 좌표계로 변환하는 작업을 주로 수행. 3차원 좌표를 이용한 계산을 여기서 보통 수행. normal을 받아오지 않았을 경우 여기서 구했음
  3. 레스터화 :
    디스플레이에 매핑!
  4. 프레그먼트 쉐이더 :
    픽셀이 무슨 색이 될지 계산하는 단계. 여기서 별짓을 다했다. 깊이도 계산하고, 얼마나 겹쳤는지 정도, 빛반사 등등...!
  5. 이러한 과정을 거쳐 생성된 데이터를 프레임버퍼에 올리게 되고, 화면상으로 나타난다.

 

6.3 디자인 패턴

더보기

지금까지 인지하고 사용한건 싱글톤, 스트레터지, 그리고 옵저버 패턴 정도이다. 나머지는 개념적으로만 알고 있고 아직 경험해본 바가 없어 깊은 이해를 가지고 있지는 못하다.

 

반응형

'Engineer' 카테고리의 다른 글

공돌이 용 유한요소법(FEM) 기본적인 이해  (0) 2020.12.01
프로젝트 목록  (0) 2020.03.21

댓글