메뉴 바로가기 검색 및 카테고리 바로가기 본문 바로가기

한빛출판네트워크

IT/모바일

C++ 면접에 자주 등장하는 질문 유형이 있다고?! C++ 개발자를 꿈꾼다면 필독! (2)

한빛미디어

|

2019-12-17

|

by 한빛

17,740

C++ 전문 개발자를 꿈꾼다면 필독! 

C++ 면접에 자주 등장하는 예상 질문 유형을 알아보자! (2)

 

지난 편에 이어 <전문가를 위한 C++>을 통해 전문 코딩기법을 익히고 싶은 독자님들, 혹은 C++ 전문 개발자를 꿈꾸고 계신 분들을 위해 C++ 면접에 자주 등장하는 예상 질문 유형을 살펴보도록 하겠습니다. 

 

 

※ 이 콘텐츠는 <전문가를 위한 C++>에 수록된 내용을 재구성한 것입니다. 

 

객체지향 디자인

 

객체지향 디자인에 대한 질문은 C++의 객체지향 기능을 실제로 사용해본 프로그래머와 단순히 말로만 들어본 C 프로그래머를 가려내기 좋습니다. 면접관은 절대 이력서에 나온 내용을 그대로 믿지 않습니다. 수년 동안 객체지향 언어를 사용했더라도 제대로 이해하고 있는지 확인하고 싶어 하죠.

 

기억할 사항

 

▶ 절차형 패러다임과 객체지향 패러다임의 차이점

▶ 클래스와 객체의 차이점

▶ 컴포넌트, 속성, 동작 관점에서 클래스 표현

▶ is-a 관계와 has-a 관계

▶ 다중 상속의 장단점

 

질문 유형

 

객체지향 디자인에 대한 질문은 크게 두 가지 방식으로 나올 수 있습니다. 하나는 객체지향 개념을 정의하는 것이고, 다른 하나는 객체지향 계층도를 직접 그려보는 겁니다. 전자는 다소 쉬운 편이죠. 구체적인 예를 제시하면 추가 점수를 딸 수 있습니다.

객체지향 계층도에 대한 질문을 할 때 카드게임과 같은 간단한 애플리케이션을 제시하면서 그 애플리케이션에 대한 클래스 계층도를 그려보라고 물어볼 수도 있습니다. 주로 게임 디자인에 대한 질문을 많이 던지죠. 아무래도 접해본 사람이 많고 데이터베이스 구현과 같은 질문보다는 무난하기 때문입니다. 물론 답변으로 제시하는 계층도는 디자인할 대상이 되는 게임이나 애플리케이션의 종류에 따라 크게 달라집니다. 이때 다음과 같은 사항을 명심하세요.

 

▶ 면접관은 여러분의 사고 과정을 보고 싶어 합니다. 자신 있게 말하고, 브레인스토밍도 하고, 면접관과 적극적으로 토론하세요. 잘못 답변해도 겁먹지 말고 즉시 수정해서 더 나은 방향을 제시하세요.

▶ 면접관이 제시하는 예제 애플리케이션을 면접자가 잘 알고 있다고 생각할 수도 있습니다. 블랙잭과 같은 게임을 한 번도 해보지 않았는데 이를 디자인하라는 질문을 받으면 다른 예를 제시해 달라고 부탁해보세요.

▶ 계층도의 표현 형식을 구체적으로 정해주지 않았다면 클래스 다이어그램을 트리 형태로 표현하는 것이 좋습니다. 여기에 각 클래스마다 메서드와 데이터 멤버를 개략적으로 표현해보세요.

▶ 제시한 디자인이 좋다는 근거를 제시해 달라는 질문을 하거나 어떤 요구사항이 추가되면 어떻게 수정할지 물어볼 수도 있습니다. 이렇게 질문한 이유가 여러분이 제시한 디자인에서 면접관이 실제로 결함을 발견했기 때문인지 아니면 단순히 설득 능력을 보기 위해 공격하는 입장을 취한 것인지 잘 판단해서 대답하세요.

 

 

재사용을 고려한 디자인

 

재사용을 고려한 코드를 디자인하는 방법을 질문하는 경우는 드물죠. 이런 질문을 하지 않는 회사는 좀 심각합니다. 한 가지 용도의 코드만 구현할 줄 아는 개발자로만 구성된 팀은 개발 역량이 떨어지기 때문입니다. 간혹 코드 재사용에 대한 실력을 갖추고 있어서 면접 때 이를 질문하는 회사도 있습니다. 이런 질문을 하는 회사라면 괜찮은 회사라고 생각해도 됩니다.

 

기억할 사항

 

▶ 추상화 원칙

▶ 서브시스템과 클래스 계층 생성 방법

