"C++"의 두 판 사이의 차이

잔글
잔글
78번째 줄: 78번째 줄:
시범 사양에는 [[네트워크]] 라이브러리, [[리플렉션]] 그리고 2D GUI 라이브러리 등이 있다.
시범 사양에는 [[네트워크]] 라이브러리, [[리플렉션]] 그리고 2D GUI 라이브러리 등이 있다.
이러한 것들이 표준이 된다면, C++ 표준 라이브러리 만으로 [[크로스 플랫폼]] 소프트웨어를 만드는 일도 어렵지 않게 될 것이다.
이러한 것들이 표준이 된다면, C++ 표준 라이브러리 만으로 [[크로스 플랫폼]] 소프트웨어를 만드는 일도 어렵지 않게 될 것이다.
==소스코드 예시==
<source lang='cpp'>
#include <iostream>
int main()
{
    std::cout << "Hello World !" << std::endl;
    return 0;
}
</source>


==주석==
==주석==

2019년 6월 9일 (일) 20:54 판

C++

1 개요

C++는 기본적으로 C언어를 확장한 언어이다.

  • 객체지향과 일반화 프로그래밍을 포함하는 멀티 패러다임이다.
  • 언어 설계 자체가 성능을 추구하므로, 자바C#과 같은 언어보다 빠르고 네이티브로 컴파일된다.
  • 언어 및 라이브러리의 기능이 복잡해서, 다른 언어보다 비교적 어렵고 생산성이 낮다고 평가받는다.

2 C언어와의 관계

C언어와는 다음의 특성을 지닌다.

  • C언어와 설계 지향점이 다르기 때문에, 전혀 다른 언어로 보는 것이 안전하다.
  • C언어를 부분집합으로 갖지만, 일부 과거 버전은 그렇지 않았던 경우도 있었다.

3 일반화 프로그래밍

C++에서는 템플릿을 사용한 일반화 프로그래밍이 지원되며, 범용 라이브러리 등 매우 많은 부분에서 사용되고 있다.

템플릿은 제네릭보다 크게 확장된 개념으로, 자바나 C#의 제네릭보다 많은 역할을 수행한다. 사실상 C++에 포함되며 성능을 위해 컴파일 시간에 전부 처리되는, 하나의 작은 프로그래밍 언어라고 봐도 무방하다.

표준 라이브러리를 사용한다면, 무조건 템플릿을 사용하게 된다. 예를 들어, 동적 배열 객체인 'vector<int>'은 int 타입에 특수화하여 int 배열을 생성한다. 템플릿은 컴파일 시간에 모든 과정이 처리되므로, 실행 시간에 int 대신 short 타입에 특수화할 수는 없다.

4 메모리 관리

C++는 메모리 관리를 자동으로 수행하는 표준 라이브러리가 있지만, 오래된 코드에서는 이를 포인터를 사용해 전부 수동으로 관리했다.

C++는 자바나 C#과 같은 언어와 완전히 다른 방식으로 메모리 관리를 한다는 것을 유의해야 한다. 자바나 C#에서는 다른 객체에서 객체를 생성해서 넘겨주는 방식이 적지 않게 사용되지만, C++에서 이는 메모리 문제를 일으키기 쉽다. 그러나, C++11 이후 shared_ptr와 같은 스마트 포인터가 추가되면서, 이러한 구현 자체가 문제되지는 않게 되었다.

5 모던 C++

C++98 이후 별다른 변화없이 사용되었으나, C++11이 등장하면서 급격하게 변화하기 시작했다.

C++ 표준 위원회는 업데이트가 잘 완성된 후 발표하려 했던 접근 방식 때문에 개정판의 발표가 늦어진 것이라고 자평하고, C++11 이후 기차 모델로 3년마다 개정판을 출판하기로 결정했다. 기존의 C++ 호환성을 어느 정도 유지하면서, 점차 다른 언어의 장점을 가져오고 단점을 줄이고 있다.

5.1 C++11

