C++
C++![]() C++ 표준 위원회에서 승인한 로고 | |
패러다임 | 다중 패러다임: 절차적, 명령적, 기능적, 객체 지향적, 일반적, 모듈식 |
---|---|
가족 | C |
설계자 | 비에른 스트러스트럽 |
개발자 | ISO/IEC JTC 1 (공동기술위원회 1) / SC 22 (소위원회 22) / WG 21 (실무그룹 21) |
첫 등장 | 1985; | 전 1985)
안정적인 방출 | C++20 (ISO/IEC 14882:2020) / 2020년 12월 15일, 전 ( |
미리보기출고 | C++23 / 2023년 3월 19일, 전 |
타이핑 규율 | 정적, 강함, 추천, 부분 추론 |
OS | 크로스 플랫폼 |
파일 확장자 | .C, .cc, .cpp, .cxx, .c++, .h, .H, .hh, .hpp, .hxx, .h++ .cppm, .ixx,[1] |
웹사이트 | isocpp |
주요구현 | |
GCC, LLVM Clang, Microsoft Visual C++, Embarcadero C++ Builder, Intel C++ 컴파일러, IBM XL C++, EDG | |
영향을 받음 | |
Ada, ALGOL 68,[2] BCPL,[3] C, CLU,[2] F#,[4][note 1] ML, Mesa,[2] Modula-2,[2] Simula, Smalltalk[2] | |
영향받은 | |
Ada 95, C#,[5] C99, Carbon, Chapel,[6] Clojure,[7] D, Java,[8] JS++,[9] Lua,[10] Nim,[11] Objective-C++, Perl, PHP, Python,[12] Rust,[13] Seed7 | |
C++(/ ˈsi ːpl ʌs pl ʌs/)는 덴마크의 컴퓨터 과학자인 Bjarne Stroustrup이 만든 고급 범용 프로그래밍 언어입니다. 1985년 C 프로그래밍 언어의 확장으로 처음 출시된 이후 시간이 지남에 따라 크게 확장되었으며 1997년[update] 현재 C++는 저수준 메모리 조작 기능 외에도 객체 지향, 일반 및 기능 기능 기능을 갖추고 있습니다. 거의 항상 컴파일된 언어로 구현되며, 자유 소프트웨어 재단, LLVM, 마이크로소프트, 인텔, 엠바카데로, 오라클, IBM 등 많은 벤더가 C++ 컴파일러를 제공합니다.[14]
C++는 시스템 프로그래밍 및 임베디드, 리소스 제약 소프트웨어 및 대형 시스템을 염두에 두고 설계되었으며, 성능, 효율성 및 유연성을 설계의 하이라이트로 삼고 있습니다.[15] C++는 데스크톱 애플리케이션, 비디오 게임, 서버([15]예: 전자 상거래, 웹 검색 또는 데이터베이스), 성능이 중요한 애플리케이션(예: 전화 스위치 또는 우주 탐사선) 등 소프트웨어 인프라 및 리소스 제한 애플리케이션이 주요 강점인 다른 많은 맥락에서도 유용한 것으로 나타났습니다.[16]
C++는 국제표준화기구(ISO)에 의해 표준화되고 있으며, ISO가 2020년 12월에 승인하고 발표한 최신 표준 버전은 ISO/IEC 14882:2020(비공식적으로 C++20)입니다.[17] C++ 프로그래밍 언어는 1998년 ISO/IEC 14882:1998로 처음 표준화되었으며, 이후 C++03, C+11, C++14, C++17 표준으로 수정되었습니다. 현재 C++20 표준은 새로운 기능과 확장된 표준 라이브러리로 이들을 대체합니다. 1998년에 처음 표준화되기 전에 C++는 1979년부터 벨 연구소의 Stroustrup에 의해 C 언어의 확장으로 개발되었습니다. 그는 C와 비슷한 효율적이고 유연한 언어를 원했고, 또한 프로그램 구성에 높은 수준의 기능을 제공했습니다.[18] C++는 2012년부터 C++23을 차기 계획 표준으로 3년간 출시 일정을[19] 진행하고 있습니다.[20]
역사

1979년, 덴마크의 컴퓨터 과학자인 Bjarne Stroustrup은 "에 대한 연구를 시작했습니다. C++[21]의 이전 버전인 C 클래스". 새로운 언어를 만든 동기는 Stroustrup의 박사 논문 프로그래밍 경험에서 비롯되었습니다. Stroustrup은 Simula가 대규모 소프트웨어 개발에 매우 도움이 되는 기능을 가지고 있지만 언어가 너무 느려서 실용적으로 사용할 수 없는 반면, BCPL은 빠르지만 수준이 너무 낮아서 대규모 소프트웨어 개발에 적합하지 않다는 것을 발견했습니다. Stroustrup이 AT&T Bell Labs에서 일하기 시작했을 때 분산 컴퓨팅과 관련하여 UNIX 커널을 분석하는 문제가 있었습니다. Stroustrup은 PhD 경험을 기억하며 시뮬라와 같은 특징으로 C 언어를 향상시키기 시작했습니다.[22] C는 범용적이고 빠르고 휴대가 가능하며 널리 사용되기 때문에 선택되었습니다. C와 Simula의 영향뿐만 아니라 ALGOL 68, Ada, CLU 및 ML을 포함한 다른 언어들도 이 새로운 언어에 영향을 미쳤습니다.
처음에 Stroustrup의 C with Classes는 C 컴파일러 Cpre에 클래스, 파생 클래스, 강력한 타이핑, 인라인 및 기본 인수를 포함한 기능을 추가했습니다.[23]

1982년 스트러스트럽은 클래스와 함께 C의 후속 모델을 개발하기 시작했고, 그는 이를 "C++"라고 이름 지었습니다.++
다른 여러 이름을 거친 후 C)의 증분 연산자가 됩니다. 가상 함수, 함수 이름 및 연산자 오버로딩, 참조, 상수, 유형 안전 자유 저장소 메모리 할당(새/삭제), 유형 검사 개선, 두 개의 순방향 슬래시가 있는 BCPL 스타일의 단일 줄 코멘트를 포함한 새로운 기능이 추가되었습니다(//
또한 Stroustrup은 C++, Cfront용 독립형 컴파일러를 개발했습니다.
1984년 Stroustrup은 최초의 스트림 입출력 라이브러리를 구현했습니다. 이름 있는 출력 함수가 아닌 출력 연산자를 제공하는 아이디어는 이전에 유닉스 파이프를 제안했던 더그 매킬로이[2](Doug McIlroy)에 의해 제안되었습니다.
1985년에 C++ 프로그래밍 언어의 첫 번째 판이 출시되었는데, 이는 아직 공식 표준이 없었기 때문에 이 언어의 결정적인 참조가 되었습니다.[24] C++의 첫 번째 상업적 구현은 같은 해 10월에 출시되었습니다.[21]
1989년에 C++ 2.0이 출시되었고, 1991년에 C++ 프로그래밍 언어의 업데이트 2판이 출시되었습니다.[25] 2.0의 새로운 기능에는 다중 상속, 추상 클래스, 정적 멤버 함수, 구성원 함수 및 보호된 멤버가 포함되었습니다. 1990년에 주석이 달린 C++ 참조 매뉴얼이 출판되었습니다. 이 작업은 향후 표준의 기초가 되었습니다. 이후 기능 추가에는 템플릿, 예외, 이름 공간, 새 캐스트 및 부울 유형이 포함되었습니다.
1998년에는 C++98이 출시되어 언어를 표준화하였으며, 2003년에는 마이너 업데이트(C++03)가 출시되었습니다.
C++98 이후 2011년 C++11 표준이 출시될 때까지 C++는 비교적 느리게 진화하여 수많은 새로운 기능을 추가하고 표준 라이브러리를 더욱 확장하며 C++ 프로그래머에게 더 많은 기능을 제공했습니다. 2014년 12월에 발표된 마이너 C++14 업데이트 이후, C++17에는 다양한 새로운 추가 기능이 도입되었습니다.[26] C++[27]20 표준 초안은 2020년 9월 4일에 승인되었으며, 2020년 12월 15일에 공식적으로 발표되었습니다.[28][29]
2018년 1월 3일 스트러스트럽은 "C++ 프로그래밍 언어를 개념화하고 개발한 공로로" 찰스 스타크 드레이퍼상 공학상의 2018년 수상자로 발표되었습니다.[30]
2022년[update] 12월 기준으로 C++는 TIOBE 지수에서 3위를 차지하며 지수 역사상 최초로 자바를 앞질렀습니다. 파이썬과 C에 이어 3위입니다.[31]
어원
Stroustrup에 따르면, "그 이름은 C로부터의 변화의 진화적 특성을 의미합니다."[32] 이 이름은 Rick Mascitti (1983년 중반)[23]의 이름으로 1983년 12월에 처음 사용되었습니다. 1992년 Mascitti가 비공식적으로 그 이름에 대해 질문을 받았을 때, 그는 그것이 혀를 내두르는 정신으로 주어졌다고 말했습니다. 이름은 C의 것에서 유래했습니다. ++
연산자(변수 값을 증가시키는 연산자)와 향상된 컴퓨터 프로그램을 나타내기 위해 "+"를 사용하는 일반적인 명명 규칙.
C++의 개발 기간 동안 이 언어는 최종 이름을 얻기 전에 "새로운 C"와 "수업과 함께 C"[23][33]로 언급되었습니다.
철학
C++의 일생 동안, C++의 발전과 진화는 다음과 같은 일련의 원칙에 의해 인도되었습니다.[22]
- 실제 문제에 의해 구동되어야 하며 기능은 실제 프로그램에서 즉시 유용해야 합니다.
- 모든 기능을 구현할 수 있어야 합니다(비교적 명확한 방법으로).
- 프로그래머는 자신의 프로그래밍 스타일을 자유롭게 선택할 수 있어야 하며, 그 스타일은 C++에서 완전히 지원되어야 합니다.
- 유용한 기능을 허용하는 것이 C++의 모든 오용을 방지하는 것보다 더 중요합니다.
- 프로그램을 별도의 잘 정의된 부분으로 구성하기 위한 시설을 제공하고, 별도로 개발된 부분을 결합하기 위한 시설을 제공해야 합니다.
- 형식 시스템에 대한 암묵적 위반은 없습니다(단, 명시적 위반, 즉 프로그래머가 명시적으로 요청한 위반은 허용).
- 사용자가 만든 유형은 기본 제공 유형과 동일한 지원 및 성능을 가져야 합니다.
- 사용되지 않은 기능은 생성된 실행 파일(예: 성능 저하)에 부정적인 영향을 주지 않아야 합니다.
- C++ 아래에는 언어가 없어야 합니다(어셈블리 언어 제외).
- C++는 기존의 다른 프로그래밍 언어들과 함께 작업해야 합니다. 그들만의 분리되고 호환되지 않는 프로그래밍 환경을 조성하는 것이 아니라 말입니다.
- 프로그래머의 의도를 알 수 없는 경우, 프로그래머가 수동 제어를 제공하여 이를 지정할 수 있도록 합니다.
표준화

연도 | ISO/IEC 표준 | 비공식명 |
---|---|---|
1998 | 14882:1998[35] | C++98 |
2003 | 14882:2003[36] | C++03 |
2011 | 14882:2011[37] | C++11, C++0x |
2014 | 14882:2014[38] | C++14, C++1y |
2017 | 14882:2017[39] | C++17, C++1z |
2020 | 14882:2020[17] | C++20, C++2a |
2023 | C++23 |
C++는 JTC1/SC22/WG21로 알려진 ISO 작업 그룹에 의해 표준화됩니다. 현재까지 C++ 표준의 6개의 개정판을 발표했으며 다음 개정판인 C++23을 작업 중입니다.
1998년 ISO 작업 그룹은 비공식적으로 C++98로 알려진 ISO/IEC 14882:1998로 처음으로 C++를 표준화했습니다. 2003년에는 C++98에서 확인된 문제를 수정한 새로운 버전의 ISO/IEC 14882:2003을 발표했습니다.
다음 주요 개정 표준은 비공식적으로 "C++0x"로 언급되었으나, 2011년이 되어서야 공개되었습니다.[40] C++11(14882:2011)은 코어 언어와 표준 라이브러리 모두에 많은 추가 기능을 포함하고 있습니다.[37]
2014년 C++14(C++1y라고도 함)는 C++11의 작은 확장으로 출시되었으며, 주로 버그 수정과 작은 개선을 특징으로 합니다.[41] 국제 표준 투표 초안 절차는 2014년 8월 중순에 완료되었습니다.[42]
C++14 이후, 비공식적으로 C++1z로 알려진 주요 개정판 C++17이 2017년 7월 중순 ISO C++ 위원회에 의해 완성되었고, 2017년 12월에 승인 및 발표되었습니다.[43]
ISO는 표준화 프로세스의 일환으로 다음과 같은 기술 보고서 및 사양도 발표합니다.
- ISO/IEC TR 18015:2006[44] 임베디드 시스템에서 C++의 사용과 C++ 언어 및 라이브러리 기능의 성능에 대한 영향,
- 대부분 C++11로 통합된 라이브러리 확장에 관한 ISO/IEC TR 19768:2007[45] (C++ 기술 보고서 1로도 알려져 있음),
- 특수수학함수에 관한 ISO/IEC TR 29124:2010[46], C++17로 통합
- ISO/IEC TR 24733:2011[47] 소수 부동소수점 산술,
- 표준 파일 시스템 라이브러리의 ISO/IEC TS 18822:2015[48], C++17로 통합
- 표준 라이브러리 알고리즘의 병렬 버전에서 ISO/IEC TS 19570:2015[49], C++17로 통합
- 소프트웨어 트랜잭션 메모리에 관한 ISO/IEC TS 19841:2015[50],
- 새로운 라이브러리 확장 세트에 대한 ISO/IEC TS 19568:2015[51], 그 중 일부는 이미 C++17에 통합되어 있습니다.
- C++ 개념에 관한 ISO/IEC TS 19217:2015[52], C++20으로 통합
- ISO/IEC TS 19571:2016[53] 동시성을 위한 라이브러리 확장에 관한 것으로 일부는 이미 C++20에 통합되어 있습니다.
- ISO/IEC TS 19568:2017[54] 새로운 범용 라이브러리 확장 세트
- ISO/IEC TS 21425:2017[55] 범위용 라이브러리 확장판, C++20에 통합
- 코루틴에 관한 ISO/IEC TS 22277:2017[56], C++20에 통합
- 네트워킹 라이브러리의 ISO/IEC TS 19216:2018[57]
- 모듈의 ISO/IEC TS 21544:2018[58], C++20에 통합
- ISO/IEC TS 19570:2018[59] 병렬화를 위한 새로운 라이브러리 확장 세트
- ISO/IEC TS 23619:2021[60] 반사를 위한 새로운 확장 기능
새로운 동시성 확장 세트를 포함하여 더 많은 기술 사양이 개발 및 승인 보류 중입니다.[61]
언어
C++ 언어에는 두 가지 주요 구성 요소가 있습니다: 주로 C 하위 집합에서 제공되는 하드웨어 기능의 직접 매핑과 이러한 매핑을 기반으로 한 제로 오버헤드 추상화입니다. Stroustrup은 C++를 "효율적이고 우아한 추상화를 구축하고 사용하기 위해 설계된 경량 추상화 프로그래밍 언어"[15]라고 설명하고 "하드웨어 액세스와 추상화를 모두 제공하는 것이 C++의 기본"이라고 설명합니다. 효율적으로 수행하는 것이 다른 언어와 구별되는 점입니다."[62]
C++는 C의 구문 대부분을 이어받습니다. 다음은 C++ Standard Library 스트림 기능을 사용하여 표준 출력에 메시지를 작성하는 Bjarne Stroustrup 버전의 Hello world 프로그램입니다.[63][64][note 2]
# <아이오스트림> 인트의 주된() { std::꾸트 << "안녕, 세상!\n"; }
객체저장
C++는 C에서와 같이 정적 저장 기간 객체, 스레드 저장 기간 객체, 자동 저장 기간 객체 및 동적 저장 기간 객체의 네 가지 유형의 메모리 관리를 지원합니다.[65]
정적 저장 기간 개체
정적 저장 기간 개체가 생성되기 전에 생성됨 main()
입력(아래 예외 참조) 후 생성 순서의 역순으로 삭제됩니다. main()
출입구 정확한 작성 순서는 표준에 의해 지정되지 않아(아래에 정의된 일부 규칙이 있음에도) 구현을 구성하는 방법에서 자유롭게 구현할 수 있습니다. 좀 더 공식적으로 이러한 유형의 개체는 "프로그램 기간 동안 지속되는" 수명을 가집니다.[66]
정적 저장 기간 개체는 두 단계로 초기화됩니다. 먼저, "static initialization"이 수행되고, 모든 static initialization이 수행된 후에만 "dynamic initialization"이 수행됩니다. 정적 초기화에서 모든 객체는 먼저 0으로 초기화되며, 그 후 일정한 초기화 단계를 갖는 모든 객체는 상수식(즉, 리터럴 또는 리터럴로 초기화된 변수)으로 초기화됩니다. constexpr
표준에는 명시되어 있지 않지만 컴파일 시 정적 초기화 단계를 완료하여 실행 파일의 데이터 파티션에 저장할 수 있습니다. 동적 초기화에는 컨스트럭터 또는 함수 호출을 통해 수행되는 모든 개체 초기화가 포함됩니다(함수가 다음과 같이 표시되지 않은 경우). constexpr
, C++11)에서. 동적 초기화 순서는 컴파일 단위 내의 선언 순서(즉, 동일한 파일)로 정의됩니다. 컴파일 단위 간 초기화 순서에 대해서는 보장이 없습니다.
스레드 저장 기간 개체
이 유형의 변수는 정적 저장 기간 개체와 매우 유사합니다. 가장 큰 차이점은 생성 시간이 스레드 생성 직전이고 스레드가 연결된 후 파괴가 수행된다는 것입니다.[67]
자동 저장 기간 개체
C++에서 가장 일반적인 변수 유형은 함수 또는 블록 내부의 로컬 변수와 임시 변수입니다.[68] 자동 변수의 공통적인 특징은 수명이 변수의 범위로 제한된다는 것입니다. 이들은 선언 시점에서 생성되고 잠재적으로 초기화되며(자세한 내용은 아래 참조), 범위를 남길 때 생성 순서의 역순으로 파괴됩니다. 이것은 스택에 할당하여 구현됩니다.
로컬 변수는 실행 시점이 선언 시점을 지날 때 생성됩니다. 변수에 생성자 또는 초기화자가 있는 경우 개체의 초기 상태를 정의하는 데 사용됩니다. 로컬 변수는 선언된 로컬 블록 또는 함수가 닫히면 파괴됩니다. 로컬 변수에 대한 C++ 디스트럭터는 객체 수명이 끝날 때 호출되어 C++에서 널리 사용되는 RAI라고 하는 자동 자원 관리를 위한 규율을 허용합니다.
구성원 변수는 상위 개체가 생성될 때 생성됩니다. 배열 멤버는 배열의 마지막 멤버부터 순서대로 0부터 초기화됩니다. 구성원 변수는 상위 개체가 생성 순서의 반대로 파괴되면 파괴됩니다. 즉, 상위 개체가 "자동 개체"일 경우 해당 개체가 범위를 벗어나면 파괴되어 모든 구성원의 파괴를 유발합니다.
임시 변수는 식 평가의 결과로 생성되며, 식이 포함된 문이 완전히 평가된 경우(일반적으로 다음과 같은 경우) 파괴됩니다. ;
진술의 말미에)
동적 저장 기간 개체
이 개체는 동적 수명을 가지며 다음에 대한 호출로 직접 생성할 수 있습니다. new
에 대한 호출과 함께 명백하게 파괴되었습니다. delete
.[69]C[69]++도 지원합니다. malloc
그리고. free
, C에서, 그러나 이것들은 호환되지 않습니다. new
그리고. delete
. 사용 new
주소를 할당된 메모리로 반환합니다. C++ 핵심 지침은 사용하지 말 것을 권고합니다. new
스마트 포인터를 사용하여 동적 개체를 직접 생성합니다. make_unique<T>
1인 소유와 make_shared<T>
C++11에 도입된 [70]참조 카운트 다중 소유의 경우.
템플릿
C++ 템플릿은 일반적인 프로그래밍을 가능하게 합니다. C++는 함수, 클래스, 별칭 및 변수 템플릿을 지원합니다. 템플릿은 유형, 컴파일 시간 상수 및 기타 템플릿으로 매개 변수화될 수 있습니다. 템플릿은 컴파일 시 인스턴스화 방식으로 구현됩니다. 템플릿을 인스턴스화하기 위해 컴파일러는 템플릿의 매개 변수에 특정 인수를 대입하여 특정 함수 또는 클래스 인스턴스를 생성합니다. 일부 교체는 불가능합니다. 이러한 교체는 "교체 실패는 오류가 아닙니다"(SFINAE)라는 문구로 설명되는 과부하 해결 정책에 의해 제거됩니다. 템플릿은 일반 프로그래밍, 템플릿 메타프로그래밍 및 코드 최적화에 사용할 수 있는 강력한 도구이지만 이러한 성능은 비용을 의미합니다. 템플릿을 사용하면 객체 코드 크기가 증가할 수 있습니다. 각 템플릿 인스턴스화는 템플릿 인수 집합마다 하나씩 템플릿 코드의 복사본을 생성하지만, 이는 코드가 손으로 작성된 경우 생성되는 것과 같거나 더 작은 양의 코드입니다.[71] 이것은 다른 언어(예: Java)에서 볼 수 있는 런타임 제네릭과 대조적으로 컴파일 시 유형이 삭제되고 단일 템플릿 본문이 보존됩니다.
템플릿은 매크로와 다릅니다. 이러한 컴파일 타임 언어 기능은 모두 조건부 컴파일을 가능하게 하지만 템플릿은 어휘 대체에만 국한되지 않습니다. 템플릿은 모든 컴파일 시간 유형 정의뿐만 아니라 해당 언어의 의미론 및 유형 시스템을 알고 있으며 엄격하게 유형 검사된 매개 변수의 평가를 기반으로 프로그램 흐름 제어를 포함한 높은 수준의 작업을 수행할 수 있습니다. 매크로는 미리 정해진 기준에 따라 컴파일을 조건부로 제어할 수 있지만, 새로운 유형을 인스턴스화하거나 반복하거나 형식 평가를 수행할 수 없으며 사실상 컴파일 전 텍스트 대체 및 텍스트 포함/제외로 제한됩니다. 즉, 매크로는 미리 정의된 심볼을 기반으로 컴파일 흐름을 제어할 수 있지만 템플릿과 달리 새로운 심볼을 독립적으로 인스턴스화할 수 없습니다. 템플릿은 정적 다형성(아래 참조)과 일반 프로그래밍을 위한 도구입니다.
또한 템플릿은 튜링-완전한 C++의 컴파일 타임 메커니즘으로, 컴퓨터 프로그램에 의해 표현 가능한 모든 계산이 런타임 이전의 템플릿 메타 프로그램에 의해 어떤 형태로든 계산될 수 있음을 의미합니다.
요약하면 템플릿은 컴파일 시간 매개 변수화된 함수 또는 클래스로 인스턴스화하는 데 사용되는 특정 인수에 대한 지식 없이 작성됩니다. 인스턴스화 후 결과 코드는 전달된 인수를 위해 특별히 작성된 코드와 동일합니다. 이러한 방식으로 템플릿은 추상화로 인해 성능을 희생시키지 않고 기능 및 클래스(템플릿으로 인코딩됨)의 일반적이고 광범위하게 적용 가능한 측면을 특정 측면(템플릿 매개 변수로 인코딩됨)에서 분리하는 방법을 제공합니다.
물건들
C++는 객체 지향 프로그래밍(OOP) 기능을 C에 도입합니다. OOP(및 일부 비 OOP) 언어에 일반적으로 존재하는 추상화, 캡슐화, 상속 및 다형성의 네 가지 기능을 제공하는 클래스를 제공합니다. 다른 프로그래밍 언어의 클래스와 비교하여 C++ 클래스의 특징 중 하나는 결정론적 파괴자에 대한 지원이며, 이는 다시 RAI(Resource Acquisition is Initialization) 개념에 대한 지원을 제공합니다.
캡슐화
캡슐화는 데이터 구조와 연산자가 의도한 대로 사용되도록 보장하고 개발자에게 사용 모델을 보다 명확하게 만들기 위한 정보를 숨기는 것입니다. C++는 클래스 및 기능을 기본 캡슐화 메커니즘으로 정의하는 기능을 제공합니다. 클래스 내에서 구성원은 공개, 보호 또는 비공개로 선언되어 명시적으로 캡슐화를 시행할 수 있습니다. 클래스의 공용 구성원은 모든 기능에 액세스할 수 있습니다. 개인 구성원은 해당 클래스의 구성원인 기능과 클래스("친구")가 명시적으로 액세스 권한을 부여한 기능 및 클래스에만 액세스할 수 있습니다. 보호된 구성원은 클래스 자체 및 친구 외에 클래스에서 상속되는 클래스의 구성원에게 액세스할 수 있습니다.
개체 지향 원칙은 유형의 내부 표현에 액세스하는 모든 기능과 기능의 캡슐화를 보장합니다. C++는 회원 기능과 친구 기능을 통해 이 원리를 지원하지만 강제하지는 않습니다. 프로그래머는 유형 표현의 일부 또는 전부를 공용으로 선언할 수 있으며 공용 엔티티를 유형 표현의 일부가 아닌 것으로 만들 수 있습니다. 따라서 C++는 객체 지향 프로그래밍뿐만 아니라 모듈형 프로그래밍과 같은 다른 분해 패러다임을 지원합니다.
일반적으로 모든 데이터를 비공개 또는 보호하고 클래스 사용자를 위한 최소한의 인터페이스의 일부인 기능만 공개하는 것이 좋은 방법으로 간주됩니다. 이렇게 하면 데이터 구현의 세부 사항을 숨길 수 있으므로 설계자는 나중에 인터페이스를 변경하지 않고도 구현을 근본적으로 변경할 수 있습니다.[72][73]
상속
상속을 통해 한 데이터 유형이 다른 데이터 유형의 속성을 획득할 수 있습니다. 기본 클래스의 상속은 공개, 보호 또는 비공개로 선언될 수 있습니다. 이 액세스 지정자는 관련되지 않은 클래스와 파생된 클래스가 기본 클래스의 상속된 공용 멤버와 보호된 멤버에 액세스할 수 있는지 여부를 결정합니다. 공개 상속만이 보통 "상속"이 의미하는 것에 해당합니다. 다른 두 가지 형태는 훨씬 덜 자주 사용됩니다. 액세스 지정자가 생략된 경우 "클래스"는 개인적으로 상속되고 "구조"는 공개적으로 상속됩니다. 기본 클래스는 가상으로 선언될 수 있으며, 이를 가상 상속이라고 합니다. 가상 상속은 상속 그래프에 기본 클래스의 인스턴스가 하나만 존재하도록 하여 여러 상속의 모호성 문제 중 일부를 방지합니다.
다중 상속은 C++ 기능으로 하나 이상의 기본 클래스에서 클래스를 파생할 수 있으며, 이를 통해 보다 정교한 상속 관계가 가능합니다. 예를 들어, "플라잉 캣" 클래스는 "고양이"와 "플라잉 포유류" 둘 다에서 상속받을 수 있습니다. C#이나 자바와 같은 일부 다른 언어들은 기본 클래스의 수를 하나로 제한하면서 여러 인터페이스를 상속할 수 있게 함으로써 비슷한 것을 수행합니다(인터페이스는 클래스와 달리 멤버 함수의 선언만 제공하고 구현이나 멤버 데이터는 제공하지 않습니다). C# 및 자바와 같은 인터페이스는 C++에서 추상 기본 클래스 또는 "ABC"로 알려진 순수 가상 함수만을 포함하는 클래스로 정의할 수 있습니다. 이러한 추상 기본 클래스의 멤버 함수는 일반적으로 유도된 클래스에서 명시적으로 정의되며, 암묵적으로 상속되지는 않습니다. C++ 가상 상속은 dominance라는 모호성 해결 기능을 나타냅니다.
연산자 및 연산자 과부하
교환입니다. | 기호. |
---|---|
스코프 해상도 연산자 | :: |
조건 연산자 | ?: |
점 연산자 | . |
구성원선택연산자 | .* |
"size of" 연산자 | sizeof |
"typeid" 연산자 | typeid |
C++는 35개 이상의 연산자를 제공하며, 기본 연산, 비트 조작, 간접 연산, 비교, 논리 연산 등을 다룹니다. 거의 모든 오퍼레이터가 사용자 정의 유형에 대해 과부하될 수 있으며, 멤버 액세스와 같은 몇 가지 주목할 만한 예외가 있습니다..
그리고. .*
) 및 조건 연산자. C++의 사용자 정의 유형이 내장형처럼 보이게 하는 데는 과부하 가능한 연산자 세트가 중심입니다.
과부하 가능 연산자는 스마트 포인터와 같은 많은 고급 C++ 프로그래밍 기술의 필수적인 부분이기도 합니다. 연산자를 오버로드해도 연산자와 관련된 계산의 우선순위가 변경되지 않으며, 연산자가 사용하는 피연산자의 수가 변경되지 않습니다(단, 실행 전에 평가되지만 연산자가 피연산자를 무시할 수도 있습니다). 오버로드됨"&&
" 그리고"
" 연산자가 단락 평가 속성을 잃게 됩니다.
다형성
다형성은 하나의 공통 인터페이스를 통해 여러 구현을 가능하게 하며, 여러 상황에서 개체가 다르게 동작할 수 있게 해줍니다.
C++는 위에서 설명한 언어 기능을 지원하는 여러 종류의 정적(컴파일 시 해결) 및 동적(실행 시 해결) 다형성을 지원합니다. 컴파일 시간 다형성은 특정 런타임 결정을 허용하지 않는 반면 런타임 다형성은 일반적으로 성능 패널티를 발생시킵니다.
정적다형성
함수 과부하를 통해 프로그램은 이름은 같지만 인수가 다른 여러 함수를 선언할 수 있습니다(즉, 임시 다형성). 함수는 형식 매개 변수의 수 또는 유형에 따라 구별됩니다. 따라서 동일한 함수 이름은 사용되는 컨텍스트에 따라 다른 함수를 지칭할 수 있습니다. 함수에 의해 반환되는 유형은 오버로드된 함수를 구별하는 데 사용되지 않으며 반환 유형이 다를 경우 컴파일 시간 오류 메시지가 표시됩니다.
함수를 선언할 때 프로그래머는 하나 이상의 매개변수에 대해 기본값을 지정할 수 있습니다. 이렇게 하면 함수가 호출될 때 기본값이 있는 매개 변수를 선택적으로 생략할 수 있으며, 이 경우 기본값 인수가 사용됩니다. 선언된 매개 변수보다 적은 수의 인수로 함수가 호출되면 명시적 인수가 왼쪽에서 오른쪽 순서로 매개 변수와 일치하며 매개 변수 목록 끝에 있는 일치하지 않는 매개 변수에는 기본 인수가 할당됩니다. 많은 경우에 단일 함수 선언에서 기본 인수를 지정하는 것이 다른 수의 매개 변수로 오버로드된 함수 정의를 제공하는 것보다 더 좋습니다.
C++의 템플릿은 일반 다형성 코드(즉, 매개 변수 다형성)를 작성하기 위한 정교한 메커니즘을 제공합니다. 특히, 이상하게 반복되는 템플릿 패턴을 통해 가상 함수를 재정의하는 구문을 밀접하게 모방하는 정적 다형성의 형태를 구현할 수 있습니다. C++ 템플릿은 유형 인식 및 튜링-완전이므로 컴파일러가 템플릿 메타프로그래밍을 통해 재귀 조건을 해결하고 상당한 프로그램을 생성하는 데 사용할 수도 있습니다. 일부 의견과는 달리 템플릿 코드는 적절한 컴파일러 설정으로 컴파일한 후 대량 코드를 생성하지 않습니다.[71]
동적다형성
상속
C++의 기본 클래스 유형에 대한 변수 포인터 및 참조는 해당 유형의 파생된 클래스의 개체를 참조할 수도 있습니다. 이를 통해 배열 및 다른 종류의 컨테이너가 다른 유형의 개체에 대한 포인터를 고정할 수 있습니다(컨테이너에는 참조를 직접 고정할 수 없음). 이렇게 하면 참조된 개체가 (실제, 파생된) 유형에 따라 다르게 동작할 수 있는 동적(런타임) 다형성이 가능합니다.
C++는 또한 다음을 제공합니다. dynamic_cast
코드가 기본 참조/pointer를 통해 객체를 더 파생된 유형인 다운캐스팅으로 안전하게 변환을 시도할 수 있게 해주는 연산자. 어떤 파생 유형이 참조되는지 모르는 경우가 많기 때문에 시도가 필요합니다. (업캐스팅, 보다 일반적인 유형으로의 변환, 컴파일 시 항상 확인/수행 가능) static_cast
, 조상 클래스가 파생 클래스의 인터페이스에 지정되므로 모든 발신자가 볼 수 있습니다.) dynamic_cast
프로그램의 메타데이터인 RTTI(run-time type information)에 의존하여 유형과 그 관계를 구별할 수 있습니다. 만약에 dynamic_cast
포인터가 실패하면 결과는 nullptr
대상이 참조인 경우(null이 될 수 없음) 출연자가 예외를 적용하는 반면, 대상은 상수입니다. 특정 파생 유형인 것으로 알려진 개체는 다음과 같이 캐스팅할 수 있습니다. static_cast
, RTTI 및 안전한 런타임 유형 검사 우회 dynamic_cast
, 따라서 이것은 프로그래머가 출연진이 유효하고 항상 유효하다고 확신하는 경우에만 사용해야 합니다.
가상 멤버 함수
일반적으로 파생 클래스의 함수가 기본 클래스의 함수를 재정의할 때 호출할 함수는 개체의 유형에 따라 결정됩니다. 해당 함수에 대한 두 개 이상의 정의 간에 매개 변수의 수 또는 유형에 차이가 없으면 해당 함수가 재정의됩니다. 따라서 컴파일 시 기본 클래스 포인터만 주어지면 개체의 유형과 호출할 올바른 함수를 결정할 수 없을 수 있습니다. 따라서 결정은 런타임까지 연기됩니다. 이를 동적 디스패치라고 합니다. 가상 멤버 함수 또는 메서드는[74] 개체의 실제 실행 시간 유형에 따라 함수의 가장 구체적인 구현을 호출할 수 있습니다. C++ 구현에서는 일반적으로 가상 함수 테이블을 사용합니다. 개체 유형이 알려진 경우 함수 호출 전에 정규화된 클래스 이름을 미리 붙여 우회할 수 있지만 일반적으로 가상 함수에 대한 호출은 실행 시간에 해결됩니다.
표준 멤버 기능 외에도 운영자 과부하 및 파괴자를 가상화할 수 있습니다. 실제 경험에 기초한 부정확한 규칙은 수업에서 어떤 함수가 가상적이라면, 파괴자도 마찬가지여야 한다는 것을 말합니다. 작성할 때 개체의 유형이 컴파일 시에 알려져 있으므로 생성자와 확장 복사본 생성자는 가상화할 수 없습니다. 그러나, 도출된 오브젝트에 대한 포인터가 베이스 오브젝트에 대한 포인터로 전달되는 경우 오브젝트의 복사본을 생성해야 하는 상황이 발생할 수 있습니다. 이러한 경우 일반적인 해결책은 다음을 생성하는 것입니다. clone()
(또는 이와 유사한) 가상 함수는 호출 시 파생된 클래스의 복사본을 생성하고 반환합니다.
멤버 기능을 추가하여 "순수 가상"으로 만들 수도 있습니다. = 0
접두사 뒤에 세미콜론 앞에. 순수한 가상 함수를 포함하는 클래스를 추상 클래스라고 합니다. 개체는 추상 클래스에서만 만들 수 있습니다. 파생된 클래스는 가상 함수를 순수한 것으로 상속하며 파생된 클래스의 개체를 생성하기 전에 가상 함수(및 다른 모든 순수한 가상 함수)에 대한 비순수한 정의를 제공해야 합니다. 순수 가상 멤버 함수 또는 상속된 순수 가상 멤버 함수로 클래스의 객체를 생성하려는 프로그램이 잘못 형성된 경우.
람다식
C++는 람다 표현식이라고도 하는 익명 함수를 다음과 같은 형태로 지원합니다.[75]
[캡처](매개 변수) -> return_type { function_body }
C++20 이후로 키워드는 template
람다 식의 템플릿 매개변수에 대해서는 옵션입니다.
[캡처]<템플릿_파라미터>(매개 변수) -> return_type { function_body }
람다에 모수가 없고 반환 형식이나 기타 지정자가 사용되지 않으면 ()를 생략할 수 있습니다.
[캡처] { function_body }
람다 식의 반환 유형은 가능하면 다음과 같이 자동으로 추론할 수 있습니다.
[](인트의 x, 인트의 y) { 돌아가다 x + y; } // 추론된 [](인트의 x, 인트의 y) -> 인트의 { 돌아가다 x + y; } // 노골적인
그 [capture]
list는 폐쇄의 정의를 지원합니다. 이러한 람다 표현식은 명명되지 않은 함수 객체에 대한 통사적 설탕으로 표준에서 정의됩니다.
예외처리
예외 처리는 런타임 문제 또는 오류가 감지된 위치에서 문제를 처리할 수 있는 위치로 전달하는 데 사용됩니다.[76] 이를 통해 모든 오류를 감지하면서 주 코드와 별도로 균일한 방식으로 수행할 수 있습니다.[77] 오류가 발생하면 예외가 발생(상승)되고, 이는 가장 가까운 적절한 예외 처리기에 의해 탐지됩니다. 예외로 인해 현재 스코프가 종료되고 적절한 핸들러가 발견될 때까지 각 외부 스코프(전파)가 종료되어 이 종료된 스코프에 있는 오브젝트의 소멸자를 차례로 호출합니다.[78] 동시에, 감지된 문제에 대한 데이터를 운반하는 객체로서 예외가 제시됩니다.[79]
구글,[80] LLVM,[81] Qt와[82] 같은 일부 C++ 스타일 가이드는 예외 사용을 금지합니다.
예외를 유발하는 코드는 다음과 같습니다. try
막다 예외는 별도로 처리됩니다. catch
블록(핸들러); 각각 try
블록에는 아래 예제에서 볼 수 있는 것처럼 여러 예외 처리기가 있을 수 있습니다.[83]
# <아이오스트림> # <vector> # <stdexcept> 인트의 주된() { 해라 { std::벡터의<인트의> 관목의{3, 4, 3, 1}; 인트의 i{관목의.에(4)}; // 예외인 std::out_of_range를 던집니다(vec에 대한 인덱싱은 0-3에서 1-4가 아닙니다). } // 예외 처리기가 vec.at (4)에서 던지는 std::out_of_range를 가져옵니다. 또 만나 (상투적인 std::범위를 벗어난 &e) { std::쎄르 << "존재하지 않는 요소 접근:" << e.무슨() << '\n''; } // 다른 표준 라이브러리 예외를 확인하려면(std::exception에서 파생됨) 또 만나 (상투적인 std::예외. &e) { std::쎄르 << "예외로 던져진 경우:" << e.무슨() << '\n''; } // 인식되지 않은 예외(즉, std::exception에서 파생되지 않은 예외)를 확인합니다. 또 만나 (...) { std::쎄르 << "어떤 치명적인 오류.\n"; } }
또한 다음을 사용하여 의도적으로 예외를 제기할 수 있습니다. throw
키워드; 이러한 예외는 일반적인 방식으로 처리됩니다. 기술적인 이유로 예외를 사용할 수 없는 경우도 있습니다. 그러한 예 중 하나는 모든 작업이 지정된 시간 내에 완료되도록 보장되어야 하는 임베디드 시스템의 중요한 구성 요소입니다. 예외 처리에 필요한 최대 시간을 결정하는 도구가 없으므로 예외를 사용하여 이를 결정할 수 없습니다.[84]
장애 지점에서 핸들링 함수가 호출되는 신호 핸들링과 달리, 예외 핸들링은 현재 함수 또는 스택에 있는 이전 함수 호출 중 임의의 것에 위치할 수 있는 캐치 블록이 입력되기 전에 현재 범위를 빠져나갑니다.
열거형
C++에는 C에서 직접 상속되는 열거형이 있으며, 열거형이 C++의 실제 유형이라는 점을 제외하고는 대부분 이와 같이 작동합니다. 이 경우 컴파일 시간 검사 기능이 추가됩니다. 또한 (구조물과 마찬가지로) C++ enum
키워드가 a와 결합되어 있습니다. typedef를 입력하여 유형 이름을 지정하는 대신 enum name
, 간단히 이름을 대세요. name
. 이는 다음과 같은 유형의 ef를 사용하여 C에서 시뮬레이션할 수 있습니다. typedef enum {Value1, Value2} name;
C++11은 또한 범위 열거라고 하는 두 번째 종류의 열거를 제공합니다. 열거자는 정수 유형으로 암묵적으로 변환되지 않습니다. 이를 통해 열거 유형에 대해 I/O 스트리밍을 정의할 수 있습니다. 범위 지정 열거의 또 다른 특징은 열거자가 누출되지 않으므로 사용하려면 열거자의 이름 앞에 접두사를 붙여야 한다는 것입니다(예: Color::Red
다음 예제의 첫 번째 열거자에 대하여), a가 아니면 using enum
(C++20에 도입된) 선언은 열거자를 현재 범위로 가져오는 데 사용되었습니다. 범위 지정된 열거는 구로 지정됩니다. enum class
(혹은) enum struct
). 예를 들어 다음과 같습니다.
열거한 학급 색. {빨간., 초록의, 파랑색};
열거형의 기본 유형은 열거된 모든 값을 담을 수 있을 정도로 큰 구현 정의 적분 유형이며, 가능한 가장 작은 유형일 필요는 없습니다. 기본 유형을 직접 지정할 수 있으므로 열거의 "포워드 선언"이 가능합니다.
열거한 학급 색. : 긴 {빨간., 초록의, 파랑색}; // 크기와 메모리 레이아웃에 맞아야 합니다. 'long' 유형입니다. 열거한 학급 모양들 : 촤; // 전향 선언 나중에 'char'에 맞지 않는 값이 정의되면 오류입니다.
표준도서관

