C++: 두 판 사이의 차이

잔글 (문자열 찾아 바꾸기 - "더이상" 문자열을 "더 이상" 문자열로)
(문장 정리)
19번째 줄: 19번째 줄:
== 버전 ==
== 버전 ==
=== C++ 1.0 ===
=== C++ 1.0 ===
최초의 C++는 C의 전처리기로 구현되었다. 전처리기의 이름은 Cfront. 이때의 C++C와의 하위호환성을 보장하는 방향으로 개발되었다. 함수와 연산자의 오버로딩을 지원하지만 overload라는 별도의 키워드를 써야 가능했다. 동적 다형성이 가상함수를 통해 구현됨으로서 객체지향의 모습을 조금이나마 보였다. C++ 1.0에 추가된 개념 중 일부는 C에 영향을 주게 되었는데, 현재 C/C++ 공통적으로 많이 접할 수 있는 const 키워드가 C++에서 C로 역이식된 개념 중 하나다.  
최초의 C++는 C의 [[전처리기]]로 구현되었다. 전처리기의 이름은 Cfront. C++ 초기 개발방향은 C와의 하위호환성을 보장하는 쪽이었다. 실제로 C++는 친숙한 C 언어와 비슷한 문법으로 많은 개발자들에게 어필할 수 있었다. 함수 및 연산자의 오버로딩이 overload라는 별도 키워드를 써야 사용이 가능했다. 동적 다형성이 가상함수를 통해 구현되어 객체지향의 모습을 보이기 시작한 언어이다. C++ 1.0에 추가된 개념 중 일부는 C에 영향을 끼쳤는데, 현재 C/C++ 공통적으로 많이 접할 수 있는 const 키워드가 C++에서 C로 역이식된 개념 중 하나다.  


=== C++ 2.0 ===
=== C++ 2.0 ===
C++의 저자 비야네 스트롭스트룹은 C++ 2.0을 기능의 추가가 아닌 제약의 해제라고 소개했다. 다중 상속, 추상 클래스, 정적 멤버 함수, 멤버 포인터 연산자들이 추가되었다. 오버로딩이 불가능했던 연산자들의 오버로딩이 허용되었고, 기초적인 라이브러리들이 만들어지기 시작했다. 그리고 이 시기부터 프리프로세서가 아닌 진짜 C++ 컴파일러들이 만들어지기 시작했다.
다중 상속, 추상 클래스, 정적 멤버 함수, 멤버 포인터 연산자들이 추가되었고, 오버로딩이 불가능했던 연산자들의 오버로딩이 허용되었다. 또한 기초적인 라이브러리들이 이 때 만들어지기 시작했다. 비야네 스트롭스트룹은 C++ 2.0을 제약의 해제라고 소개할 정도. 이 시기부터 프리프로세서가 아닌 진짜 C++ 컴파일러들이 만들어지기 시작했다.


=== C++ARM ===
=== C++ARM ===
C++ Annotated Reference Manual이 발표되면서 지금의 C++와 비슷한 모습을 갖추게 된 버전이다. 템플릿이 도입됨으로서 [[템플릿 메타프로그래밍]]이라는 새로운 <s>흑마법</s>패러다임을 열었다. 또한 [[표준 템플릿 라이브러리|표준 템플릿 라이브러리(STL)]]도 추가되어 지금까지 여러 [[알고리즘(프로그래밍)|알고리즘]]과 기능들을 지원하고 있다.
C++ Annotated Reference Manual이 발표되면서 지금의 C++와 비슷한 모습을 갖추게 된 버전이다. 큰 변화로는 템플릿의 도입인데, [[템플릿 메타프로그래밍]]이라는 새로운 <s>흑마법</s>패러다임을 열었다. 또한 [[표준 템플릿 라이브러리|표준 템플릿 라이브러리(STL)]]도 추가되어 지금까지 다양한 [[알고리즘(프로그래밍)|알고리즘]]과 기능들이 지원되고 있다.


