- C++
1 개요
C++는 기본적으로 C언어를 확장한 언어이다.
- 객체지향과 일반화 프로그래밍을 포함하는 멀티 패러다임이다.
- 언어 설계 자체가 성능을 추구하므로, 자바나 C#과 같은 언어보다 빠르고 네이티브로 컴파일된다.
- 언어 및 라이브러리의 기능이 복잡해서, 다른 언어보다 비교적 어렵고 생산성이 낮다고 평가받는다.
2 C언어와의 관계
C언어와는 다음의 특성을 지닌다.
- C언어와 설계 지향점이 다르기 때문에, 전혀 다른 언어로 보는 것이 안전하다.
- C언어를 부분집합으로 갖지만, 일부 과거 버전은 그렇지 않았던 경우도 있었다.
3 메모리 관리
C++는 메모리 관리를 자동으로 수행하는 표준 라이브러리가 있지만, 오래된 코드에서는 이를 전부 수동으로 관리했다.
C++는 자바나 C#과 같은 언어와 완전히 다른 방식으로 메모리 관리를 한다는 것을 유의해야 한다. 자바나 C#에서는 다른 객체에서 객체를 생성해서 넘겨주는 방식이 적지 않게 사용되지만, C++에서 이는 메모리 문제를 일으키기 쉽다. 그러나, C++11 이후 shared_ptr와 같은 스마트 포인터가 추가되면서, 이러한 구현 자체가 문제되지는 않게 되었다.
4 모던 C++
C++98 이후 별다른 변화없이 사용되었으나, C++11이 등장하면서 급격하게 변화하기 시작했다.
C++ 표준 위원회는 업데이트가 잘 완성된 후 발표하려 했던 접근 방식 때문에 개정판의 발표가 늦어진 것이라고 자평하고, C++11 이후 기차 모델로 3년마다 개정판을 출판하기로 결정했다. 기존의 C++ 호환성을 어느 정도 유지하면서, 점차 다른 언어의 장점을 가져오고 단점을 지워나가고 있다.
4.1 C++11
C++11 언어에는 다음의 주요 기능이 추가되었다.
C++11 표준 라이브러리에는 다음의 주요 기능이 추가되었다.
4.2 C++14
C++14는 마이너 버전 성격을 지니며 다음의 주요 기능이 추가되었다.
- 함수 반환형 추론 지원
- 람다 함수 개선
4.3 C++17
C++17 언어에는 다음의 주요 기능이 추가되었다.
- if문과 switch문에서의 초기화 구문 허용
- 아스키코드 이외의 문자를 사용한 UTF-8 문자열 선언 허용
C++17 표준 라이브러리에는 다음의 주요 기능이 추가되었다.
4.4 C++20
C++20에는 다음의 주요 기능이 추가될 예정이다.
4.5 시범 사양
시범 사양에는 네트워크 라이브러리, 리플렉션 그리고 2D GUI 라이브러리 등이 있다. 이러한 것들이 표준이 된다면, C++ 표준 라이브러리 만으로 크로스 플랫폼 소프트웨어를 만드는 일도 어렵지 않게 될 것이다.
5 주석
- ↑ 우측값 참조는 앝은 복사를 수행한다. 복사되는 개체가 더 이상 사용될 필요가 없는 경우, 개체의 전체를 복사하는 대신 값을 단순히 대입함으로서 오버 헤드를 줄일 수 있다. 컴파일러 차원의 자동 최적화는 코드 손상의 여지가 있기 때문에 지원하지 않는다.
- ↑ auto 키워드를 통해 타입 이름이 긴 변수를 선언하면, 길이를 줄일 수 있다.
- ↑ 표준 라이브러리의 반복자보다 코드가 간결해진다.
- ↑ 람다 함수는 코드 블럭이나 함수 안에 삽입 될 수 있으며 참조도 가능하다.
- ↑ 표준화된 문법으로써, 코드의 각 부분에 추가하여 컴파일러가 이를 참고할 수 있다.
- ↑ shared_ptr와 같은 함수를 통해 쓰레기 수집을 참조 횟수 계산 방식으로 지원한다. C++11에서 auto_ptr은 사용되지 않음으로 처리되고 C++17에서 제거되었다.
- ↑ 기본적으로 ECMAScript의 정규 표현식을 사용하며, grep 나 sed에서 사용되는 정규 표현식도 옵션 인자를 통해 사용할 수 있다.
- ↑ 유니코드를 출력하려면 유니코드 로케일을 운영체제에서 지원해야 하며, 그렇지 않은 경우 변환해야 한다.
- ↑ C언어의 time.h에 포함된 기능과 달리, 나노초 단위의 측정도 가능하다.
- ↑ 정렬과 같은 표준 라이브러리의 함수에 이러한 기능이 추가되었다.
- ↑ C++20 이전이라도 불가능하지는 않다. 다만, Boost와 같은 라이브러리 지원이 필요하다.
- ↑ 각각의 소스코드에 헤더 파일을 일일이 포함하는 대신, 미리 컴파일된 헤더 파일을 사용하는 것과 같다. 이는 컴파일 시간 단축에 효과적이지만, 매크로의 사용에 제약이 있기 때문에, C++로 작성된 소프트웨어의 소스코드의 구조가 급격하게 변화할 수 있다.
- ↑ 템플릿 변수의 조건을 일부러 틀리게 하는 트릭을 넣을 필요가 적어지기 때문에, 코드가 간결해지고 가독성이 증가한다.