[C언어와 C++언어의 차이점에 대해 설명해보아라]

  • C는 절차 지향적 언어이고 해야할 작업을 순서대로, 함수 단위로 구성되며 기능별로 묶어놓은 특징이 있다.
  • C++은 C언어를 확장시킨 언어이며 객체 지향적 언어로 상속과 다형성을 특징으로 들 수 있습니다. 클래스를 활용하여 각각의 기능별로 구성이 가능하며 이를 나중에 하나로 합쳐서 프로그램의 완성이 가능하다. 객체 별로 개발이 가능하기에 팀 프로젝트를 하기에도 유리한 장점을 가지고 있다. 또한 코드의 재사용이 가능하며 오류 발생 가능석이 적고 안정성이 높다.
  • C언어에서는 같은 이름을 가진 함수가 존재할 수 없지만, C++에서는 가능하다.(오버로딩, 오버라이딩)
  • C언어에서는 변수, 함수를 초기에 작성해야 하지만, C++에서는 중간에 어디서든 선언이 가능하다.

 

[malloc()과 new의 차이점]

  • malloc()은 함수이고 new는 연산자 입니다. 
  • malloc()은 시스템 함수로서 함수안에서 메모리를 할당하지만 new는 연산자로 바로 메모리를 할당하는 것이 아니라 생성자를 호출해서 메모리를 할당합니다.  생성자를 통해서 호출하기 때문에 new로 메모리를 할당하면 생성 시 초기화가 가능한 장점이 있습니다. 

 

[클래스(class)와 구조체(struct)의 차이점]

  • 구조체는 하나의 구조로 묶일수 있는 데이터, 즉 변수들의 집합
  • 클래스는 변수 뿐만 아니라 함수(메서드)까지 포함시킬 수 있다는 점.
  • 하지만 C에서도 함수포인터를 이용해 구조체를 클래스화 시킬수 있다.

 

[프로세스와 스레드의 차이점 ]

  • 프로세스는 실행되고 있는 프로그램을 말합니다. 프로세스는 운영체제로부터 독립된 시간, 공간 자원을 할당 받아 실행된다.
  • 스레드는 프로세스 내에서 실행되는 흐름 단위로 한 프로세스 내에서 많은 자원을 공유하면서 병렬적으로 실행된다.

 

[스레드에서 동기화란 무엇이며 어떠한 경우에 사용하는가?]

  • 다중 스레드에서 하나의 자료에 접근할 때 사용한다.
  • 사건이 동시에 일어나거나, 일정한 간격을 두고 일어나도록 시간의 간격을 조정하는 것입니다. 
  • 예를 들면, 은행에서 돈을 인출할때 동시 출금 요청이 가능하다면 한쪽에서 출금 처리가 완료 될 때까지 다른 한쪽은 동기화 처리를 해서 기다리게 하는것. 

 

[포인터]

  • 포인터랑 메모리 주소를 저장하는 변수입니다.
  • 예를 들면, 엘레베이터에서 포인터는 해당 층을 표시하는 버튼이며, 10층 버튼을 누르면 10으로 이동하듯이 해당 위치를 가르키고 있는 변수이다.

 

[Call by reference와 Call by value ]

  • Call by reference는 매개변수로 원래 주소 값을 전달하는 방식
  • Call by value는 매개변수로 기본 데이터 형을 사용하는 것 주어진 값을 복사하여 처리하는 방식으로 함수 내의 처리결과는 함수 밖의 변수에는 영향을 미치지 않는다.

 

[오버로딩(overloading)과 오버라이딩(overriding)의 차이점]

  • 오버로딩이랑 함수의 이름만 같고 매개변수를 다르게 한 것을 말하고
  • 오버라이딩은 상속의 개념에서 나온것인데 부모클래스에서 선언된 함수를 자식클래스에서 재정의 하는 것을 말합니다.

 

