본문 바로가기

개발자/C++(Linux, Window)

Wrapper 클래스

반응형

 

Wrapper class

 

회사 후임이 Wrapper class를 몰라 혹시 모르는 사람들을 위해 미리 정리해 보았다.

 

C++을 쓰시면 많이 볼 수있는데, 래퍼 클래스는 간단하게 말하자면, 

 

기본 자료형(int나 long)같은 데이터를 객체에 넣기 위해 제공하는 함수들 이라고 생각하면 된다.

 

좀더 명확한 설명은 래퍼 클래스는 기본 자료형(primitive data types)에 대한 클래스 표현을 래퍼 클래스(wrapper classes)라고 합니다.

 

ex) int num = 5;  -->  Integer num = new Integer(5);

 

그렇지만, C++ 외에도 래퍼(wrapper)라는 개념이 쓰이는데, 항상 아래와 같은 개념으로 생각하면 되겠다.

 

Wrapper 클래스란 보통 간단한 자료형 하나를 데이터 멤버로 하는 클래스를 의미 합니다.

"Wrap" 뜻이 감싸다 이죠. 위 경우 class Array 가 wrapper 클래스가 됩니다.

 

한가지 예를들자면, url 주소앞에 http://도 래퍼 이다.

래퍼는 이와 같이 프로그래밍 용어로써 다양하게 쓰인다.

 

기본 자료형 대신 래퍼 클래스를 사용하는 이유는 크게 세 가지가 있습니다.

 

1. 객체 또는 클래스가 제공하는 메소드 사용

2. 클래스가 제공하는 상수 사용(MIN_VALUE and MAX_VALUE)

3. 숫자, 문자로의 형변환 또는 진법 변환시 사용

 

아래는 관련한 예제를 발췌했다.

Make interface design easy to use properly and difficult to use poorly

C++을 개발하면서 크로미움과 같은 큰 프로젝트 뿐만아니라 개인이 만드는 작은 프로젝트까지 모든 분야에서는 쉽게 볼 수 있는것이 인터페이스이다. 함수도 인터페이스고, 클래스, 템플릿 또한 인터페이스이다.

이처럼 쉽게 찾아 볼 수 있는 인터페이스는 객체 지향 관점에서 똑바로 사용하는것이 중요하다. 잘못 코드를 작성하면 컴파일 되지 않아야 하고, 코드를 잘 작성하면 컴파일 되는것이 정상이다.

즉, ‘사용자가 제대로 쓰기 쉽지만 엉터리로 쓰긴 어려운 인터페이스’ 개발하려면 실수 할 만한 종류를 잘 알고 있어야 한다.

다음과 같은 코드가 존재 한다고 하자.

class Date {
public:
   Date(int month, int day, int year);
};

C++

int main(){
   Date d(28, 11, 1994); //1994년 28월 11일이 되어 버린다.
   Date d2(2, 41, 1994); //1994년 2월 41일이 되어 버린다.
}

위의 코드는 정상적인 코드이다. 그러나 매개변수가 잘못 전달 될 수 있다는 점을 유의해야 한다.

 

C

이처럼 손쉽게 사용자는 실수를 범할 수 있다는 점을 유의하고 이를 막는 랩퍼(Wrapper) 클래스를 구현해 주는것이 좋다.

class Day {
public:
   explicit Day(int d) : val(d) {}
   int val;
};
class Month {
public:
   explicit Month(int m) : val(m) {}
   int val;
};
class Day {
public:
   explicit Day(int y) : val(y) {}
   int val;
};

class Date {
public:
   Date(const Month& m, const Day& d, const Year& y);
}

C++

Copy

위의 코드처럼 구현되어 있다면 사용자는 실수할 일이 줄어들게 된다.

int main(){
   Date(28, 11, 1994); // error! type error!
   Date(Day(28), Month(11), Year(1994)); // error! type error!
   Date(Month(11), Day(28), Year(1994)); // ok!
}

C++

Copy

여기에 더해, month, day 등에는 유요한 값이 정해져 있으므로 enum과 같은 문법을 사용해 지정할 수도 있지만, Jen(), Feb() 등의 함수를 구현하는 것이 좋은 방법이다.

 

 

출처 : dydtjr1128.github.io/effectivec++/2019/08/06/Effective-Cpp-item-18.html

반응형