C++ 표준은 핵심 언어와 표준 라이브러리의 두 부분으로 구성됩니다. C++ 프로그래머들은 C++의 모든 주요 구현에서 후자를 기대합니다; 이것은 집합체 유형(벡터, 리스트, 맵, 세트, 큐, 스택, 어레이, 튜플), 알고리즘(find_each, binary_search, random_shuffle 등), 입출력 기능(iostream, 콘솔 및 파일에서 읽고 쓰기 위해), 파일 시스템 라이브러리, 로컬라이제이션 지원, 자동 메모리 관리를 위한 스마트 포인터, 정규 표현 지원, 멀티 thread링 라이브러리, 아토믹스 지원(외부 동기화 없이 한 번에 하나 이상의 스레드에서 읽거나 쓸 변수 allowing), 시간 유틸리티(측정, 현재 시간 획득 등), C++ 예외를 사용하지 않는 오류 보고를 C++ 예외로 변환하기 위한 시스템, 난수 생성기 및 C 표준 라이브러리의 약간 수정된 버전(C++ 타입 시스템을 준수하도록).
C++ 라이브러리의 대부분은 STL(Standard Template Library)을 기반으로 합니다. STL에서 제공하는 유용한 도구에는 객체(예: 벡터 및 목록) 모음과 같은 컨테이너, 컨테이너에 대한 배열과 같은 액세스를 제공하는 반복기, 검색 및 정렬과 같은 작업을 수행하는 알고리즘 등이 있습니다.
또한 (다중) 맵(연관 어레이) 및 (다중) 세트가 제공되며, 이들은 모두 호환되는 인터페이스를 내보냅니다. 따라서 템플릿을 사용하면 컨테이너 또는 반복자가 정의한 시퀀스에서 작동하는 일반 알고리즘을 작성할 수 있습니다. C에서와 같이, 라이브러리의 기능은 다음을 사용하여 액세스됩니다. #include
표준 헤더를 포함하도록 지시합니다. C++ 표준 라이브러리는 105개의 표준 헤더를 제공하며, 이 중 27개는 더 이상 사용되지 않습니다.
이 표준에는 여러 해 동안 일반 알고리즘과 컨테이너를 실험한 알렉산더 스테파노프(Alexander Stepanov)가 원래 설계한 STL이 통합되어 있습니다. C++로 시작했을 때, 그는 함수 포인터 대신 인라인 및 컴파일 타임 바인딩을 사용하는 것과 같은 C++ 기능 덕분에 C 표준 라이브러리 qsort보다 훨씬 성능이 뛰어난 일반 알고리즘(예: STL 정렬)을 만들 수 있는 언어를 마침내 발견했습니다. 표준은 표준 라이브러리의 일부에 불과하기 때문에 "STL"이라고 부르지 않지만, 이 용어는 여전히 표준 라이브러리의 나머지(입력/출력 스트림, 국제화, 진단, C 라이브러리 서브셋 등)와 구별하기 위해 널리 사용됩니다.[85]
대부분의 C++ 컴파일러와 모든 주요 컴파일러는 C++ 표준 라이브러리의 표준 준수 구현을 제공합니다.
C++ 핵심 지침
C++ 핵심 지침은[86] C++의 발명가인 Bjarne Stroustrup과 C++ ISO 작업 그룹의 의장이자 의장인 Herb Sutter가 주도하여 프로그래머들이 C++11 이상의 언어 표준에 대한 모범 사례를 사용하여 'Modern C++'를 작성할 수 있도록 지원하는 계획입니다. 그리고 컴파일러와 정적 검사 도구의 개발자들이 잘못된 프로그래밍 관행을 잡기 위한 규칙을 만들 수 있도록 도와줍니다.
효율적이고 일관성 있게 타입과 리소스 세이프 C++를 작성하는 것이 주요 목표입니다.
핵심 지침은 2015년 CPPC에서 개막 기조연설을 통해[87] 발표되었습니다.
가이드라인에는 가이드라인 지원 라이브러리(GSL),[88] 핵심 가이드라인을 구현하기 위한 유형 및 기능의 헤더 전용 라이브러리 및 가이드라인 규칙을 적용하기 위한 정적 검사 도구가 포함되어 있습니다.[89]
호환성.
컴파일러 벤더에게 더 큰 자유를 주기 위해 C++ 표준 위원회는 이름 망글링, 예외 처리 및 기타 구현별 기능의 구현을 지시하지 않기로 결정했습니다. 이 결정의 단점은 서로 다른 컴파일러가 생성한 객체 코드가 호환되지 않을 것으로 예상된다는 것입니다. 그러나 특정 시스템이나 운영 체제(예: C++ ABI)에 대해 컴파일러를 표준화하려는 시도가 있었지만,[90] 현재는 거의 포기된 것으로 보입니다.
C와 함께
C++는 종종 C의 초집합으로 간주되지만 이는 엄밀하게 사실이 아닙니다.[91] 대부분의 C 코드는 C++에서 올바르게 컴파일되도록 쉽게 만들 수 있지만 몇 가지 차이점이 있어 일부 유효한 C 코드가 무효화되거나 C++에서 다르게 동작합니다. 예를 들어, C는 다음에서 암시적 변환을 허용합니다. void*
다른 포인터 형식에 적용되지만 C++는 적용되지 않습니다(타입 안전상의 이유로). 또한 C++는 다음과 같은 많은 새로운 키워드를 정의합니다. new
그리고. class
, C 프로그램에서 식별자(예: 변수 이름)로 사용할 수 있습니다.
일부 비호환성은 1999년 개정된 C 표준(C99)에 의해 제거되었으며, 현재는 라인 코멘트와 같은 C++ 기능을 지원합니다.//
) 및 코드가 혼합된 선언입니다. 반면, C99는 C++에서 호환되지 않거나 중복되는 C++가 지원하지 않는 많은 새로운 기능들을 도입했습니다. 가변 길이 어레이, 네이티브 복소수 타입(그러나 다음과 같은 기능) std::complex
C++ 표준 라이브러리의 클래스는 코드 호환은 아니지만 유사한 기능을 제공합니다), 지정된 초기화기, 복합 리터럴 및 restrict
키워드[92] C99가 도입된 기능 중 일부는 C++ 표준의 후속 버전인 C++11에 포함되었습니다(중복되지 않은 기능 중).[93][94][95] 그러나 C++11 표준은 문자열 리터럴을 문자 포인터에 할당하는 것을 허용하지 않는 것과 같은 새로운 비호환성을 도입합니다.
C와 C++ 코드를 혼합하려면 C와 C++ 둘 다에서 호출/사용될 함수 선언 또는 정의를 C 링크로 선언해야 합니다. extern "C" {/*...*/}
막다 이러한 함수는 이름 망글링(즉, 함수 과부하)에 따라 기능에 의존하지 않을 수 있습니다.
비평
널리 채택되었음에도 불구하고, 라이너스 토발즈,[96] 리차드 스톨먼, 조슈아 블로흐,[97] 켄 톰슨[98][99][100], 도날드 크누스 등 일부 저명한 프로그래머들은 C++ 언어를 비판했습니다.[101][102]
C++의 가장 자주 비판되는 점 중 하나는 언어로서의 인식된 복잡성이며, 실제로 많은 수의 비직교적인 기능이 코드를 C++의 하위 집합으로 제한해야 하므로 일반적인 스타일과 관용어의 가독성 이점을 피할 수 있다는 비판이 있습니다. Joshua Bloch가 표현한 바와 같이:
C++는 복잡도 한계를 훨씬 넘겼지만 프로그래밍하는 사람들이 많다고 생각합니다. 하지만 당신이 하는 일은 사람들에게 그것을 하위 집합으로 강요하는 것입니다. 그래서 제가 C++를 사용하는 것을 알고 있는 거의 모든 상점에서 "네, C++를 사용하고 있지만 다중 구현 상속을 하지 않고 있으며 운영자 오버로딩을 사용하지 않습니다."라고 말합니다. 결과 코드의 복잡성이 너무 높기 때문에 사용하지 않을 기능이 많습니다. 그리고 그렇게 시작해야 할 때는 좋지 않다고 생각합니다. 모든 사람이 다른 사람의 코드를 읽을 수 있는 프로그래머 휴대성을 잃게 되는데, 저는 이것이 매우 좋은 일이라고 생각합니다.
도널드 크누스(Donald Knuth, 1993)는 에드거 데이크스트라에 대해 "C++로 프로그래밍하는 것을 생각하면 그를 육체적으로 아프게 할 것"이라고 말했습니다.[101][102]
오늘 제가 그들과 가진 문제는... C++는 너무 복잡합니다. 현재로서는 모든 이국적인 기능을 피하지 않는 한 다양한 시스템에서 작동할 것으로 생각되는 휴대용 코드를 작성하는 것은 불가능합니다. C++ 언어 디자이너들이 어떤 문제를 어떻게 해결해야 하는지에 대해 두 가지 경쟁적인 아이디어를 가질 때마다, 그들은 "좋아요, 우리 둘 다 할게요"라고 말했습니다. 그래서 제 입맛에는 언어가 너무 바로크적입니다.
Bell Labs의 Stroustrup의 동료였던 Ken Thompson은 다음과 같이 평가합니다.[99][100]
확실히 좋은 점이 있습니다. 하지만 대체로 저는 그것이 나쁜 언어라고 생각합니다. 많은 일을 반쯤은 잘 해내고 서로 배타적인 아이디어만 쓰레기 더미에 불과합니다. 개인이든 기업이든 제가 아는 모든 사람들은 부분집합을 선택하고 이 부분집합들은 다릅니다. 따라서 알고리즘을 전달하는 것은 좋은 언어가 아닙니다. "내가 썼다. 여기, 받아라." 너무 크고 너무 복잡해요. 그리고 그것은 분명히 위원회에 의해 지어졌습니다. Stroustrup은 그가 언어를 채택하고 사용하기 위해 그 언어에 대한 어떤 종류의 기술적인 기여를 훨씬 뛰어넘어 수년간 캠페인을 벌였습니다. 그리고 그는 모든 표준 위원회를 회초리와 의자로 운영했습니다. 그리고 아무에게도 "아니오"라고 대답했습니다. 그는 모든 특징을 그 언어로 표현했습니다. 그것은 깨끗하게 설계된 것이 아니라 단지 모든 것이 합쳐진 것입니다. 그리고 그로 인해 큰 피해를 입었다고 생각합니다.
그러나 Bell Labs의 동료이기도 한 Brian Kernighan은 다음과 같은 평가에 이의를 제기합니다.[103]
C++는 엄청난 영향력을 행사해 왔습니다... 많은 사람들이 C++가 너무 크고 복잡하다고 말하지만 사실 그것은 매우 강력한 언어이고 정말 합리적인 이유로 거기에 있는 거의 모든 것이 있습니다. 누군가가 무작위로 발명하는 것이 아니라 실제로 현실 세계의 문제를 해결하려고 노력하는 사람들입니다. 오늘날 우리가 당연하게 여기는 많은 프로그램들이 바로 C++ 프로그램입니다.
Stroustrup 자신은 C++ 시맨틱스가 구문보다 훨씬 깨끗하다고 언급했습니다: "C++ 내에는 훨씬 더 작고 깨끗한 언어가 있습니다."[104]
다른 불만 사항으로는 특히 템플릿 메타프로그래밍의 반사 또는 가비지 수집 부족, 긴 컴파일 시간, 인지된 특징 크리프 [105]및 장황한 오류 메시지가 포함될 수 있습니다.[106]
참고 항목
각주
- ^ C++20 스택 없는 코루틴의 아이디어입니다.
- ^ 이 코드는 Bjarne Stroustrup의 errata 페이지(633쪽)에서 직접 복사됩니다. 그는 다음과 같은 용도로 사용합니다.
'\n'
보다는std::endl
. "메인()을 회피할 수 있습니까?"를 참조하십시오.2020년 7월 2일 Wayback Machine에서 암묵적 설명을 위해 아카이브됨return 0;
에서main
기능. 이 암묵적 반환은 다른 함수에서는 사용할 수 없습니다.
참고문헌
- ^ "Overview of modules in C++". Microsoft. 24 April 2023.
- ^ a b c d e f Stroustrup, Bjarne (1996). "A history of C++: 1979-1991". History of programming languages---II. ACM. pp. 699–769. doi:10.1145/234286.1057836.
- ^ Stroustrup, Bjarne (16 December 2021). "C++20: Reaching for the Aims of C++ - Bjarne Stroustrup - CppCon 2021". CppCon. Archived from the original on 30 December 2021. Retrieved 30 December 2021.
- ^ Stroustrup, Bjarne (12 June 2020). "Thriving in a crowded and changing world: C++ 2006–2020". Proceedings of the ACM on Programming Languages. Association for Computing Machinery (ACM). 4 (HOPL): 1–168. doi:10.1145/3386320. ISSN 2475-1421. S2CID 219603741.
- ^ Naugler, David (May 2007). "C# 2.0 for C++ and Java programmer: conference workshop". Journal of Computing Sciences in Colleges. 22 (5).
Although C# has been strongly influenced by Java it has also been strongly influenced by C++ and is best viewed as a descendant of both C++ and Java.
- ^ "Chapel spec (Acknowledgements)" (PDF). Cray Inc. 1 October 2015. Archived (PDF) from the original on 24 June 2018. Retrieved 14 January 2016.
- ^ "Rich Hickey Q&A by Michael Fogus". Archived from the original on 11 January 2017. Retrieved 11 January 2017.
- ^ Harry. H. Chaudhary (28 July 2014). "Cracking The Java Programming Interview :: 2000+ Java Interview Que/Ans". Archived from the original on 27 May 2021. Retrieved 29 May 2016.
- ^ Roger Poon (1 May 2017). "Scaling JS++: Abstraction, Performance, and Readability". Archived from the original on 11 May 2020. Retrieved 21 April 2020.
- ^ "The evolution of an extension language: a history of Lua". www.lua.org. Retrieved 4 January 2023.
- ^ "FAQ Nim Programming Language". Archived from the original on 11 July 2017. Retrieved 21 April 2020.
- ^ "9. Classes — Python 3.6.4 documentation". docs.python.org. Archived from the original on 23 October 2012. Retrieved 9 January 2018.
- ^ "Influences - The Rust Reference". doc.rust-lang.org. Retrieved 4 January 2023.
- ^ Stroustrup, Bjarne (1997). "1". The C++ Programming Language (Third ed.). Addison-Wesley. ISBN 0-201-88954-4. OCLC 59193992.
- ^ a b c Stroustrup, B. (6 May 2014). "Lecture:The essence of C++. University of Edinburgh". YouTube. Archived from the original on 28 April 2015. Retrieved 12 June 2015.
- ^ Stroustrup, Bjarne (17 February 2014). "C++ Applications". stroustrup.com. Archived from the original on 4 April 2021. Retrieved 5 May 2014.
- ^ a b "ISO/IEC 14882:2020". International Organization for Standardization. Archived from the original on 16 December 2020. Retrieved 16 December 2020.
- ^ "Bjarne Stroustrup's Homepage". www.stroustrup.com. Archived from the original on 14 May 2019. Retrieved 15 May 2013.
- ^ "C++ IS schedule" (PDF). Archived (PDF) from the original on 10 August 2020. Retrieved 9 August 2020.
- ^ "C++; Where it's heading". Archived from the original on 3 December 2018. Retrieved 3 December 2018.
- ^ a b Stroustrup, Bjarne (7 March 2010). "Bjarne Stroustrup's FAQ: When was C++ invented?". stroustrup.com. Archived from the original on 6 February 2016. Retrieved 16 September 2010.
- ^ a b Stroustrup, Bjarne. "Evolving a language in and for the real world: C++ 1991-2006" (PDF). Archived (PDF) from the original on 20 November 2007. Retrieved 14 August 2013.
- ^ a b c Stroustrup, Bjarne. "A History of C ++ : 1979− 1991" (PDF). Archived (PDF) from the original on 2 February 2019. Retrieved 18 July 2013.
- ^ Stroustrup, Bjarne. "The C++ Programming Language" (First ed.). Archived from the original on 9 August 2012. Retrieved 16 September 2010.
- ^ Stroustrup, Bjarne. "The C++ Programming Language" (Second ed.). Archived from the original on 9 August 2012. Retrieved 16 September 2010.
- ^ Sutter, Herb (30 June 2016). "Trip report: Summer ISO C++ standards meeting (Oulu)". herbsutter.com. Archived from the original on 8 October 2016.
the next standard after C++17 will be C++20
- ^ Dusíková, Hana (6 November 2019). "N4817: 2020 Prague Meeting Invitation and Information" (PDF). Archived (PDF) from the original on 29 December 2019. Retrieved 13 February 2020.
- ^ "Current Status". isocpp.org. Archived from the original on 8 September 2020. Retrieved 7 September 2020.
- ^ "C++20 Approved -- Herb Sutter". isocpp.org. Archived from the original on 11 September 2020. Retrieved 8 September 2020.
- ^ "Computer Science Pioneer Bjarne Stroustrup to Receive the 2018 Charles Stark Draper Prize for Engineering" (Press release). National Academy of Engineering. 3 January 2018. Archived from the original on 3 January 2018. Retrieved 14 December 2021.
- ^ TIOBE (January 2022). "TIOBE Index for January 2021". TIOBE.com. TIOBE Company. Archived from the original on 25 February 2018. Retrieved 2 February 2022.
- ^ "Bjarne Stroustrup's FAQ – Where did the name "C++" come from?". Archived from the original on 6 February 2016. Retrieved 16 January 2008.
- ^ "C For C++ Programmers". Northeastern University. Archived from the original on 17 November 2010. Retrieved 7 September 2015.
- ^ "History of C++". en.cppreference.com. Archived from the original on 2 February 2022. Retrieved 16 March 2022.
- ^ "ISO/IEC 14882:1998". International Organization for Standardization. Archived from the original on 15 January 2017. Retrieved 23 November 2018.
- ^ "ISO/IEC 14882:2003". International Organization for Standardization. Archived from the original on 13 August 2021. Retrieved 23 November 2018.
- ^ a b "ISO/IEC 14882:2011". International Organization for Standardization. Archived from the original on 27 May 2016. Retrieved 23 November 2018.
- ^ "ISO/IEC 14882:2014". International Organization for Standardization. Archived from the original on 29 April 2016. Retrieved 23 November 2018.
- ^ "ISO/IEC 14882:2017". International Organization for Standardization. Archived from the original on 29 January 2013. Retrieved 2 December 2017.
- ^ "We have an international standard: C++0x is unanimously approved". Sutter's Mill. 12 August 2011. Archived from the original on 28 June 2018. Retrieved 23 November 2018.
- ^ "The Future of C++". Archived from the original on 23 October 2018. Retrieved 23 November 2018 – via channel9.msdn.com.
- ^ "We have C++14! : Standard C++". isocpp.org. Archived from the original on 19 August 2014. Retrieved 19 August 2014.
- ^ Sutter, Herb (15 July 2017). "Trip report: Summer ISO C++ standards meeting (Toronto)". Archived from the original on 6 August 2017. Retrieved 4 August 2017.
- ^ "ISO/IEC TR 18015:2006". International Organization for Standardization. Archived from the original on 15 January 2019. Retrieved 15 February 2019.
- ^ "ISO/IEC TR 19768:2007". International Organization for Standardization. Archived from the original on 4 March 2016. Retrieved 15 February 2019.
- ^ "ISO/IEC TR 29124:2010". International Organization for Standardization. Archived from the original on 12 January 2019. Retrieved 15 February 2019.
- ^ "ISO/IEC TR 24733:2011". International Organization for Standardization. Archived from the original on 15 January 2019. Retrieved 15 February 2019.
- ^ "ISO/IEC TS 18822:2015". International Organization for Standardization. Archived from the original on 15 January 2019. Retrieved 15 February 2019.
- ^ "ISO/IEC TS 19570:2015". International Organization for Standardization. Archived from the original on 15 January 2019. Retrieved 15 February 2019.
- ^ "ISO/IEC TS 19841:2015". International Organization for Standardization. Archived from the original on 15 January 2019. Retrieved 15 February 2019.
- ^ "ISO/IEC TS 19568:2015". International Organization for Standardization. Archived from the original on 15 January 2019. Retrieved 15 February 2019.
- ^ "ISO/IEC TS 19217:2015". International Organization for Standardization. Archived from the original on 15 January 2019. Retrieved 15 February 2019.
- ^ "ISO/IEC TS 19571:2016". International Organization for Standardization. Archived from the original on 15 January 2019. Retrieved 15 February 2019.
- ^ "ISO/IEC TS 19568:2017". International Organization for Standardization. Archived from the original on 15 January 2019. Retrieved 15 February 2019.
- ^ "ISO/IEC TS 21425:2017". International Organization for Standardization. Archived from the original on 15 January 2019. Retrieved 15 February 2019.
- ^ "ISO/IEC TS 22277:2017". International Organization for Standardization. Archived from the original on 15 January 2019. Retrieved 15 February 2019.
- ^ "ISO/IEC TS 19216:2018". International Organization for Standardization. Archived from the original on 15 January 2019. Retrieved 15 February 2019.
- ^ "ISO/IEC TS 21544:2018". International Organization for Standardization. Archived from the original on 15 January 2019. Retrieved 15 February 2019.
- ^ "ISO/IEC TS 19570:2018". International Organization for Standardization. Archived from the original on 15 January 2019. Retrieved 15 February 2019.
- ^ "ISO/IEC TS 23619:2021". International Organization for Standardization. Archived from the original on 15 December 2018. Retrieved 11 October 2021.
- ^ 목록 참조:
- ^ B. Stroustrup (interviewed by Sergio De Simone) (30 April 2015). "Stroustrup: Thoughts on C++17 - An Interview". Archived from the original on 8 July 2015. Retrieved 8 July 2015.
- ^ Stroustrup, Bjarne (2000). The C++ Programming Language (Special ed.). Addison-Wesley. p. 46. ISBN 0-201-70073-5.
- ^ Stroustrup, Bjarne. "Open issues for The C++ Programming Language (3rd Edition)". Archived from the original on 5 May 2014. Retrieved 5 May 2014.
- ^ ISO/IEC. 프로그래밍 언어 – C++11 초안(n3797) 2018년 10월 2일 Wayback Machine §3.7 저장 기간 [basic.stc]에 아카이브됨
- ^ ISO/IEC. 프로그래밍 언어 – C++11 초안(n3797) 2018년 10월 2일 Wayback Machine §3.7.1 정적 저장 기간 [basic.stc.static]
- ^ ISO/IEC. 프로그래밍 언어 – C++11 초안(n3797) 2018년 10월 2일 Wayback Machine §3.7.2 스레드 저장 기간 [basic.stc.thread]에서 아카이브됨
- ^ ISO/IEC. 프로그래밍 언어 – C++11 초안(n3797) 2018년 10월 2일 Wayback Machine §3.7.3 Automatic Storage duration [basic.stc.오토]
- ^ ISO/IEC. 프로그래밍 언어 – C++11 초안(n3797) 2018년 10월 2일 Wayback Machine §3.7.4 Dynamic Storage 기간 [basic.stc.dynamic]
- ^ "C++ Core Guidelines". isocpp.github.io. Archived from the original on 8 February 2020. Retrieved 9 February 2020.
- ^ a b "Nobody Understands C++: Part 5: Template Code Bloat". articles.emptycrate.com/: EmptyCrate Software. Travel. Stuff. 6 May 2008. Archived from the original on 25 April 2016. Retrieved 8 March 2010.
On occasion you will read or hear someone talking about C++ templates causing code bloat. I was thinking about it the other day and thought to myself, "self, if the code does exactly the same thing then the compiled code cannot really be any bigger, can it?" [...] And what about compiled code size? Each were compiled with the command g++ <filename>.cpp -O3. Non-template version: 8140 bytes, template version: 8028 bytes!
- ^ Sutter, Herb; Alexandrescu, Andrei (2004). C++ Coding Standards: 101 Rules, Guidelines, and Best Practices. Addison-Wesley.
- ^ Henricson, Mats; Nyquist, Erik (1997). Industrial Strength C++. Prentice Hall. ISBN 0-13-120965-5.
- ^ Stroustrup, Bjarne (2000). The C++ Programming Language (Special ed.). Addison-Wesley. p. 310. ISBN 0-201-70073-5.
A virtual member function is sometimes called a method.
- ^ "Lambda expressions (since C++11) - cppreference.com". en.cppreference.com. Retrieved 14 December 2022.
- ^ Mycroft, Alan (2013). "C and C++ Exceptions Templates" (PDF). Cambridge Computer Laboratory - Course Materials 2013-14. Archived (PDF) from the original on 13 May 2016. Retrieved 30 August 2016.
- ^ Stroustrup, Bjarne (2013). The C++ Programming Language. Addison Wesley. p. 345. ISBN 9780321563842.
- ^ Stroustrup, Bjarne (2013). The C++ Programming Language. Addison Wesley. pp. 363–365. ISBN 9780321563842.
- ^ Stroustrup, Bjarne (2013). The C++ Programming Language. Addison Wesley. pp. 345, 363. ISBN 9780321563842.
- ^ "Google C++ Style Guide". Archived from the original on 16 March 2019. Retrieved 25 June 2019.
- ^ "LLVM Coding Standards". LLVM 9 documentation. Archived from the original on 27 June 2019. Retrieved 25 June 2019.
- ^ "Coding Conventions". Qt Wiki. Archived from the original on 26 June 2019. Retrieved 26 June 2019.
- ^ Stroustrup, Bjarne (2013). The C++ Programming Language. Addison Wesley. pp. 344, 370. ISBN 9780321563842.
- ^ Stroustrup, Bjarne (2013). The C++ Programming Language. Addison Wesley. p. 349. ISBN 9780321563842.
- ^ Graziano Lo Russo (2008). "An Interview with A. Stepanov". stlport.org. Archived from the original on 4 March 2009. Retrieved 8 October 2015.
- ^ "C++ Core Guidelines". isocpp.github.io. Archived from the original on 16 February 2020. Retrieved 9 February 2020.
- ^ "Bjarne Stroustrup announces C++ Core Guidelines : Standard C++". isocpp.org. Archived from the original on 11 May 2020. Retrieved 31 March 2020.
- ^ "microsoft/GSL". 18 July 2021. Archived from the original on 18 July 2021. Retrieved 18 July 2021 – via GitHub.
- ^ "Using the C++ Core Guidelines checkers". Microsoft Learn. Archived from the original on 13 August 2021. Retrieved 31 March 2020.
- ^ "C++ ABI Summary". 20 March 2001. Archived from the original on 10 July 2018. Retrieved 30 May 2006.
- ^ "Bjarne Stroustrup's FAQ – Is C a subset of C++?". Archived from the original on 6 February 2016. Retrieved 5 May 2014.
- ^ "C9X – The New C Standard". Archived from the original on 21 June 2018. Retrieved 27 December 2008.
- ^ "C++0x Support in GCC". Archived from the original on 21 July 2010. Retrieved 12 October 2010.
- ^ "C++0x Core Language Features In VC10: The Table". Archived from the original on 21 August 2010. Retrieved 12 October 2010.
- ^ "Clang - C++98, C++11, and C++14 Status". Clang.llvm.org. 12 May 2013. Archived from the original on 4 July 2013. Retrieved 10 June 2013.
- ^ "Re: [RFC] Convert builin-mailinfo.c to use The Better String Library" (Mailing list). 6 September 2007. Archived from the original on 8 March 2021. Retrieved 31 March 2015.
- ^ "Re: Efforts to attract more users?" (Mailing list). 12 July 2010. Archived from the original on 21 March 2015. Retrieved 31 March 2015.
- ^ Andrew Binstock (18 May 2011). "Dr. Dobb's: Interview with Ken Thompson". Archived from the original on 13 March 2014. Retrieved 7 February 2014.
- ^ a b Peter Seibel (16 September 2009). Coders at Work: Reflections on the Craft of Programming. Apress. pp. 475–476. ISBN 978-1-4302-1948-4. Archived from the original on 1 December 2019. Retrieved 9 November 2017.
- ^ a b "C++ in Coders at Work". 16 October 2009. Archived from the original on 10 November 2017. Retrieved 9 November 2017.
- ^ a b "An Interview with Donald Knuth". Dr. Dobb's. Archived from the original on 8 March 2021. Retrieved 18 July 2021.
- ^ a b "(La)TeX Navigator". Archived from the original on 20 November 2017. Retrieved 10 November 2017.
- ^ Brian Kernighan (18 July 2018). Brian Kernighan Q&A - Computerphile. Archived from the original on 25 September 2021.
- ^ "Stroustrup: FAQ". www.stroustrup.com. Archived from the original on 6 February 2016. Retrieved 7 June 2013.
- ^ Pike, Rob (2012). "Less is exponentially more". Archived from the original on 7 July 2017. Retrieved 23 November 2018.
- ^ Kreinin, Yossi (13 October 2009). "Defective C++". Archived from the original on 5 February 2016. Retrieved 3 February 2016.
더보기
- Abrahams, David; Gurtovoy, Aleksey (2005). C++ Template Metaprogramming: Concepts, Tools, and Techniques from Boost and Beyond. Addison-Wesley. ISBN 0-321-22725-5.
- Alexandrescu, Andrei (2001). Modern C++ Design: Generic Programming and Design Patterns Applied. Addison-Wesley. ISBN 0-201-70431-5.
- Alexandrescu, Andrei; Sutter, Herb (2004). C++ Design and Coding Standards: Rules and Guidelines for Writing Programs. Addison-Wesley. ISBN 0-321-11358-6.
- Becker, Pete (2006). The C++ Standard Library Extensions : A Tutorial and Reference. Addison-Wesley. ISBN 0-321-41299-0.
- Brokken, Frank (2010). C++ Annotations. University of Groningen. ISBN 978-90-367-0470-0. Archived from the original on 28 April 2010. Retrieved 28 April 2010.
- Coplien, James O. (1994) [reprinted with corrections, original year of publication 1992]. Advanced C++: Programming Styles and Idioms. ISBN 0-201-54855-0.
- Dewhurst, Stephen C. (2005). C++ Common Knowledge: Essential Intermediate Programming. Addison-Wesley. ISBN 0-321-32192-8.
- Information Technology Industry Council (15 October 2003). Programming languages – C++ (Second ed.). Geneva: ISO/IEC. 14882:2003(E).
- Josuttis, Nicolai M. (2012). The C++ Standard Library, A Tutorial and Reference (Second ed.). Addison-Wesley. ISBN 978-0-321-62321-8.
- Koenig, Andrew; Moo, Barbara E. (2000). Accelerated C++ – Practical Programming by Example. Addison-Wesley. ISBN 0-201-70353-X.
- Lippman, Stanley B.; Lajoie, Josée; Moo, Barbara E. (2011). C++ Primer (Fifth ed.). Addison-Wesley. ISBN 978-0-321-71411-4.
- Lippman, Stanley B. (1996). Inside the C++ Object Model. Addison-Wesley. ISBN 0-201-83454-5.
- Meyers, Scott (2005). Effective C++ (Third ed.). Addison-Wesley. ISBN 0-321-33487-6.
- Stroustrup, Bjarne (2013). The C++ Programming Language (Fourth ed.). Addison-Wesley. ISBN 978-0-321-56384-2.
- Stroustrup, Bjarne (1994). The Design and Evolution of C++. Addison-Wesley. ISBN 0-201-54330-3.
- Stroustrup, Bjarne (2014). Programming: Principles and Practice Using C++ (Second ed.). Addison-Wesley. ISBN 978-0-321-99278-9.
- Sutter, Herb (2001). More Exceptional C++: 40 New Engineering Puzzles, Programming Problems, and Solutions. Addison-Wesley. ISBN 0-201-70434-X.
- Sutter, Herb (2004). Exceptional C++ Style. Addison-Wesley. ISBN 0-201-76042-8.
- Vandevoorde, David; Josuttis, Nicolai M. (2003). C++ Templates: The complete Guide. Addison-Wesley. ISBN 0-201-73484-2.
외부 링크
- JTC1/SC22/WG21 – ISO/IEC C++ 표준 작업 그룹
- Standard C++ Foundation – Standard C++의 사용과 이해를 촉진하는 비영리 단체. Bjarne Stroustrup은 이 단체의 이사입니다.