본문 바로가기
CS(computer science)/C , C++

C / C++ 기술 면접 질문

by clean_h 2021. 11. 23.
728x90

C / C++ 기술 면접 질문

여기저기 구글링하여 모은 기술 질문들을 적어본다.

위키백과

 

 

질문 리스트 

 

 

Q) C와 C++의 차이는 무엇인가?

더보기

A) 2022.01.07 - [CS(computer science)/C , C++] - CS 지식 / C와 C++의 차이

 

CS 지식 / C와 C++의 차이

C와 C++의 차이 두언어의 차이는 C언어는 절차지향 프로그래밍(Procedure Oriented Programming)이고 C++언어는 객체지향 프로그래밍(Object Oriented Programming)이라는 것이다. C++은 C를 발전시켜 만든 언..

se-jung-h.tistory.com

 

C언어는 절차지향 프로그래밍, C++언어는 객체지향 프로그래밍이다. 

절차지향은 순차적으로 처리하고 객체지향은 객체 중심으로 데이터와 메소드를 만들어 엮어 처리한다. 객체 지향은 캡슐화, 상속성과 같은 특징을 가지며 구조화 되어있다. 

 

 

 

Q) C++ 상속 관계 & 다형성

더보기

A) C++의 가장 큰 특징이 상속과 다형성이다.

 

상속은 자신의 멤버 변수와 멤버 함수를 자식 클래스에게 물려주는 것이다. 부모 클래스의 모든 멤버들을 자식 클래스가 물려받는다. 자식클래스가 부모 클래스의 속성을 재사용하는 것이다. 

 

다형성은 객체들의 타입이 다르면 똑같은 함수를 호출해도 서로 다른 동작을 하게 된다. 하나의 코드로 다양한 타입의 객체를 처리할 수 있는 기술이다. 

 

 

 

 

Q) constructor와 destructor은 무엇인가?

더보기

A) constructor은 생성자 destructor은 소멸자

C++에서 객체를 생성하거나 제거할 때 생성자와 소멸자가 사용된다.

 

생성자를 이용하여 객체를 생성함과 동시에 멤버 변수를 초기화 할 수 있다. 생성자는 특별한 메소드로 클래스 이름과 동일한 이름으로 구현된다. 생성자를 따로 구현하지 않는다면 객체를 생성할 때 Default로 멤버 변수가 NULL로 초기화 된다. 또한 생성자는 입력 매개 변수를 다르게 함으로써 중복 정의할 수 있다. 

 

소멸자는 객체를 더이상 사용하지 않을 때 객체를 제거하기 위해  호출되는 함수이다. 객체의 메모리 반환을 위해 사용한다. 클래스 이름 앞에 ~가 붙은 형태로 사용된다. 

 

 

 

Q) C++에서 default constructor는 무엇을 의미?

더보기

A) default constructor은 기본 생성자이다.

객체를 생성할 때 매게 변수를 선언하기 위해 생성자가 필요하다. 이때 생성자가 없는 경우 컴파일러에 의해 자동적으로 생성자를 default constructor이라고 한다. 

 

이때 클래스에 생성자가 하나라도 선언되어있다면 default constructor은 자동으로 생기지 않아 오류가 발생할 수 있다.

 

 

 

Q) C++에서 Virtual은 왜 존재하는가?

더보기

A) 함수 앞에 virtual을 붙이면 가상 함수가 된다.

가상함수는 파생 클래스에서 재정의할 것으로 기대하는 멤버 함수를 의미한다. 즉 부모 클래스에서 선언한 함수가 자식 클래스에서 재정의할 것을 알려준다. 상속에서 오버라이딩 할 때 사용한다. 

 

바인딩은 프로그램 요소의 성격을 결정해주는 것이다. 이 과정이 컴파일 시점에서 이뤄지면 정적바인딩 실행도중에 이뤄지면 동적바인딩이다. C++에서는 기본은 정적바인딩이다. 

 

