[스택, 큐, 트리, 힙]

  • 스택: 먼저 넣게 되는 자료가 마지막으로 나오게 되는 First-In Last-Out(FILO) 구조이다. 데이터가 들어가고 나오는 입구가 하나뿐이므로 입구로 들어간 데이터가 스택에 차곡차곡 쌓여있다가 들어간 반대 순서로 나온다. 마지막에 들어간 원소가 처음에 나온다.
  • 큐: 먼저 넣게 되는 자료가 가장 먼저 나오는 First-In First-Out(FIFO) 구조이다.
  • 트리: 정점과 간선을 이용해 사이클을 이루지 않도록 구성한 Graph의 특수한 형태로, 계층이 있는 데이터를 표현하기에 적합하다.
  • 힙: 최댓값 또는 최솟값을 찾아내는 연산을 쉽게 하기 위해 고안된 구조로, 각 노드의 키값이 자식의 키값보다 작지 않거나(최대힙) 그 자식의 키값보다 크지 않은(최소힙) 완전이진트리이다.

 

[리스트/벡터 차이]

  • 벡터는 메모리가 연속적으로 되어 있어 읽는 속도가 빠르지만 맨뒤를 제외한 모든 곳의 삽입삭제는 밀고 당기는 비용이 발생
  • 리스트는 불연속적으로 나열되어 있어 읽는 속도는 벡터보다 느리지만 지점을 찾아 연결된 링크만 수정하면 되어 삽입삭제가 효율적입니다. 

 

버블소트, 셀렉소트, 머지소트, 퀵소트 ]

  • 버블소트는 서로 인접한 두 원소를 비교하여 정렬하는 알고리즘입니다. 0번 인덱스부터 n-1번 인덱스까지 n번까지의 모든 인덱스를 비교하며 정렬합니다. 시간복잡도는 O(n2)입니다.
  • 셀렉소트는 원소를 넣을 위치를 정해두고 어떤 원소를 넣을지 선택하는 알고리즘입니다. 첫번째 자료를 두번째 자료부터 마지막 자료까지 차례대로 비교하여 가장 작은 값을 찾아 첫번째에 놓고, 두번째 자료를 세번재 자료부터 마지막 자료까지 차례대로 비교하여 그 중 가장 작은 값을 찾아 두번재에 놓고 ... 이러한 과정을 반복하여 정렬을 수행한다. 시간복잡도는 O(n2)입니다.

 

[BST(Binary Search Tree)]

  • 이진탐색트리는 데이터의 삽입, 삭제, 탐색 등이 자주 발생하는 경우에 효율적인 구조로, 이진 트리이면서 같은 값을 갖는 노드가 없어야한다.
  • 왼쪽 서브 트리에 있는 모든 데이터는 현재 노드의 값보다 작고, 오른쪽 서브 트리에 있는 모든 노드의 데이터는 현재 노드의 값보다 크다. 즉, 정렬이 되어있어야 한다.

 

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

기술 면접 #1 [프로그래밍기본]  (0) 2021.11.07

[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