[상속에 대해 설명하시오]

  • 상속은 기존의 클래스를 토대로 해서 새로운 클래스를 만드는 방법이라고 할 수 있다.
  • 클래스 A가 클래스 B를 상속받게 만들면 클래스 B는 “부모 클래스”가 되고, 클래스 A는 “자식 클래스”가 된다.
  • is-a 관계가 성립되어야한다(~은 ~이다.) 예를 들어 사람과 학생의 관계를 생각해보자(Person-Student)
    • Person is a student : “사람”은 “학생”이다. 이것은 성립이 X. 모든 사람이 학생일수는 X. 
    • Student is a person : “학생”은 “사람”이다. 이것은 성립이 O. 그래서 우리가 상속 클래스를 만들 때, Student 클래스는 자식클래스로 Person 클래스를 상속할 수 있는 것이다.
  • 부모 클래스는 자식 클래스에게 자신의 모든 멤버 변수와 함수를 물려준다. 물론 OOP에서는 물질적인 것 뿐만 아니라, 어떤 기본적인 사람의 특성들도 상속의 특성이 될 수 있다.
  • 상속받는 클래스를 만들기 위해서 class Student : public [상속할 클래스 이름] 이런식으로 상속이라는 문법을 사용할 수 있다. 
  • 상속을 사용한 프로그램은 메모리 공간 할당 -> 부모 클래스의 생성자 실행 -> 자식 클래스의 생성자 실행이라는 순서를 가지게 된다.

 

[Abstract Class(추상 클래스)에 대해 설명하시오]

  • 추상메서드를 하나 이상 가진 클래스이다.
  • 자신의 생성자로 객체 생성이 불가능하다. 그 이유는 몸체도 정의되어 있지 않은 추상  클래스의 객체를 만든다는 것은 아무런 의미가 없기 때문.  하지만 추상 클래스의 포인터는 선언이 가능하다.
  • 순수가상함수가 하나라도 선언되어있다면 그 클래스는 추상 클래스.
  • 하위 클래스를 참조하여 상위 클래스의 객체를 생성한다.
  • 하위 클래스를 제어하기 위해 사용한다.

 

[가상함수와 순수가상함수의 차이점 (virtual void func(); 와 virtual void func() = 0;)]

  • 객체포인터 변수에 부모클래스와 자식클래스를 담았을 때 오버라이딩된 함수를 실행하게되면 무조건 부모함수를 실행하게된다. 자식클래스에서 재정의한 의미가 없어짐. 그렇기 때문에 virtual이라는 키워드를 사용하여 가상함수로 만들게 된다면 객체포인터 변수에서 각각 해당하는 클래스의 함수를 호출하게 됨.
  • 만약 부모클래스에서 재정의 할 함수 앞에 virtual 키워드를 사용하면 자식클래스는 키워드를 적지 않아도 컴파일러에서 자동으로 가상 함수로 정의가 된다. 하지만 소스 코드의 이해를 돕기 위해 자식클래스에서도 virtual 키워드를 적는 것이 관례.
  • 순수가상함수는 가상함수와 달리 함수의 선언만 있고 정의는 없는것으로, 자식 클래스에서 반드시 재정의하여야만 한다. 재정의 하지 않는다면 오류 발생.
  • 예를 들면 동물은 먹는다, 잔다, 울다 등의 행동을 가지고 있기 때문에 동물 클래스를 상속받는 자식클래스들은 항상 이 행위들을 가지고 있어야 한다. 개는 멍멍, 고양이는 야옹 등등..

 

[Virtual table (가상 테이블)에 대해서 설명하시오]

  • 클래스 안에 가상함수가 포함되어 있을시 객체를 생성할 때 가상함수를 가리키는 포인터가 생성된다.
  • 이 포인터는 가상테이블의 시작주소를 가리키는 포인터고, 각 클래스마다 하나의 고유 가상테이블이 생성되게 됩니다.
  • 고유의 가상테이블은 가상함수를 가리키는 함수포인터배열로 되어있다. 즉, 가상 함수를 실행하려면 vptr-> vtable -> func() 를 호출하게 되는 것

 

[재귀함수에 대해 설명하시오]

  • 재귀함수란 함수 내에서 자기 자신을 다시 호출하는 형태
  • 장점 : 소스코드의 간결화가 가능하다.
  • 단점 : 연산 시간이 오래 걸린다. 또한, 잘못 작성시 프로그램이 무한루프에 빠질 수 있다.

출처/참고 : https://91ms.tistory.com/4?category=711086 

출처/참고 : https://j2hworld.tistory.com/55

'기타 > 면접준비' 카테고리의 다른 글

기술 면접 #2 [자료구조/알고리즘]  (0) 2021.11.08

+ Recent posts