C++11 언어에는 다음의 주요 기능이 추가되었다.

  • 우측값 참조(대입 연산자) 지원[1]
  • 변수 타입 추론 지원[2]
  • 범위 기반 for문 지원[3]
  • 람다 함수 지원[4]
  • 속성(attribute) 추가[5]


C++11 표준 라이브러리에는 다음의 주요 기능이 추가되었다.

5.2 C++14

C++14는 마이너 버전 성격을 지니며 다음의 주요 기능이 추가되었다.

  • 함수 반환형 추론 지원
  • 람다 함수 개선

5.3 C++17

C++17 언어에는 다음의 주요 기능이 추가되었다.


C++17 표준 라이브러리에는 다음의 주요 기능이 추가되었다.

5.4 C++20

C++20에는 다음의 주요 기능이 추가될 예정이다.

  • 언어 차원의 비동기 프로그래밍 지원[12]
  • 소스 코드 모듈화 지원[13]
  • 템플릿 매개변수에 명시적 조건을 추가할 수 있는 컨셉트 지원[14]

5.5 시범 사양

시범 사양에는 네트워크 라이브러리, 리플렉션 그리고 2D GUI 라이브러리 등이 있다. 이러한 것들이 표준이 된다면, C++ 표준 라이브러리 만으로 크로스 플랫폼 소프트웨어를 만드는 일도 어렵지 않게 될 것이다.

6 소스코드 예시

#include <iostream>

int main()
{
    std::cout << "Hello World !" << std::endl;
    return 0;
}

7 주석

  1. 우측값 참조는 앝은 복사를 수행한다. 복사되는 개체가 더 이상 사용될 필요가 없는 경우, 개체의 전체를 복사하는 대신 값을 단순히 대입함으로서 오버 헤드를 줄일 수 있다. 컴파일러 차원의 자동 최적화는 코드 손상의 여지가 있기 때문에 지원하지 않는다.
  2. auto 키워드를 통해 타입 이름이 긴 변수를 선언하면, 길이를 줄일 수 있다.
  3. 표준 라이브러리의 반복자보다 코드가 간결해진다.
  4. 람다 함수는 코드 블럭이나 함수 안에 삽입 될 수 있으며 참조도 가능하다.
  5. 표준화된 문법으로써, 코드의 각 부분에 추가하여 컴파일러가 이를 참고할 수 있다.
  6. shared_ptr와 같은 함수를 통해 쓰레기 수집을 참조 횟수 계산 방식으로 지원한다. C++11에서 auto_ptr은 사용되지 않음으로 처리되고 C++17에서 제거되었다.
  7. 기본적으로 ECMAScript의 정규 표현식을 사용하며, grep 나 sed에서 사용되는 정규 표현식도 옵션 인자를 통해 사용할 수 있다.
  8. 유니코드를 출력하려면 유니코드 로케일을 운영체제에서 지원해야 하며, 그렇지 않은 경우 변환해야 한다.
  9. C 표준 라이브러리의 time.h에 포함된 시간 함수와 달리, 나노초 단위가 명시되어 있어서 윈도우에서도 나노초 측정이 가능하다.
  10. UTF-8 문자열 선언 자체는 이미 C++11에서 추가되었다.
  11. 정렬과 같은 표준 라이브러리의 함수에 이러한 기능이 추가되었다.
  12. C++20 이전이라도 불가능하지는 않다. 다만, Boost와 같은 라이브러리 지원이 필요하다.
  13. 각각의 소스코드에 헤더 파일을 일일이 포함하는 대신, 미리 컴파일된 헤더 파일을 사용하는 것과 같다. 이는 컴파일 시간 단축에 효과적이지만, 매크로의 사용에 제약이 있기 때문에, C++로 작성된 소프트웨어의 소스코드의 구조가 급격하게 변화할 수 있다.
  14. 템플릿 변수의 조건을 일부러 틀리게 하는 트릭을 넣을 필요가 적어지기 때문에, 코드가 간결해지고 가독성이 증가한다.

8 같이 보기

9 참고

문서 댓글 ({{ doc_comments.length }})
{{ comment.name }} {{ comment.created | snstime }}