Sonji-log

[Effective C++] Cp 1. C++는 언어들의 연합체 본문

책/Effective C++

[Effective C++] Cp 1. C++는 언어들의 연합체

Sonji 2025. 3. 13. 01:07

책 내용 요약

  • C++는 다중 패러다임 프로그래밍 언어이다.
    • 절차적(procedual) 프로그래밍이 기본형
      • 기본 C언어에서 여러 특징을 추가해 C++이 탄생했으므로, C언어의 절차지향적 특징을 모두 가지고 있음.
    • 객체 지향(Object-Oriented) 특징이 다수 수록됨
      • 클래스객체를 사용해 시스템을 구성할 수 있음
      • 순수 가상 함수를 지원하여 인터페이스를 구현하고, 이를 통해 추상화를 달성함
      • 접근 지정 연산자(public, protected, private)를 통해 캡슐화를 구현함
      • 기존 클래스를 확장해 새로운 클래스를 만드는 상속 개념을 도입함
      • 같은 인터페이스를 오버라이딩해 다형성을 지원함
    • 함수형(functional) 프로그래밍 기능을 지원함
      • 주로 C++11 이후부터 명확하게 드러남
      • 람다 표현식(Lambda Expressions)으로 별도 함수선언 없이 즉석에서 함수를 정의하고 사용할 수 있음
      • 함수를 객체처럼 사용하는 표준 라이브러리 기능을 통해 기존 함수를 재구성하여 활용할 수 있음
      • 함수를 인수로 전달하거나, 함수가 함수를 반환하는 등 함수를 통해 추상화 수준을 높임
    • 일반화(generic) 프로그래밍 기능을 지원함
      • 클래스와 함수 템플릿을 통해 자료형에 독립적인 코드를 작성할 수 있음
      • 표준 템플릿 라이브러리(STL : Standard Template Library)를 지원하여 자료구조(=컨테이너), 알고리즘, 반복자를 일반화하여 제공함
    • 메타프로그래밍(metaprogramming) 을 지원해 코드 생산성을 높임
      • 메타프로그래밍은 컴파일 타임에 프로그램을 실행해 코드의 일부를 생성하거나 최적화하는 기법을 말함
      • 주로 템플릿을 이용해 구현되는 기법이므로, 템플릿 메타프로그래밍(TMP : Template MetaProgramming) 으로 부르기도 함
  • C++은 이처럼 여러 언어들의 집합체 개념이므로, 하위 언어의 특성과 장단점을 이용해 상황에 최적화되어있는 프로그래밍을 이룰 수 있다는 점을 염두에 두어야 함

 

코드 예시(by GPT)

#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
#include <type_traits>

// 🔹 1. 객체 지향 프로그래밍 (OOP)
// 추상 클래스 (순수 가상 함수 포함)
class Shape {
public:
    virtual void draw() const = 0; // 순수 가상 함수 (인터페이스 역할)
    virtual ~Shape() = default;    // 가상 소멸자
};

// Circle 클래스: Shape을 상속받아 다형성 적용
class Circle : public Shape {
    double radius;
public:
    Circle(double r) : radius(r) {}
    void draw() const override {
        std::cout << "Drawing Circle with radius: " << radius << std::endl;
    }
};

// 🔹 2. 함수형 프로그래밍 (Functional Programming)
void processShapes(const std::vector<Shape*>& shapes, std::function<void(const Shape&)> action) {
    for (const auto& shape : shapes) {
        action(*shape);
    }
}

// 🔹 3. 일반화 프로그래밍 (Generic Programming)
// 템플릿을 활용한 최대값 함수
template <typename T>
T getMax(T a, T b) {
    return (a > b) ? a : b;
}

// 🔹 4. 메타프로그래밍 (Metaprogramming)
// 정수형만 허용하는 제약 조건 추가
template <typename T>
typename std::enable_if<std::is_integral<T>::value, T>::type
square(T num) {
    return num * num;
}

int main() {
    // 절차적 프로그래밍 (Procedural Programming)
    std::cout << "=== 절차적 프로그래밍 예제 ===\n";
    std::cout << "Hello, C++ 다중 패러다임!" << std::endl;

    // 객체 생성 및 OOP 활용
    std::cout << "\n=== 객체 지향 프로그래밍 예제 ===\n";
    Circle c1(5.0), c2(10.0);
    std::vector<Shape*> shapes = {&c1, &c2};

    processShapes(shapes, [](const Shape& s) { s.draw(); });  // 람다 사용 (Functional)

    // 일반화 프로그래밍 (템플릿 사용)
    std::cout << "\n=== 일반화 프로그래밍 예제 ===\n";
    std::cout << "Max(10, 20): " << getMax(10, 20) << std::endl;
    std::cout << "Max(5.5, 2.3): " << getMax(5.5, 2.3) << std::endl;

    // 메타프로그래밍 적용 (컴파일 타임 조건 체크)
    std::cout << "\n=== 메타프로그래밍 예제 ===\n";
    std::cout << "Square(4): " << square(4) << std::endl;
    // std::cout << "Square(4.5): " << square(4.5) << std::endl; // ❌ 컴파일 에러 발생 (정수만 허용)

    return 0;
}

 

코멘트

 여태 개발을 공부하면서 cpp만큼 많이 사용한 언어는 없지만 이 단락은 언제 봐도 새롭다. 그렇다고 위에 나열된 개념들을 사용하지 않은 건 아니다. 단지 무의식적으로 cpp문법은 으레 이렇거니 하고 사용했던 것 같다.

 책의 내용을 공부할수록 각 하위언어의 특성들이 강하게 나타날 테니, 지금은 이런 하위 개념이 있고 이런 종류가 있다는 점만 알아두고 넘어가자.

 

원 내용 출처 : https://www.yes24.com/Product/Goods/17525589

 

Effective C++ 이펙티브 C++ - 예스24

Effective C++ 이펙티브 C++

www.yes24.com

(이 글은 본 책의 내용을 필자가 이해한 방향으로 작성한 글입니다.)

' > Effective C++' 카테고리의 다른 글

[Effective C++] Cp 2. #define 보다는 const, enum, inline  (0) 2025.03.13