본문 바로가기

Study/C++

Wrapper Class

C++에서는 기본 데이터 타입을 감싸는 클래스를 만들어 Wrapper Class처럼 사용할 수 있다.

1. Wrapper Class 정의 및 기본 사용

#include <iostream>

class Integer {
private:
    int value;

public:
    // 생성자
    Integer(int v) : value(v) {}

    // 값을 가져오는 메서드
    int getValue() const {
        return value;
    }

    // 값을 설정하는 메서드
    void setValue(int v) {
        value = v;
    }
};

int main() {
    Integer obj(10); // 기본 타입 int를 감싸는 Wrapper Class 객체 생성
    std::cout << "Value: " << obj.getValue() << std::endl;

    obj.setValue(20);
    std::cout << "Updated Value: " << obj.getValue() << std::endl;

    return 0;
}

 

2. Auto-Boxing과 Unboxing 구현

  • C++에서는 연산자 오버로딩을 사용하여 Java의 Auto-Boxing/Unboxing처럼 자연스러운 사용이 가능하다.
#include <iostream>

class Integer {
private:
    int value;

public:
    // 생성자
    Integer(int v) : value(v) {}

    // 타입 변환 연산자 (Unboxing 역할)
    operator int() const {
        return value;
    }

    // 값을 가져오는 메서드
    int getValue() const {
        return value;
    }

    // 값을 설정하는 메서드
    void setValue(int v) {
        value = v;
    }
};

int main() {
    Integer obj(10);       // Auto-Boxing
    int number = obj;      // Unboxing (타입 변환 연산자 사용)
    
    std::cout << "Boxed Value: " << obj.getValue() << std::endl;
    std::cout << "Unboxed Value: " << number << std::endl;

    obj.setValue(30);
    std::cout << "Updated Boxed Value: " << obj.getValue() << std::endl;

    return 0;
}

 

3. Wrapper Class와 STL 컨테이너 사용

  • STL 컨테이너(vector, list 등)에 기본 데이터 타입 대신 Wrapper Class를 저장할 수 있다.
#include <iostream>
#include <vector>

class Integer {
private:
    int value;

public:
    Integer(int v) : value(v) {}

    int getValue() const {
        return value;
    }

    void setValue(int v) {
        value = v;
    }
};

int main() {
    std::vector<Integer> numbers;

    // Wrapper Class 객체 추가
    numbers.emplace_back(10);
    numbers.emplace_back(20);

    // Wrapper Class 객체 값 출력
    for (const auto& num : numbers) {
        std::cout << "Value: " << num.getValue() << std::endl;
    }

    return 0;
}

 

4. Wrapper Class에 유용한 메서드 추가

  • C++에서는 데이터 변환, 비교 연산 등을 메서드로 제공하여 Wrapper Class를 확장할 수 있다.
#include <iostream>
#include <string>

class Integer {
private:
    int value;

public:
    Integer(int v) : value(v) {}

    // 값을 가져오기
    int getValue() const {
        return value;
    }

    // 값을 문자열로 변환
    std::string toString() const {
        return std::to_string(value);
    }

    // 최대값과 최소값 상수 제공
    static int getMaxValue() {
        return INT32_MAX;
    }

    static int getMinValue() {
        return INT32_MIN;
    }
};

int main() {
    Integer obj(42);

    std::cout << "Value: " << obj.getValue() << std::endl;
    std::cout << "As String: " << obj.toString() << std::endl;

    std::cout << "Max Value: " << Integer::getMaxValue() << std::endl;
    std::cout << "Min Value: " << Integer::getMinValue() << std::endl;

    return 0;
}

 

C++에서 Wrapper Class 사용의 장점

  • 객체 지향성 활용: 데이터와 메서드를 결합하여 캡슐화된 구조를 제공.
  • 유연성: STL 컨테이너와의 호환성, 타입 변환 연산자를 통한 자연스러운 사용 가능.
  • 확장성: 추가 메서드를 통해 다양한 기능을 제공 가능.

 

C++에서 Wrapper Class 사용의 단점

  • 성능 비용: 기본 데이터 타입에 비해 Wrapper Class는 메모리와 연산 비용이 증가.
  • 복잡성 증가: 단순한 데이터 처리에 불필요한 클래스를 도입하면 코드가 복잡해질 수 있음.


C++에서는 Wrapper Class를 구현하여 기본 데이터 타입을 객체로 다룰 수 있다. 이 방식은 객체 지향 프로그래밍과 유틸리티 메서드가 필요한 경우 유용다. 하지만 성능 비용을 고려하여 필요한 경우에만 사용하는 것이 좋다.

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