편집을 취소할 수 있습니다. 이 편집을 되돌리려면 아래의 바뀐 내용을 확인한 후 게시해주세요.
최신판 | 당신의 편집 | ||
1번째 줄: | 1번째 줄: | ||
;C++ | ;C++ | ||
==개요== | |||
C++는 기본적으로 [[C언어]]를 확장한 언어이다. | |||
*객체지향과 일반화 프로그래밍을 포함하는 멀티 패러다임이다. | |||
*언어 설계 자체가 성능을 추구하므로, [[자바]]나 [[C#]]과 같은 언어보다 빠르고 [[네이티브 앱|네이티브]]로 컴파일된다. | |||
*언어 및 라이브러리의 기능이 복잡해서, 다른 언어보다 비교적 어렵고 생산성이 낮다고 평가받는다. | |||
==C언어와의 관계== | |||
C언어와는 다음의 특성을 지닌다. | |||
*C언어와 설계 지향점이 다르기 때문에, 전혀 다른 언어로 보는 것이 안전하다. | |||
== | |||
*C언어와 | |||
*C언어를 부분집합으로 갖지만, 일부 과거 버전은 그렇지 않았던 경우도 있었다. | *C언어를 부분집합으로 갖지만, 일부 과거 버전은 그렇지 않았던 경우도 있었다. | ||
22번째 줄: | 15번째 줄: | ||
템플릿은 제네릭보다 크게 확장된 개념으로, 자바나 C#의 [[제네릭 프로그래밍|제네릭]]보다 많은 역할을 수행한다. | 템플릿은 제네릭보다 크게 확장된 개념으로, 자바나 C#의 [[제네릭 프로그래밍|제네릭]]보다 많은 역할을 수행한다. | ||
컴파일 | 사실상 C++에 포함되며 성능을 위해 컴파일 시간에 전부 처리되는, 하나의 작은 프로그래밍 언어라고 봐도 무방하다. | ||
표준 라이브러리를 사용한다면, 무조건 템플릿을 사용하게 된다. | |||
예를 들어, 동적 배열 객체인 'vector<int>'은 int 타입에 특수화하여 int 배열을 생성한다. | 예를 들어, 동적 배열 객체인 'vector<int>'은 int 타입에 특수화하여 int 배열을 생성한다. | ||
템플릿은 컴파일 시간에 모든 과정이 처리되므로, 실행 시간에 int 대신 short 타입에 특수화할 수는 없다. | 템플릿은 컴파일 시간에 모든 과정이 처리되므로, 실행 시간에 int 대신 short 타입에 특수화할 수는 없다. | ||
==메모리 관리== | ==메모리 관리== | ||
C++는 [[메모리 관리]]를 자동으로 수행하는 표준 라이브러리가 있지만, 오래된 코드에서는 이를 [[포인터]]를 사용해 전부 수동으로 관리했다. | |||
C++는 자바나 C#과 같은 언어와 완전히 다른 방식으로 메모리 관리를 한다는 것을 유의해야 한다. | C++는 자바나 C#과 같은 언어와 완전히 다른 방식으로 메모리 관리를 한다는 것을 유의해야 한다. | ||
자바나 C#에서는 다른 객체에서 객체를 생성해서 넘겨주는 방식이 적지 않게 사용되지만, C++에서 이는 메모리 문제를 일으키기 쉽다. | 자바나 C#에서는 다른 객체에서 객체를 생성해서 넘겨주는 방식이 적지 않게 사용되지만, C++에서 이는 메모리 문제를 일으키기 쉽다. | ||
그러나, C++11 이후 shared_ptr와 같은 스마트 포인터가 추가되면서, 이러한 구현 자체가 문제되지는 않게 되었다. | |||
==모던 C++== | ==모던 C++== | ||
63번째 줄: | 32번째 줄: | ||
C++ 표준 위원회는 업데이트가 잘 완성된 후 발표하려 했던 접근 방식 때문에 개정판의 발표가 늦어진 것이라고 자평하고, C++11 이후 기차 모델로 3년마다 개정판을 출판하기로 결정했다. | C++ 표준 위원회는 업데이트가 잘 완성된 후 발표하려 했던 접근 방식 때문에 개정판의 발표가 늦어진 것이라고 자평하고, C++11 이후 기차 모델로 3년마다 개정판을 출판하기로 결정했다. | ||
기존의 C++ 호환성을 어느 정도 유지하면서 점차 | 기존의 C++ 호환성을 어느 정도 유지하면서, 점차 다른 언어의 장점을 가져오고 단점을 줄이고 있다. | ||
===C++11=== | ===C++11=== | ||
C++11 언어에는 다음의 주요 기능이 추가되었다. | C++11 언어에는 다음의 주요 기능이 추가되었다. | ||
*우측값 참조(대입 연산자) 지원<ref>우측값 참조는 앝은 복사를 수행한다. 복사되는 개체가 더 이상 사용될 필요가 없는 경우, 개체의 전체를 복사하는 대신 값을 단순히 대입함으로서 오버 헤드를 줄일 수 있다. 컴파일러 차원의 자동 최적화는 코드 손상의 여지가 있기 때문에 지원하지 않는다.</ref> | *우측값 참조(대입 연산자) 지원<ref>우측값 참조는 앝은 복사를 수행한다. 복사되는 개체가 더 이상 사용될 필요가 없는 경우, 개체의 전체를 복사하는 대신 값을 단순히 대입함으로서 오버 헤드를 줄일 수 있다. 컴파일러 차원의 자동 최적화는 코드 손상의 여지가 있기 때문에 지원하지 않는다.</ref> | ||
* | *변수 타입 추론 지원<ref>auto 키워드를 통해 타입 이름이 긴 변수를 선언하면, 길이를 줄일 수 있다.</ref> | ||
*범위 기반 for문 지원<ref>표준 라이브러리의 반복자보다 코드가 간결해진다.</ref> | *범위 기반 for문 지원<ref>표준 라이브러리의 반복자보다 코드가 간결해진다.</ref> | ||
*람다 함수 지원<ref>람다 함수는 코드 블럭이나 함수 안에 삽입 될 수 있으며 참조도 가능하다.</ref> | *람다 함수 지원<ref>람다 함수는 코드 블럭이나 함수 안에 삽입 될 수 있으며 참조도 가능하다.</ref> | ||
*속성(attribute) 추가<ref>표준화된 문법으로써, 코드의 각 부분에 추가하여 컴파일러가 이를 참고할 수 있다.</ref> | *속성(attribute) 추가<ref>표준화된 문법으로써, 코드의 각 부분에 추가하여 컴파일러가 이를 참고할 수 있다.</ref> | ||
C++11 표준 라이브러리에는 다음의 주요 기능이 추가되었다. | C++11 표준 라이브러리에는 다음의 주요 기능이 추가되었다. | ||
*일반 목적 스마트 포인터 추가<ref> | *일반 목적 스마트 포인터 추가<ref>shared_ptr와 같은 함수를 통해 쓰레기 수집을 참조 횟수 계산 방식으로 지원한다. C++11에서 auto_ptr은 사용되지 않음으로 처리되고 C++17에서 제거되었다.</ref> | ||
*초기화 리스트 | *초기화 리스트 | ||
*[[멀티스레딩]] | *[[멀티스레딩]] | ||
*정규 표현식<ref>기본적으로 ECMAScript의 정규 표현식을 사용하며, grep 나 sed에서 사용되는 정규 표현식도 옵션 인자를 통해 사용할 수 있다 | *정규 표현식<ref>기본적으로 ECMAScript의 정규 표현식을 사용하며, grep 나 sed에서 사용되는 정규 표현식도 옵션 인자를 통해 사용할 수 있다.</ref> | ||
*[[해시]] 테이블 | *[[해시]] 테이블 | ||
*유니코드 문자열<ref>유니코드를 출력하려면 유니코드 로케일을 운영체제에서 지원해야 하며, | *유니코드 문자열<ref>유니코드를 출력하려면 유니코드 로케일을 운영체제에서 지원해야 하며, 그렇지 않은 경우 변환해야 한다.</ref> | ||
*[[난수]] | *[[난수]] | ||
*시간<ref>[[C 표준 라이브러리]]의 time.h에 포함된 [[C언어 clock()|시간 함수]]와 달리, 나노초 단위가 명시되어 있어서 윈도우에서도 나노초 측정이 가능하다.</ref> | *시간<ref>[[C 표준 라이브러리]]의 time.h에 포함된 [[C언어 clock()|시간 함수]]와 달리, 나노초 단위가 명시되어 있어서 윈도우에서도 나노초 측정이 가능하다.</ref> | ||
93번째 줄: | 60번째 줄: | ||
C++17 언어에는 다음의 주요 기능이 추가되었다. | C++17 언어에는 다음의 주요 기능이 추가되었다. | ||
*[[if|if문]]과 [[switch|switch문]]에서의 초기화 구문 허용 | *[[if|if문]]과 [[switch|switch문]]에서의 초기화 구문 허용 | ||
*[[ASCII|아스키코드]] 이외의 문자를 사용한 UTF-8 문자열 선언 허용<ref> | *[[ASCII|아스키코드]] 이외의 문자를 사용한 UTF-8 문자열 선언 허용<ref>UTF-8 문자열 선언 자체는 이미 C++11에서 추가되었다.</ref> | ||
104번째 줄: | 71번째 줄: | ||
===C++20=== | ===C++20=== | ||
C++20에는 다음의 주요 기능이 추가될 예정이다. | C++20에는 다음의 주요 기능이 추가될 예정이다. | ||
*언어 차원의 비동기 프로그래밍 지원<ref>C++20 이전이라도 불가능하지는 | *언어 차원의 비동기 프로그래밍 지원<ref>C++20 이전이라도 불가능하지는 않다. 다만, Boost와 같은 라이브러리 지원이 필요하다.</ref> | ||
*[[소스 코드]] [[모듈화]] 지원<ref>각각의 소스코드에 헤더 파일을 일일이 포함하는 대신, 미리 컴파일된 헤더 파일을 사용하는 것과 같다. 이는 컴파일 시간 단축에 효과적이지만, [[매크로]]의 사용에 제약이 있기 때문에, C++로 작성된 소프트웨어의 소스코드의 구조가 급격하게 변화할 수 있다.</ref> | *[[소스 코드]] [[모듈화]] 지원<ref>각각의 소스코드에 헤더 파일을 일일이 포함하는 대신, 미리 컴파일된 헤더 파일을 사용하는 것과 같다. 이는 컴파일 시간 단축에 효과적이지만, [[매크로]]의 사용에 제약이 있기 때문에, C++로 작성된 소프트웨어의 소스코드의 구조가 급격하게 변화할 수 있다.</ref> | ||
*템플릿 매개변수에 명시적 조건을 추가할 수 있는 컨셉트 지원<ref>템플릿 변수의 조건을 일부러 틀리게 하는 트릭을 넣을 필요가 적어지기 때문에, 코드가 간결해지고 [[가독성]]이 증가한다.</ref> | *템플릿 매개변수에 명시적 조건을 추가할 수 있는 컨셉트 지원<ref>템플릿 변수의 조건을 일부러 틀리게 하는 트릭을 넣을 필요가 적어지기 때문에, 코드가 간결해지고 [[가독성]]이 증가한다.</ref> | ||
===시범 사양=== | ===시범 사양=== | ||
시범 사양에는 [[네트워크]] 라이브러리, [[리플렉션]] 그리고 2D GUI 라이브러리 등이 있다. | |||
이러한 것들이 표준이 된다면, C++ 표준 라이브러리 만으로 [[크로스 플랫폼]] 소프트웨어를 만드는 일도 어렵지 않게 될 것이다. | |||
==주석== | |||
<references/> | |||
</ | |||
==같이 보기== | ==같이 보기== | ||
* [[C 언어]] | * [[C 언어]] | ||
* [[CSharp|C#]] | * [[CSharp|C#]] | ||
131번째 줄: | 90번째 줄: | ||
* [[LLVM]] | * [[LLVM]] | ||
* [[온라인 C++ 컴파일러]] | * [[온라인 C++ 컴파일러]] | ||
==참고== | ==참고== | ||
* {{위키백과}} | * {{위키백과}} | ||
* {{영어 위키백과}} | * {{영어 위키백과}} | ||
* | *https://en.cppreference.com/w/ | ||
*http://terms.naver.com/entry.nhn?docId=1179635&cid=200000000&categoryId=200003361 | |||
[[분류: C++]] | [[분류: C++]] |