모던 C++와 C 대안

C++의 네임스페이스와 C의 이름 접두사

이 레슨에서는 C++의 네임스페이스(namespace)와 C의 접두사 관례로 큰 프로그램에서 함수 이름이 겹치지 않게 하는 방법을 알아봅니다.

소개

큰 프로그램을 만들거나 여러 라이브러리를 쓰면 두 함수의 이름이 겹치기 쉽습니다. C++는 이름을 위한 별도의 영역인 네임스페이스(namespace)로 이 문제를 해결합니다. C에는 네임스페이스가 없으므로, C 라이브러리는 보통 math_square처럼 이름에 접두사(prefix)를 붙입니다.

핵심 정리

  • C++의 추상화를 배우기 전에 C에서는 어떻게 하는지 이해하세요.
  • 자원의 소유권은 RAII와 값 의미론(value semantics)으로 표현하세요.
  • 매크로와 타입 변환보다 C++의 타입 안전한 도구를 쓰세요.

C와 C++ 코드 예제

C
실행 →
main.c
#include <stdio.h>

int math_square(int value) {
    return value * value;
}

int main(void) {
    printf("%d\n", math_square(7));
}
실행 결과
49
C++
실행 →
main.cpp
#include <iostream>

namespace math {
    int square(int value) {
        return value * value;
    }
}

int main() {
    std::cout << math::square(7) << '\n';
}
실행 결과
49

C와 C++ 비교

C의 math_ 접두사는 이름 짓기 관례일 뿐이며 전적으로 프로그래머의 꼼꼼함에 달려 있습니다. C++에서는 square 함수가 math 네임스페이스 안에 있고, 전체 이름인 math::square로 호출합니다. 컴파일러는 서로 다른 네임스페이스의 이름이 충돌하지 않도록 보장하고, 이름이 너무 긴 네임스페이스에는 별칭을 붙일 수 있게 해 줍니다.

C

C는 이름 짓기 관례, 콜백, 매크로, 컨텍스트 struct를 씁니다.

C++

C++는 범위가 분명하고 타입 안전하며, 보통 실행 시 추가 비용이 없는 추상화를 제공합니다.

연습 문제

두 버전을 모두 실행한 다음 코드를 바꿔 보면서 각 언어가 주는 안전성의 차이를 살펴보세요.

  • 먼저 C로 동작 원리를 작성한 다음 C++의 같은 기능을 써 보세요.
  • 직접 하던 자원 해제를 RAII로 바꿔 보세요.
  • 그 기능이 메모리 할당이나 가상 함수 호출을 일으키는지 확인해 보세요.