C++
IT 위키
C++(씨플러스플러스)는 C 언어를 기반으로 객체지향 프로그래밍, 제네릭 프로그래밍, 예외 처리 등을 확장한 범용 프로그래밍 언어이다. 저수준 제어와 고수준 추상화를 함께 제공하는 것이 특징이다.
C++는 1979년 벨 연구소의 비아네 스트롭스트룹(Bjarne Stroustrup)이 "C with Classes"라는 이름으로 개발을 시작했고, 1983년 현재의 이름 C++로 바뀌었다. 이름의 `++`는 C 언어의 증가 연산자에서 따온 것으로 "C를 한 단계 확장했다"는 뜻이다.
1998년 ISO/IEC 14882로 표준화(C++98)된 이후 C++03, C++11, C++14, C++17, C++20, C++23으로 개정되어 왔다. 특히 C++11에서 auto 타입 추론, 범위 기반 for 문, 람다 표현식, 스마트 포인터, 이동 의미론이 도입되어 언어의 사용 방식이 크게 바뀌었다.
시스템 소프트웨어, 게임 엔진, 데이터베이스, 임베디드 시스템, 고성능 연산 등 실행 성능이 중요한 분야에서 널리 쓰인다.
- 객체지향 프로그래밍 지원 : 클래스, 상속, 다형성, 캡슐화
- 제네릭 프로그래밍 지원 : 템플릿
- 예외 처리(try-catch-throw) 제공
- 함수 오버로딩과 연산자 오버로딩 지원
- 참조자(reference) 제공
- 네임스페이스로 이름 충돌 방지
- 표준 라이브러리(컨테이너·반복자·알고리즘) 제공
- RAII를 통한 자원 관리
- C 언어와 마찬가지로 컴파일 언어이며 포인터로 메모리를 직접 다룰 수 있다
| 구분 | C | C++ |
|---|---|---|
| 주요 패러다임 | 절차적 프로그래밍 | 객체지향, 제네릭, 절차적 프로그래밍 |
| 클래스 | 없음 | 있음 |
| 함수 오버로딩 | 없음 | 있음 |
| 연산자 오버로딩 | 없음 | 있음 |
| 참조자 | 없음 (포인터로 대신) | 있음 |
| 예외 처리 | 기본 제공 안 함 | 제공 |
| 동적 메모리 | malloc / free | new / delete, 스마트 포인터 |
| 표준 라이브러리 | 표준 C 라이브러리 | 표준 C++ 라이브러리(컨테이너·알고리즘 포함) |
- C++는 C 언어와 대부분 호환되지만 완전한 상위 집합은 아니다. 예를 들어 C에서 허용되는 `void*`의 암시적 형 변환이 C++에서는 오류가 된다.
- reference
참조자는 이미 존재하는 변수의 별명(alias)이다. 선언할 때 `&`를 붙인다.
- 함수 매개변수를 참조자로 선언하면 호출한 쪽의 변수 자체가 전달되므로, 함수 안에서 값을 바꾸면 호출한 쪽의 값도 바뀐다(참조에 의한 호출, call by reference).
- 값에 의한 호출(call by value)은 값을 복사해서 넘기므로 함수 안의 변경이 호출한 쪽에 영향을 주지 않는다.
- C 언어에서 같은 효과를 내려면 포인터를 넘기고 `*`로 역참조해야 한다.
#include <iostream>
using namespace std;
int func(int& res, int val) { // res 는 참조자, val 은 값
res = res + val; // 호출한 쪽의 sum 이 직접 바뀐다
return res;
}
int main() {
int sum = 0;
for (int a = 1; a < 4; a++)
sum += func(sum, a); // sum 이 함수 안에서도 바뀌고, 반환값이 다시 더해진다
cout << sum << endl;
return 0;
}
- 위 코드에서 `func`가 `sum`을 직접 바꾸고 그 결과를 다시 `sum`에 더하므로, 매 반복마다 증가분이 두 배로 누적된다. a=1일 때 sum은 2, a=2일 때 8, a=3일 때 22가 된다.
| 구분 | 포인터 | 참조자 |
|---|---|---|
| 선언 시 초기화 | 필요 없음 | 반드시 필요 |
| 다른 대상 재지정 | 가능 | 불가능 |
| 널 값 | 가질 수 있음 | 가질 수 없음 |
| 사용 시 표기 | `*p`로 역참조 | 원래 변수처럼 사용 |
- 클래스 : 데이터와 함수를 하나로 묶은 사용자 정의 자료형
- 상속 : 기존 클래스의 특성을 물려받아 확장. 다중 상속을 지원한다
- 다형성 : 가상 함수(virtual)를 통해 실행 시점에 호출할 함수를 결정
- 캡슐화 : public, protected, private 접근 지정자로 내부 구현을 숨김
- 추상 클래스 : 순수 가상 함수를 가진 클래스로, 인터페이스 역할을 한다
자세한 개념은 객체지향 기법 문서를 참고한다.
자료형을 매개변수로 받아 같은 코드를 여러 자료형에 재사용하는 기능이다.
template <typename T>
T maxOf(T a, T b) {
return (a > b) ? a : b;
}
- 함수 템플릿과 클래스 템플릿이 있다.
- 표준 라이브러리의 컨테이너(vector, list, map 등)가 클래스 템플릿으로 구현되어 있다.