=== C++98 ===
=== C++98 ===
어떤 컴파일러를 사용하든 같은 결과를 보장하기 위해 [[ISO]]에서 제정한 최초의 [[C++]] 표준으로, [http://www.iso.org/iso/iso_catalogue/catalogue_ics/catalogue_detail_ics.htm?ics1=35&ics2=60&ics3=&csnumber=50372 ISO/IEC 14882:1998] 라는 정식 명칭을 가지고 있다. C++98부터 namespace 개념이 추가되어 표준 라이브러리는 std 네임스페이스에 속하게 되었으며, 기존 라이브러리와 혼동을 피하기 위해 이때부터 표준 라이브러리의 헤더에서 .h가 빠지게 되었다.
어느 컴파일러를 사용하든 같은 결과를 보장하기 위해 만들어진 최초의 [[C++]] 표준이다. C++98부터 namespace 개념이 추가되어 표준 라이브러리는 std 네임스페이스에 속하게 되었으며, 기존 라이브러리와 혼동을 피하기 위해 이때부터 표준 라이브러리의 헤더에서 .h가 빠지게 되었다.


=== C++03 ===
=== C++03 ===
C++98을 대체하는 표준이지만 <s>이름만 바뀌었지</s> 사실상 C++98와 다른 점은 없다!<ref>C++ 저자인 비야네 스트롭스트룹은 [http://www.stroustrup.com/bs_faq.html#C++03 FAQ 페이지]에서 C++03은 C++98의 버그 수정 릴리즈라고 밝히고 있다.</ref> 하나 있다면 [[벡터]]의 메모리 연속성이 표준에 보장된 것.
C++98을 대체하는 표준이지만 <s>이름만 바뀌었지</s> 사실상 C++98와 다른 점은 없다!<ref>비야네 스트롭스트룹은 [http://www.stroustrup.com/bs_faq.html#C++03 FAQ 페이지]에서 C++03은 C++98의 버그 수정 릴리즈라고 밝혔다. 프로그래머는 따로 신경쓸 부분이 없다고.</ref> 하나 눈여겨볼 부분은 [[벡터]]의 메모리 연속성이 표준에 보장된 것.


=== C++TR1 ===
=== C++TR1 ===
C++ Technical Report 1이라는 이름의 보고서다. 줄여서 TR1이라 쓰고 읽는다. <s>한글로는 C++ 기술 보고서 1이지만 이렇게 읽는 사람은 아무도 없다</s>. C++03 규격에서 확장에 필요한 라이브러리들을 정리한 것인데, [[Boost]]에 들어가 있는 라이브러리들이 상당수 존재한다. 튜플이나 정규 표현식, 스마트 포인터, 배열 컨테이너 등의 라이브러리들이 추가되었으며, 기존 C++ 표준 라이브러리와 구분하기 위해 std::tr1이라는 namespace로 정의되어 있다.
C++ Technical Report 1이라는 이름의 문서에서 제안된 라이브러리의 통칭이다. 줄여서 TR1이라 쓰고 읽는다. <s>한글로는 C++ 기술 보고서 1이지만 이렇게 읽는 사람은 아무도 없다</s>. C++03 규격에서 확장에 필요한 라이브러리들을 정리한 것인데, [[Boost]]에 들어가 있는 라이브러리들이 상당수 존재한다. 튜플이나 정규 표현식, 스마트 포인터, 배열 컨테이너 등의 라이브러리들이 추가되었으며, 기존 C++ 표준 라이브러리와 구분하기 위해 std::tr1이라는 namespace로 정의되어 있다. TR1에 도입된 라이브러리들은 그대로 C++11에 들어가게 된다.


=== C++11 ===
=== C++11 ===
초기 개발 명은 C++0X라고 하여 10년도 이전에 나올 것이라 예상되었으나 때를 한참 넘겨 2011년에 공개되었다. C++11에서는 다른 프로그래밍 언어에서 사용되던 편리한 문법이 많이 추가 되었다
2010년 이전에 나올 것으로 예상되어 초기 개발명이 C++0x이었지만 때를 한참 넘겨 2011년에 공개되었다. C++11에서는 다른 프로그래밍 언어에서 사용되던 편리한 문법과 개념이 많이 추가되었다
==== 내역 ====
==== 내역 ====
===== 문법의 변화 =====
===== 문법의 변화 =====
126번째 줄: 126번째 줄:


=== C++14 ===
=== C++14 ===
C++14는 C++11의 마이너 업그래이드이다.
C++14는 C++11의 마이너 업그레이드이다.
 
=== C++17 (예정) ===
=== C++17 (예정) ===



2015년 5월 5일 (화) 00:34 판

C++ / 씨 플러스 플러스, 씨쁠쁠등으로 읽기도 한다.

C++C 언어에서 파생된 프로그래밍 언어 중 하나로, 비야네 스트롭스트룹(Bjarne Stroustrup)이 만든 객체지향 언어이다. 초창기 코드 네임C with Classes[1]으로. 코드 네임에서 볼 수 있듯 C 언어객체지향 개념을 더하는 것이 시작이었다. 문법은 C 언어와 상당히 유사하지만 실질적으론 다른 언어로서 호환되지 않는다. 흔히 C++를 C언어의 슈퍼셋으로 생각하기 쉬우나, 이는 프로그래밍 패러다임적 측면에서 접근한다면 일리가 있는 이야기일지 몰라도 언어 자체는 개념적으로도 차이가 나는 부분이 있으므로 완벽한 의미에서의 호환이 된다고 볼 수는 없다. 게다가 C++ 98 버전 정도라면 몰라도, 특히 C++ 11 버전 이후로는 업데이트가 될수록 점점 문법이 C 언어와 달라지는 것을 보면.. 언젠간 C에서 원형을 따왔다는 것을 쉽게 못 알아볼지도.

특징

C의 저수준 접근을 그대로 허용하면서 객체지향 패러다임을 추가하였다. 덕분에 다른 객체지향 언어에 비해 복잡한 여러 가지 내용이 들어가게 되었다.

메소드의 정적바인딩

다른 객체지향 언어와 달리 C++은 속도를 위하여 기본적인 멤버함수는 정적바인딩을 사용하며, virtual 키워드를 사용했을 경우에만 동적바인딩을 하게 된다. 따라서 virtual 키워드를 사용하지 않는 경우에는 부모 클래스 포인터가 실제로 자식 클래스의 객체를 참조하고 있다고 하더라도 부모 클래스의 메소드가 호출됨에 유의해야 한다.

다중상속

클래스의 다중 상속이 허용된다. 매우 강력한 기능이지만 이것을 문제없이 잘 사용하려면 학습시간과 함께 프로그래머의 경험이 중요하다. 다중 상속이 문제가 되는 것은 다음과 같은 복잡한 상황을 야기하기 때문이다. 예를 들어 클래스 A와 B에 모두 foo()라는 메소드가 존재하고 클래스 C가 A와 B를 상속하는 경우, C에서 foo()를 호출할 때, 과연 어느 메소드를 호출해야 하겠는가? 다중 상속시에 이러한 부분을 제대로 컨트롤하지 않으면 심각한 문제를 야기할 수 있다. JavaC# 같이 나중에 등장한 객체지향 프로그래밍 언어에서는 다중상속이 아닌 단일 상속에 인터페이스를 사용하여 다중상속과 유사하게 사용할 수 있으면서 보다 쓰기 쉽게 만들었다.

컴파일 언어

C++ 는 스크립트 언어가 아닌 네이티브 언어이므로 컴파일러가 목적코드를 생성하여 응용 프로그램을 만든다. 대부분의 C++ 컴파일러는 C언어에 대한 컴파일도 지원하고 있다.

메모리

메모리의 동적 할당의 경우 자동으로 객체가 해제되지 않으며, 프로그래머가 직접 해제해야 한다. 동적 할당은 new 키워드로 하고 해제시에는 delete 키워드를 사용한다. 가비지 콜렉션 방식으로 묵시적 메모리 해제를 하는 Java와는 다르기 때문에 메모리 누수에 대한 고려가 필수적이다.

템플릿 메타 프로그래밍

템플릿 메타프로그래밍참조

버전

C++ 1.0

최초의 C++는 C의 전처리기로 구현되었다. 전처리기의 이름은 Cfront. C++ 초기 개발방향은 C와의 하위호환성을 보장하는 쪽이었다. 실제로 C++는 친숙한 C 언어와 비슷한 문법으로 많은 개발자들에게 어필할 수 있었다. 함수 및 연산자의 오버로딩이 overload라는 별도 키워드를 써야 사용이 가능했다. 동적 다형성이 가상함수를 통해 구현되어 객체지향의 모습을 보이기 시작한 언어이다. C++ 1.0에 추가된 개념 중 일부는 C에 영향을 끼쳤는데, 현재 C/C++ 공통적으로 많이 접할 수 있는 const 키워드가 C++에서 C로 역이식된 개념 중 하나다.

C++ 2.0

다중 상속, 추상 클래스, 정적 멤버 함수, 멤버 포인터 연산자들이 추가되었고, 오버로딩이 불가능했던 연산자들의 오버로딩이 허용되었다. 또한 기초적인 라이브러리들이 이 때 만들어지기 시작했다. 비야네 스트롭스트룹은 C++ 2.0을 제약의 해제라고 소개할 정도. 이 시기부터 프리프로세서가 아닌 진짜 C++ 컴파일러들이 만들어지기 시작했다.

C++ARM

C++ Annotated Reference Manual이 발표되면서 지금의 C++와 비슷한 모습을 갖추게 된 버전이다. 큰 변화로는 템플릿의 도입인데, 템플릿 메타프로그래밍이라는 새로운 흑마법패러다임을 열었다. 또한 표준 템플릿 라이브러리(STL)도 추가되어 지금까지 다양한 알고리즘과 기능들이 지원되고 있다.

C++98

어느 컴파일러를 사용하든 같은 결과를 보장하기 위해 만들어진 최초의 C++ 표준이다. C++98부터 namespace 개념이 추가되어 표준 라이브러리는 std 네임스페이스에 속하게 되었으며, 기존 라이브러리와 혼동을 피하기 위해 이때부터 표준 라이브러리의 헤더에서 .h가 빠지게 되었다.

C++03

C++98을 대체하는 표준이지만 이름만 바뀌었지 사실상 C++98와 다른 점은 없다![2] 하나 눈여겨볼 부분은 벡터의 메모리 연속성이 표준에 보장된 것.

C++TR1

C++ Technical Report 1이라는 이름의 문서에서 제안된 라이브러리의 통칭이다. 줄여서 TR1이라 쓰고 읽는다. 한글로는 C++ 기술 보고서 1이지만 이렇게 읽는 사람은 아무도 없다. C++03 규격에서 확장에 필요한 라이브러리들을 정리한 것인데, Boost에 들어가 있는 라이브러리들이 상당수 존재한다. 튜플이나 정규 표현식, 스마트 포인터, 배열 컨테이너 등의 라이브러리들이 추가되었으며, 기존 C++ 표준 라이브러리와 구분하기 위해 std::tr1이라는 namespace로 정의되어 있다. TR1에 도입된 라이브러리들은 그대로 C++11에 들어가게 된다.

C++11

2010년 이전에 나올 것으로 예상되어 초기 개발명이 C++0x이었지만 때를 한참 넘겨 2011년에 공개되었다. C++11에서는 다른 프로그래밍 언어에서 사용되던 편리한 문법과 개념이 많이 추가되었다

내역

문법의 변화
  • 유니코드에 대한 지원이 강화되었다.
UTF-8, UTF-16, UTF-32지원을 위한 자료형이 추가되었으며, 변환에 필요한 라이브러리가 추가되었다. 다만 비주얼스튜디오의 경우, 2015버전부터 지원한다.
  • overide키워드가 추가되었다
overide 키워드는 자식 클래스가 부모 클래스의 멤버 함수를 재정의할 때, 재정의해야 할 부모클래스의 멤버함수가 없을 경우, 컴파일 단계에서 에러를 뿜어준다.
  • final 키워드가 추가되었다.
더 이상 상속을 못하게 하는 키워드이다
  • 기존의 auto예약어의 기능이 없어지고 변수 선언시 초기화 값에 따라 변수형을 추론하여 생략을 가능하게 하였다
auto var = 1; //이 경우 var변수의 변수형은 int형이 된다.
auto var2 = new Person();//이 경우 var2의 변수형은 Person*이 된다.
  • 정적 배열, vector, list클래스의 경우 for문에서 자바의 for문과 같이 사용할 수 있다
int a[] = {1,2,3,4,5};
for(auto & it : a)
{
    std::cout<<it<<endl;
}
  • 표현식(expression)의 타입추론을 돕는 decltype 키워드가 추가되었다.
template <typename T, typename F>
auto execute(const T& value, F func) -> decltype(func(value))
{
        return func(value);
}
  • 초기화 방법이 통합되었다.
struct data
{
    int A, B;
    char C;
}

data x {1, 3, 'F'};

data func()
{
    return {2, 5, 'Z'};
}
  • 개체나 함수를 모두 const로 만들 수 있는[3] constexpr 키워드가 추가되었다.
  • Parameter Pack이 추가되어 가변 인자 템플릿을 구현할 수 있게 되었다.
template<typename... Types> void f(Types... args);
  • 최적화된 예외처리 기능을 제공하는 noexcept 키워드가 추가되었다.
  • nullptr 키워드가 추가되어 0과 구분되는 NULL을 공식으로 지원하게 되었다.
  • 사용자 정의 리터럴이 추가되었고, 그 operator를 정의할 수 있게 되었다.
  • using 키워드에 type alias 기능이 추가되었다.
typedef unique_ptr<unordered_map<int, std::string>> uum; //typedef
using uum = unique_ptr<unordered_map<int, std::string>>; //using

typedef void(*Func)(int, const std::string&); // typedef
typedef Func = void(*)(int, const std::string&); // using
  • using 키워드를 사용하여 alias template을 정식으로 지원하게 되었다.
//typedef
template<typename T1, typename T2>
struct uptr
{
    typedef unique_ptr<unordered_map<T1, T2>> uum;
};

//using (alias template)

template<typename T1, typename T2>
using uum = unique_ptr<unordered_map<T1, T2>>;
  • 우측값과 이동 생성자가 추가되었다.
  • 람다식및 익명함수가 추가되었다.
  • POD[4]의 정의가 수정되었다.
  • std::initializer_list가 추가되어 POD가 아니어도 리스트 형식으로 초기화가 가능해졌다.
표준 라이브러리의 변화
  • std::thread클래스가 추가되었고 멀티 스레딩을 지원하는 메모리 모델로 수정되었다. 또한 동기화 지원을 위한 std::mutex가 추가되었다.
  • 레퍼런스 카운드을 이용한 메모리 클래스인 std::shared_ptr와 std::weak_ptr가 추가되었다. 또한 std::auto_ptr은 비추천으로 바뀌었다.
  • 기존의 함수포인터를 대체하는 std::function클래스가 추가되었다.
  • 시간에 관한 클래스 라이브러리가 추가되었다
그 외
  • 가비지 컬렉션에 대한 내용이 표준에 추가되었다, 하지만 어떠한 컴파일러도 구현하지 않았다.

C++14

C++14는 C++11의 마이너 업그레이드이다.

C++17 (예정)

주석

  1. 위키백과나 다른 곳에서는 C++의 원래 명칭을 C with Classes라고 소개하고 있지만, 비야네 스트롭스트룹은 C with Classes를 발표한 적이 없다. C with Classes는 C++의 개발 코드 네임인 셈. 예를 들면 윈도우 XP의 코드 네임은 Windows Whistler이지만 내부에서만 쓰는 이름이었고 공식적으로 발표된 적은 없다. 즉, 발표한 적이 없는 C with Classes를 C++의 원래 이름이라고 말하는 것은 잘못된 것.
  2. 비야네 스트롭스트룹은 FAQ 페이지에서 C++03은 C++98의 버그 수정 릴리즈라고 밝혔다. 프로그래머는 따로 신경쓸 부분이 없다고.
  3. 컴파일타임에 결과를 계산
  4. plain old data, memset이나 memcpy등을 사용할 수 있는 객체

참고 자료