동적바인딩을 하기 위해 가상함수를 바꿔 선언하여 사용한다. 컴파일 시점에서 결정나기 때문에 가상함수를 사용하여 객체의 타입에 따라 멤버 함수를 선택한다. 가상 함수는 컴파일 시점에 바인딩이 이뤄지지 않고 보류상태로 둔다. 

 

동적바인딩을 사용하면 어떤 포인터에 의해 접근되었는 지에 상관없이 참조된 인스턴스의 실제 클래스형에 따라 재정의된 함수 호출이 가능하다. 

 

 

 

Q) 오버로딩과 오버라이딩

더보기

A) 오버로딩(Overloding): 함수 중복 정의, 오버라이딩(Overriding) : 함수 재정의

 

오버로딩은 함수명이 같은 함수를 중복 정의 하는 것이다. 파라미터 개수, 파라미터의 자료형에 따라 여러개의 같은 이름의 함수를 만들 수 있다.

 

오버라이딩은 상속 관계에서 함수 재정의할 때 사용한다. 상속받았을 때 부모 클래스의 함수를 사용하지 않고 다른 기능을 실행할 때 함수를 자식클래스에 같은 이름, 같은 자료형으로 재정의 해서 사용한다. 

 

 

 

Q) \n과 endl의 차이는 무엇인가?

더보기

A) \n과 endl 모두 출력할 때 개행(줄 띄움)을 위해 사용한다.

둘의 차이는 endl은 출력 버퍼를 비워주는 과정(flush)이 들어가 있어서 \n보다 느리다. 

 

버퍼는 입출력을 프로그램에 바로 전달하지 않고 임시 메모리 공간에 저장한 후 한번에 전송하는 역할을 한다. 버퍼를 즉시 비우고 싶다면 endl을 그렇지 않다면 \n을 사용한다. 

 

하지만 구현체에 따라서 버퍼를 비우도록 처리하는 경우도 있다고 한다.

 

참고 - https://yechoi.tistory.com/48 

 

 

 

 

 

Q) malloc과 new의 차이는 무엇인가?

더보기

A) malloc과 new 모두 동적할당을 하기 위해 사용된다. 

 

보통 malloc은 C언어에서 new는 C++ 언어에서 사용된다. 

 

malloc은 함수고 new는 연산자이다. 

malloc은 heap 영역에서, new는 dynamic memory에서 할당된다. 

 

malloc은 초기값 지정 불가능하고, new는 초기값 지정이 가능하다. new는 객체에서 생성자를 자동으로 호출하고 초기화해준다. 

 

객체의 경우에는 new를 사용하는 것이 맞지만, 재할당이 많이 일어날 경우에는 malloc으로 동적할당하는 경우도 있다. realloc과 같은 함수가 존재 때문에 malloc을 이용하는 경우도 있다. 

 

 

 

Q) struct와 class의 차이는 무엇인가?

더보기

A) C++에서 struct와 class는 객체를 구조화 역할을 한다.

struct에서는 기본 한정자가 public이고, class에서는 private이다.

 

C++ 객체지향에서는 상속이 가능하다는 특징이 있다. 하지만 구조체는 상속이 불가능하다. 따라서 상속이 필요하다면 class를 사용해야한다. 

구조체와 class모두 상속이 가능하고 함수를 추가할 수도 있다.

 

 

 

Q) 얕은 복사와 깊은 복사

더보기

A) 

 

객체를 생성하고 초기화시킬 때 멤버변수를 어떻게 초기화하느냐에 따라 얕은 복사, 깊은 복사를 나눈다.

 

얕은 복사는 실제 데이터가 아닌 단지 메모리 주소만을 복사한다.

 

깊은 복사는 변수가 관리하는 리소스 자체를 복사(새롭게 메모리를 할당)하여 새롭게 멤버 변수에 복사한다. 얕은 복사에 비해 작업 시간과 리소스의 소모가 따른다. 

 

