변수
1. 데이터타입의 종류를 10개 이상 쓰고 어떤 타입인지 서술하시오.
- 문자형 : char(1byte), unsigned char(1byte)
- 정수형 : short(2byte), int(4byte), long(4byte), long long(8byte), unsigned short(2byte), unsigned int(4byte), unsigned long(4byte)
- 실수형 : float(4byte), double(8byte), long double(8byte)
- 논리형 : bool(1byte)
2. 지역변수, 전역변수, 동적할당 된 변수, static변수들은 각각 메모리 구조상 어떤 곳에 할당되고 언제 해제되는지 쓰시오.
- 지역변수 : 중괄호 내 선언되는 변수. 해당 중괄호에서 변수가 선언될 때 스택 영역에 할당되고, 중괄호가 끝나면 해제된다.
- 전역변수 : main문 외부에서 정의되는 변수로 데이터 영역에 할당된다. 프로그램이 실행될 때 할당되고, 프로그램이 끝나는 순간 메모리에서 해제된다.
- 동적할당 된 변수 : 힙 영역에 할당되는 변수. 사용자가 직접 원하는 시점에 원하는 크기만큼 가변적으로 메모리를 할당할 수 있다. 변수가 선언될 때 힙 영역에 할당되며 사용자가 직접 해제하는 시점에 메모리에서 해제된다.
- Static 변수 : 데이터 영역에 저장되어 값이 유지되는 변수. 프로그램이 실행될 때 할당되어 프로그램이 끝날 때 메모리에서 해제된다.
함수
3. 함수의 오버로딩과 오버라이딩의 차이에 대해서 서술하시오.
- 오버로딩 : 함수 이름은 같지만 매개변수를 다르게 정의하는 경우. 매개변수에 따라 함수를 다르게 정의하고 사용할 수 있다.
- 오버라이딩 : 부모의 함수를 자식에서 재정의 하는 것. 함수명과 매개변수를 똑같이 설정해줘야 한다.
4. 함수의 호출이 반복적으로 쌓인다면 어떤일이 일어나고, 쌓일 수 있는 최대 허용량을 초과하면 어떤 일이 일어나는지 서술하시오.
스택영역은 제한된 양의 공간을 가지는데, 함수 호출을 반복적으로 하게되면 스택영역에서 이용가능한 공간 이상을 사용하게 되고, 최대 허용량을 초과하면 스택 오버플로우가 일어난다.
일반적으로는 프로그램 충돌이 발생한다.스택영역과 힙 영역의 그림은 서로를 가르키고 있는데 그 이유는 서로의 영역을 침범할 수 있기 때문이다.
- 스택 오버플로우 : 스택 영역을 넘어 데이터가 저장되는 경우함수의 재귀 호출(자기 자신을 호출)이 무한이 반복될 때, 스택 영역에 데이터가 계속해서 쌓이고, 스택 영역을 넘어 데이터가 저장된다. 스택 영역을 넘어 데이터가 저장된 순간 스택 오버플로우가 발생하면서 프로그램은 스택 오버플로우에 의해 종료된다.
- 힙 오버플로우 : 힙 영역을 넘어 데이터가 저장되는 경우
포인터
5. 배열과 포인터는 어떤 상관관계가 있는지 짧게 서술하시오.
배열의 이름을 출력시키면 배열의 첫 번째 요소의 주소 값이 나온다.
즉 array={1,2,3,4,5}; cout<<array; 를 실행시킬 경우 array[0]의 주소값이 나온다.
array+ 1을 출력하면 array와 4byte의 차이가 나는데, 이는 즉 array가 int 타입의 포인터라고 볼 수 있다.
따라서 이를 이용해 각 배열의 원소에 접근 가능하며, array+I 는 &array[I]와 같다.
클래스
6. c++에서의 구조체와 클래스의 차이에 대해서 서술하시오.
- 클래스는 구조체와 다르게 접근제어자(접근제어 지시자)라는 개념이 존재한다.
접근제어자는 각 기능이나 속성에 접근 가능한 영역을 설정하는 것으로 private, protected, public이 있다.
private영역에 할당하게 되면 클래스 내부에서만 접근이 가능하다. protected는 상속된 클래스까지만 접근이 가능하고, public에서는 외부에서도 접근이 가능하다.
- 구조체는 값 타입으로 전달되는 형식이고, 클래스는 참조 값으로 전달되는 형식이다.
- 교수님 첨언
c++은 11버전 이전 이후로 많은 차이가 나는데 (11버전 이후를 모던 c++라고 부름)11버전 이전의 구조체에는 멤버변수밖에 쓰지 못했는데 (멤버함수 , 상속 등 x)11버전 이후에는 구조체와 클래스의 기능의 간극이 좁아져서 접근제어자의 차이밖에 남지 않았다.
7. 객체지향 OOP 3요소와 5원칙에 대해서 기입하시오.
객체지향 프로그래밍(Object Orientd Programming)의 3요소
(1)클래스 : 객체를 정의하는 틀, 또는 설계도와 같은 역할을 수행합니다.
(2)객체 : 클래스에서 정의한 것을 바탕으로 메모리 상에 할당된 것입니다.
(3)메시지(메서드) : 클래스로부터 생성된 객체를 사용하는 방법으로, 객체에 명령을 내리는 메시지라고 할 수 있습니다.
객체지향프로그래밍의 5원칙(SOLID) : 프로그램 설계 단계에서 프로그램 개발의 유지보수 및 생산성을 위해 지켜야할 규칙
(1)SRP(Single Responsibility Principle, 단일책임원칙) : 한 클래스는 하나의 책임만 가져야한다.
(2)OCP(Open-Closed Principle, 개방-폐쇄 원칙) : 소프트웨어 요소는 확장에는 열려있으나 변경에는 닫혀있어야 한다. 클래스에 기능이 추가되었을 때, 이 클래스를 사용하는 다른 클래스를 수정하면 안된다.
(3)LSP(Liskov Substitution Principle, 리스코프 치환 원칙) : 프로그램의 객체는 프로그램의 정확성을 깨트리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다. 자식클래스가 부모클래스의 속성을 유지하며 자식클래스만의 기능을 구현해야한다.
(4)ISP(Interface SegregationPrinciple, 인터페이스 분리 원칙) : 클라이언트가 자신이 이용하지 않는 메서드에 의존하지 않아야 한다. 작은단위의 인터페이스로 분리하라는 것을 의미한다.
(5)DIP(Dependenct Inversion Principle, 의존 역전 원칙) : 상위모듈은 하위모듈에 의존하면 안되고, 추상화는 세부사항에 의존해서는 안된다.
8. 클래스의 관계 is-a, has-a 관계를 설명하고, 캐릭터와 직업이라는 관계가 있을때 is-a관계로 설정할지 has-a관계로 설정할지에 대해 본인의 설명을 추가하시오
Is-a 관계는 일종의 ~이다 라는 뜻으로 노트북-전자기기와 같은 관계로, 부모 클래스의 속성을 자식클래스가 온전히 다 가지고 있는 경우에 성립합니다. 즉 부모클래스와 이를 상속하는 자식클래스의 관계를 나타냅니다.
반면 has-a 관계는 ‘플레이어가 아이템을 가지고 있다.’와 같이 하나의 객체가 다른 객체를 포함시켜 그 기능을 사용할 수 있는 관계입니다. 이 경우 상속이 아닌, 하위 클래스를 상위 클래스의 멤버로 포함시켜 그 기능을 활용할 수 있습니다.
상수화
9. const와 define의 차이에 대해서 서술하시오
const와 define 모두 상수화의 개념입니다.
define은 전처리기로 메인 함수가 실행되기 이전에 상수화 시키는 것으로 데이터타입을 따로 지정할 수 없으나, const는 변수의 상수화로 직접 데이터타입을 지정하여 사용 가능합니다.
define : 치환 const : 선언
자료구조
10. 배열과 벡터의 차이에 대해서 설명하시오
배열은 정의할 때 크기를 설정해야해서 이후 배열 내부의 수정이 어렵지만,
벡터는 가변배열으로, 배열에 비해 공간의 제약이 없고 다양한 멤버함수를 가지고 있어 벡터 내부에 요소 추가나 수정, 삭제 등이 용이하다.
교수님 첨언
내부의 요소를 수정할 필요가 없을 때 배열을 쓴다.
(수정이 없다는 stack영역의 강점을 이용하는 배열(?))
추가, 삭제를 많이 사용해야하는 경우에는 벡터 사용
11. 벡터와 링크드 리스트의 차이에 대해서 설명하시오
벡터는 메모리상에 연속적으로 할당된다.
그러나 링크드 리스트는 각 데이터를 연결시켜 만든 구조로, 메모리상에 연속적으로 할당되지 않는다.
따라서 링크드 리스트는 벡터와 다르게 데이터를 삽입/삭제 시 데이터의 이동은 일어나지 않고 , 연결 고리(참조)만 바뀌므로 삽입/삭제에 강점이 있지만, 탐색의 경우에는 매 데이터마다 다음 주소값을 찾아 떠나기 때문에 전체 데이터의 스캔이 수반되어야한다는 단점이 있다.
교수님 첨언
- 링크드리스트는 탐색이 약점. 벡터는 인덱스를 붙여 관리하기 용이하다. 탐색에 유리
- 그러나 중간에 데이터를 삽입하거나 삭제하는 경우 벡터는 이후 데이터를 한칸씩 미루거나 다 땡겨야하는데 데이터의 양이 커지면 이 부분이 어려워짐
- 링크드리스트는 연결지점만 바꿔주면 되기 때문에 이럴 경우에는 링크드리스트 활용
0808 추가)
stl : 벡터 / 맵 / 리스트
벡터의 장점 : 자료 검색이 용이 (탐색 x) - 데이터가 나열돼있어서
벡터의 단점 : 데이터 삽입과 삭제가 어렵다.
벡터에 데이터 삽입하는 두가지 방법
push back : 메모리를 끝에 삽입할 때 공간을 만들어서 데이터를 복사 해 넣어야해서 시간이 더 많이 걸림.
emplace back : 메모리 공간을 넉넉하게 가지고 있어 쉽게 데이터를 추가할 수 있어 처리속도가 더 빠르지만 차지하는 용량이 더 큼.