개발자 면접 공부/C-C++ 49

C++ STL 장단점

오늘은 C++의 STL의 장단점을 공부하도록 하겠습니다. STL이란? STL(Standard Template Library)는 C++의 표준 라이브러리를 지원합니다. 이 라이브러리를 이용하여 특정 기능을 작성하지 않고 제공되는 함수를 통해 손쉽게 기능을 구현할 수 있습니다. STL은 사전적으로 표준 템플릿 라이브러리이며 C++의 템플릿을 사용하고 있으므로 하나의 코드로 여러 결과를 보여줍니다. ex) vector v 벡터 자료구조에 int형으로 선언 STL의 기본 개념은 이미 구현되어 있는 공통적인 기능을 쉽게 사용하는 것 입니다. STL 장/단점? 그럼 이러한 STL의 장단점은 무엇일가요? 장점 단점 일반화를 지원합니다. 하나의 단일 알고리즘으로 여러 개의 컨테이너에 대해 동일한 작업이 가능합니다. 템..

C++의 인터페이스(Interface)

오늘은 C++의 인터페이스(Interface)의 개념을 공부하도록 하겠습니다. c++의 인터페이스 사실 c++에는 인터페이스 라는 키워드가 없습니다. Java는 인터페이스라는 키워드를 사용하는 것이 있고 또한 abstract라는 키워드를 사용하여 추상 클래스를 정의합니다. 하지만 c++은 그러한 키워드는 없고 개념만 가지고 있는 상태입니다. 보통 가상 함수 즉 virtual을 사용하여 오버라이딩을 기대하며 기반클래스에서 사용하는 방법을 다들 알고있을겁니다. 거기에 virtual함수 를 =0을 주면 pure virtual함수로 만들수 있다는 것도 알고 있습니다. 이것이 추상클래스라는 것도 알고있고요 virtual함수나 pure virtual함수에 대해 공부가 안되신 분들은 아래에 내용을 참고해서 공부해주시..

가상상속

오늘은 가상상속에 대해서 공부하도록 하겠습니다. 가상 상속이란??? C++에는 다중 상속을 지원하지만 JAVA는 다중 상속을 지원하지 않습니다. 다중상속에는 장점도 있지만 매우 큰 단점이 하나 있습니다. 장점은 객체에 재사용성을 즉 상속성을 좀더 유연하게 만들어 줄수 있습니다. 하지만 단점으로는 다이아몬드 상속 구조를 사용할 경우 매우 큰 성능 저하 및 메모리의 낭비가 올수 있습니다. 아래의 그림을 보시면 다이아 몬드 상속을 대표적으로 보여주고 있습니다. 이러한 상속 구조가 될경우 B나 C는 A를 포함하여 메모리상에 올리며 매우 좋은 상속 구조를 가질수 있지만 D같은 경우는 B 랑 C를 상속을 받지만 결국 B 랑 C는 A를 상속 받고 있기 떄문에 D는 메모리 구조상 A를 두번 할당을 받습니다. 또한, 생..

C++ 객체지향 언어 4가지 특징

오늘은 객체지향 언어 5가지 특징에 대해 공부하겠습니다. 개요 객체지향 언어는 실제 세상의 사물의 개념을 프로그램에서 객체라고 부르며 이러한 프로그램 기법은 프로그래머들에게 매우 직관적으로 표현할수 있어 좋습니다. 다만 절차지향 언어 보단 속도가 느리다는게 매우 단점입니다. 객체지향 언어의 4가지 특징에 대해 알아보도록 하겠습니다. 1. 캡슐화 캡슐화는 데이터(속성)와 데이터를 처리하는 함수를 하나로 묶은 것을 의미합니다. 캡슐화된 객체의 세부 내용이 외부에 은폐(정보 은닉)되어, 변경이 발생할 때 오류의 파급 효과가 적음 캡슐화된 객체들은 재사용이 용이 객체들 간의 메시지를 주고 받을 때 각 객체의 세부 내용은 알 필요가 없으므로 인터페이스가 단순해지고, 객체간의 결합도가 낮아짐 흔히 Class를 선언..

A* 알고리즘

