C++이란?
C언어와 조상을 공유하고 객체 지향 및 일반화 프로그래밍과 같은 멀티 패러다임을 지원하는 프로그래밍 언어
객체 지향 프로그래밍
객체 지향 프로그래밍(Object-Orented Programming / OPP)이란 프로그램 설계방법론의 일종으로, 명령형 프로그래밍에 속한다. 단순히 데이터와 처리 방법으로 나누는 게 아닌, 프로그램을 수많은 '객체(object)'라는 기본 단위로 나누고 이들의 상호작용으로 서술하는 방식이다.
(객체란 하나의 역할을 수행하는 '메소드와 변수(데이터)'의 묶음으로 봐야 한다)
하위 단위의 문제를 해결할 수 있는 객체들을 만들고, 이들을 조합해 상위 문제를 해결하는 상향식(Bottom-up) 해결법이다. 객체를 독립성/신뢰성이 높게 만들어두면 이후 수정 없이 재사용이 가능하므로 개발 기간과 비용이 대폭 감소한다.
캡슐화(Encapsulation)
변수와 함수를 하나의 단위로 묶는 것을 의미한다, 즉, 데이터의 번들링(bundling)이다. 대게 클래스를 통해 구현되고, 해당 클래스의 인스턴스 생성을 통해 클래스 안에 포함된 멤버 변수와 메소드에 쉽게 접근할 수 있다. 대부분의 객체 지향 프로그래밍 언어에서 지원한다.
정보 은닉(Information hiding)
프로그램의 세부 구현을 외부로 드러나지 않도록 특정 모듈 내부로 감추는 것이다. 내부의 구현은 감춰 모듈 내 응집도를 높이고, 외부로의 노출은 최소화해 모듈 간의 결합도를 떨어뜨려 유연함과 유지보수성을 높이는 개념은 거의 모든 현대 프로그래밍 언어에 녹아 있다.
클래스 외부에서는 바깥으로 노출된 특정 메소드에만 접근 가능하며 내부에선 어떤 식으로 처리되는지 알지 못하도록 설계한다.
public : 클래스의 외부에서 사용 가능하도록 노출시키는 것
protected: 다른 클래스에게는 노출되지 않지만, 상속받은 자식 클래스에게는 노출되는 것
private: 클래스의 내부에서만 사용되며 외부로 노출되지 않는다.
정보은닉은 캡슐화로부터 파생된 보조 개념이며 '캡슐화 = 정보 은닉'은 아니다.
표준 템플릿 라이브러리(Standard Template Library, STL)
타입 독립적인 자료구조와 알고리즘을 사용하는 일반화 프로그래밍(Generic Programming) 개념을 구현하기 위해 개발되었던 C++ 라이브러리를 지칭하는 말이다. STL은 크게 컨테이너, 반복자, 알고리즘의 3가지로 구성되어 있다.
컨테이너
자료를 저장하는 클래스 템플릿의 집합. 구현하고자 하는 동작에서 가장 오버헤드가 걸릴 것으로 생각되는 부분을 고려하여 container를 선택하면 성능 향상에 도움이 된다.
- vector/deque: 크기가 자동으로 동적 할당되는 배열이며 operator overloading을 통해 C배열과 거의 비슷하게 사용 가능하다.
vector는 임의 위치 참조 O(1), 끝에 삽입/삭제 O(1), 끝을 제외한 임의 위치에서의 삽입/삭제 O(n)
deque는 앞/끝 모두에서 O(1)로 삽입/삭제가 가능하지만 vector와는 달리 메모리 상에서 연속적인 공간으로 할당되진 않는다.
- list/forward_list: 양방향/단방향 연결 리스트. 임의 위치 참조 불가, 검색 O(n), 대신 위치를 알고 있는 경우 어느 위치에서나 삽입/삭제 O(1).
- set/multiset: 정렬이 가능한 객체들을 담기 위한 container로 삽입 시점부터 정렬된 상태로 저장된다. 구현은 대개의 경우 red-black tree를 이용한다. 삽입/검색/삭제 O(log n).
set의 경우 정렬 시 사용되는 값이 유일해야 함
multiset의 경우 정렬 시 같은 값일 경우 삽입된 순서가 유지된다.
- map/multimap: 정렬 가능한 key와 그 key가 가리키는 객체의 pair로 저장된다.
map은 key가 유일
multimap은 key가 유일하진 않으며, 같은 경우 삽입된 순서가 유지된다.
- unordered_set/unordered_multiset/unordered_map/unordered_multimap: 위의 개념과 유사하나 red-black tree 대신 hash를 이용하여 구현되어 시간복잡도도 hash의 특성을 따른다. 삽입/검색/삭제는 평균적으로 O(1), 최악의 경우 O(n)
- stack/queue/priority_queue: 위의 컨테이너들을 이용하여 스택, 큐, 우선순위 큐를 위한 인터페이스를 제공한다. 컨테이너 어댑터에 속하며 컨테이너는 아니다.
반복자
컨테이너의 원소를 순회하는 방법을 추상화한 객체들
-
forward_iterator
-
reverse_iterator
-
insert_iterator
-
input_iterator_tag
-
output_iterator_tag
-
bidirectional_iterator
-
random_iterator
알고리즘
반복자로 지정되는 자료의 집합에 대한 작업을 정의해놓은 템플릿 함수
-
for_each
-
transform
-
generate
-
find
-
binary_search
-
stable_sort
-
sort
일반화 프로그래밍(Generic Programming)
C++에서는 템플릿(Template), C#이나 JAVA에서는 '제너릭(generics)'으로 불리는 기능을 통하는 일반화 프로그래밍이 있다.
함수나 클래스 등을 구상할 때, 동작하는 논리는 같으나 매개변수로 입력되는 데이터의 형식만 다르게 똑같은 코드를 다시 만들어야 되는 상황이 발생하는데, 이때 일일이 오버로딩을 통해 각각의 데이터 형식에 따라 구현하는 번거로운 방법 발고 하나의 형식으로 일반화해 코드를 간결하게 유지할 수 있다.
'취미' 카테고리의 다른 글
Java 기본 지식 (0) | 2023.08.14 |
---|---|
바이올린 연습 및 업그레이드~ (0) | 2023.04.14 |
댓글