▶ 인터페이스를 제대로 디자인하기 위한 일반적인 규칙

     (예 : 구현에 대한 세부사항 없이 public 메서드로만 구성된 인터페이스)

▶ 템플릿과 상속이 필요한 경우

질문 유형

재사용에 대해 질문할 때는 흔히 지원자가 예전에 참여한 프로젝트에 대해 물어봅니다. 예를 들어 일반 사용자와 전문가를 위한 비디오 편집 애플리케이션을 제작하는 회사에 다녔다면 두 가지 버전의 애플리케이션에서 공통되는 코드를 어떻게 관리했는지 물어볼 수 있겠죠. 코드 재사용에 대해 직접적으로 묻지 않고 다른 질문에서 간접적으로 확인할 수도 있고요. 예전에 작성했던 모듈에 대한 질문을 받았다면 그 모듈을 다른 프로젝트에서도 활용한 적이 있는지도 언급해보세요. 단순히 코딩에 대한 질문을 받더라도 항상 인터페이스에 대한 고려사항도 함께 언급하면 좋습니다. 이때도 마찬가지로 예전 회사의 지적재산권을 침해하지 않도록 주의하세요.

 

 

메모리 관리

 

스마트 포인터의 개념과 메모리 관리에 대한 질문도 자주 나옵니다. 스마트 포인터보다 로우레벨의 메커니즘에 대해 질문할 수도 있습니다. 이러한 질문을 던지는 이유는 내부 구현사항에 대해서는 모르고 C++의 객체지향 특성만 알고 있는지 확인하기 위해서죠. 메모리 관리에 대한 질문이 나온다면 여러분이 가진 내공을 발휘하기 좋은 기회라고 생각하면 됩니다.

 

기억할 사항

 

▶ 스택과 힙을 그림으로 표현할 줄 알아야 합니다. 내부 메커니즘을 이해하는 데 도움이 되기 때문입니다.

▶ 로우레벨 메모리 할당 및 해제 함수의 사용을 자제합시다. 요즘은n ew, delete, new[], delete[], malloc(), free()와 같은 함수를 직접 호출하지 않고 스마트 포인터를 사용하는 추세입니다.

▶ 스마트 포인터를 제대로 이해해야 합니다. std::unique_ptr를 기본으로 사용하고, 공유할 대상은 shared_ptr로 표현합시다.

▶ std::unique_ptr는 std::make_unique()로 생성합니다.

▶ std::shared_ptr는 std::make_shared()로 생성합니다.

▶ 이미 폐기됐고 C++17부터는 완전히 삭제된 std::auto_ptr는 절대로 사용하지 않습니다.

▶ 로우레벨 메모리 할당 함수를 굳이 사용해야 한다면 malloc()이나 free()보다는 new, delete, new[], delete[]를 사용합니다.

▶ 객체를 가리키는 포인터 배열을 사용할 때는 각 원소에 있는 포인터마다 메모리를 할당하고 해제해야 합니다. 배열 할당 구문은 포인터까지 처리해주지 않습니다.

▶ 메모리 할당 문제를 검사해주는 도구(예: 밸그라인드)를 이용하면 메모리 문제를 쉽게 찾을 수 있다는 것도 알아둡시다.

 

질문 유형

 

버그를 찾으라는 질문을 살펴보면 이중 삭제, new/delete/new[]/delete[]가 서로 대칭을 이루지 않는 문제, 메모리 누수 등과 같은 메모리 관련 질문이 함께 담겨 있는 경우가 많습니다. 포인터와 배열을 상당히 많이 사용하는 코드를 분석할 때는 메모리 상태를 그림으로 표현해서 코드가 실행되면서 상태가 변하는 과정을 추적합니다.

지원자가 메모리에 대해 제대로 알고 있는지 확인하기 좋은 또 다른 방법은 포인터와 배열의 차이점을 묻는 겁니다. 둘 사이의 차이점이 너무 미묘해서 갑작스레 질문을 받으면 당황할 수 있으니 미리 알아두세요(전문가를 위한 C++의 7장을 참고하세요).

메모리 할당에 관한 질문에 답변할 때는 스마트 포인터의 개념과 스마트 포인터를 사용하면 메모리를 비롯한 리소스를 자동으로 해제할 수 있다는 점을 반드시 언급하기 바랍니다. 또한 C 스타일 배열 대신 std::vector와 같은 표준 라이브러리 컨테이너를 사용하면 메모리를 알아서 관리해주기 때문에 훨씬 좋다는 점도 강조해보세요.

 

 

 

다음 편에서 계속됩니다

 

 

▼ 관련 도서 보러가기 ▼

 

B3215427289_l.jpg

 

 

댓글 입력
자료실