오늘은 A*알고리즘의 대해 공부하겠습니다. A* 최단 경로 탐색 알고리즘 중 A* 알고리즘은 다익스트라 알고리즘의 확장 개념으로 만들어진 알고리즘입니다. 주로 게임에서 플레이어를 목표지점으로 이동시킬 때 사용하는 알고리즘으로 대표적인 그래프 탐색 알고리즘들과 A*의 차이점은 BFS 는 가중치가 없는 그래프에서 최단 경로를 찾는 완전 탐색 알고리즘 다익스트라는 가중치 그래프에서 시작 노드를 기준으로 모든 노드까지의 최단거리를 구하는 그리디 알고리즘입니다. 반면 A*는 가중치 그래프에서 시작 노드에서 목표 노드까지의 최단 경로만 구하려 하는 그리디 알고리즘 입니다. A*의 개념 A* 알고리즘은 휴리스틱 추정값을 통해 알고리즘을 개선할 수 있습니다. 이러한 휴리스틱 추정값을 어떤 방식으로 제공하느냐에 따라 얼..

다익스트라 vs BFS

오늘은 다익스트라(dijkstra)와 BFS의 차이점을 공부하겠습니다. 다익스트라 vs BFS 둘다 그래프 탐색 알고리즘 입니다. 두개의 차이점은 다음과 같습니다. 정점 V 간선 E 비교 다익스트라 BFS 사용 이유 가중치가 있는 그래프 탐색 가중치가 없는 그래프 탐색 시간 복잡도 O(VlogE) O(VlogE) 탐색 방법 간선이 음수가 아닌 탐색 최단 거리 탐색(가중치 비용이 있음) 너비 탐색을 하여 최단 거리 탐색(가중치 비용이 없음) 위와 같은 그림일 경우 BFS로 2번까지의 최단거리를 구할경우 0->(1,2)->3으로 BFS는 탐색하므로 매우 부적합 다익스트라는 0->1->3->2가 가능

C++ RAII

오늘은 RAII에 대해서 공부하도록 하겠습니다. RAII란? RAII는 Resource acquisition is initalization의 약자입니다. 직역을 해보면 "자원 획득을 초기화한다." 입니다. 이 RAII는 C++설계 패턴중 하나입니다. 설계 패턴인데 무슨 설계이면 동적인 프로그래밍을 위해 new라는 키워드를 사용해 힙 메모리에 할당을 받습니다.(자원 획득) 하지만 이러한 할당받고 관리를 해주는 것은 프로그래머에 일입니다.(java, C#같이 가비지 컬렉터가 있는거 제외) 해당 메모리 공간을 잘활용하면 매우 좋은 효과를 보겠지만 예기지않은 exception을 만나거나 다양한 이유로 할당받은 메모리를 해제하지 못하면 memory leak(메모리 누수)가 발생됩니다. 그럼 이런 생각을 할수 있습..

업 캐스팅 다운 캐스팅

오늘은 업 캐스팅 다운 캐스팅에 대해 공부하도록 하겠습니다. 캐스팅 이란? 캐스팅이란 타입을 변환하는 것을 의미합니다. C++는 상속관계에 있는 부모와 자식 클래스 간에는 서로 간의 형변환이 가능합니다. 업캐스팅 업캐스팅이란 자식 클래스의 객체가 부모 클래스 타입으로 형변환 하는 것을 말합니다. 아래의 코드에서 Human* h = s 이다 이 부분이 업 캐스팅 부분입니다. h가 student객체를 가르키지만 h는 Human타입이기 때문에 Human 클래스의 맴버에만 접근이 가능합니다. #include using namespace std; class Human { private: int m_Age; string m_BloodType; string m_Gender; public: Human(int Age, ..

싱글톤 패턴(SingletonPattern)

오늘은 싱글톤 패턴에 대해 공부하겠습니다. 싱글톤 프로그램안에서 어떤 클래스의 인스턴스가 단 1개만 존재 하도록, 폐쇄적으로 클래스를 디자인 하는 것 이러한 이득은 1. 코드의 가독성 여러개의 클래스가 아닌 하나의 클래스를 독자적으로 사용함 2. 불필요한 객체생성 피함 프로그램 코드를 짜다보면 불필요한 객체들이 여러 생성됩니다. 3. 코드의 세밀함 싱글톤을 만들기로 맘을 먹었다면 최대한 여러곳에서 사용할 수 있도록 설계해야함 #include using namespace std; class Singleton { private: Singleton() {} ~Singleton() {} private: static Singleton* m_Singleton; public: static Singleton* GetI..