얕은 복사

 

깊은 복사

 

https://bblackscene21.tistory.com/6

 

[C/C++ 공부] 깊은 복사와 얕은 복사 차이? (feat.복사 생성자)

객체를 생성하고 초기화시킬 때 멤버 변수를 어떻게 초기화하느냐에 따라 깊은 복사가 될 수 있고, 얕은 복사가 될 수 있습니다. *디폴트 생성자가 아닌 일반 생성자는 생성자의 인수를 전달 받

bblackscene21.tistory.com

 

 

 

Q) 입출력 실행속도 높이는 방법

더보기

A)

2021.04.10 - [알고리즘/개념정리] - 알고리즘(C++) / cin, cout 입출력 속도 높이기

 

알고리즘(C++) / cin, cout 입출력 속도 높이기

백준 2751문제를 풀 때 입력과 출력은 맞게 나오는데 결과는 시간 초과라는 결과가 나왔다. 알아본 결과 cin과 cout을 사용할 때 시간이 상당히 걸린다는 것을 알았다. 그래서 cin과 cout의 입출력 속

se-jung-h.tistory.com

 

이전에 정리해둔 C++에서 cin, cout 입출력 속도 높이는 방법이다. 

C++에서 printf와 scanf보다 cin, cout은 속도가 현저히 떨어진다. 그럴때 다음 코드를 추가해서 입출력 실행속도를 줄일 수 있다. 

 

ios::sync_with_stdio(false);

다음은 C++의 iostream을 C의 stdio와 동기화를 끄게 된다. iostream과 stdio의 버퍼를 모두 사용하므로 딜레이가 발생되는데 이를 끊어 실행 속도를 높아지게 한다.

 

하지만 이는 printf, scanf와 함께 사용하면 안되고, 싱글 쓰레드 환경에서만 사용이 가능하다.

 

 

 

Q) C++ 프로그램 빌드 과정

더보기

A) 전처리 → 컴파일러 → 어셈블러 → 링커

 

컴퓨터는 0과 1로만 이루어져있기 때문에 컴퓨터가 이해할 수 있도록 만들어 주어야 한다. 이런 과정을 빌드라고 한다. 

 

전처리(preprocessing) : 코드의 주석을 제거, define을 치환하는 기능을 한다.

컴파일러(compiler) : 어셈블리 파일로 변환한다. 어셈블리(저수준 언어)는 CPU 명령어 조합이다. (어휘 분석, 구문 분석, 의미 분석)

어셈블러(assembler) : 오브젝트 파일로 변환한다. 오브젝트 코드는 0과 1로 이루어진 코드를 말한다.

링커(linker) : 오브젝트 파일들을 묶어서 실행 코드 파일로 변환한다. 운영체제가 로딩할 수 있도록 주소 정보를 할당한 파일을 만들어 낸다. 번역된 파일을 하나로 연결해 실행가능한 파일로 만들어준다. 

 

 

컴파일 언어의 장점

  • 빌드가 완료된 실행가능한 파일은 실행 속도가 빠르다.

 

https://inpages.tistory.com/157

 

C/C++ 컴파일 과정 | gcc/g++ 명령어

소스 코드는 아래의 그림과 같은 컴파일 과정을 거쳐 실행 파일로 만들어 집니다. 전처리기preprocessor: 소스 코드의 주석 제거, define을 치환하는 기능을 합니다. 컴파일러compiler: 어셈블리 파일로

inpages.tistory.com

 

 

더보기를 누르면 각 질문에 대한 답변을 볼 수 있습니다.

 

 

참고 : 위키독스

 

 

C++ 알아두면 좋을 지식

 

 

728x90

'CS(computer science) > C , C++' 카테고리의 다른 글

CS 지식 / C와 C++의 차이  (1) 2022.01.07

댓글