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 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 등)가 클래스 템플릿으로 구현되어 있다.

같이 보기

[편집 | 원본 편집]