Computer Science/C & C++

[C++] Conversion Function | 변환 함수

lww7438 2020. 2. 29. 23:03

Conversion Function

변환 함수

- C++ 연산자 함수의 특별한 형태이다.
- 사용자 정의 강제 데이터형 변환 기능을 구현하는 수단이다.
- \(\texttt{dataType variables = objectName;}\)과 같은 구문을 가능하게 만든다.


Conversion Function Definition (변환 함수 정의)

// Ex. 변환 함수 원형의 일반형
operator typeName();

- \(\texttt{typeName}\)형으로의 형변환을 구현하기 위해서는, 위와 같은 연산자 함수가 구현되어야 한다.

- 변환 함수는 해당 클래스의 멤버 함수이어야 한다.
- 변환 함수는 리턴형을 가지지 않는다. (함수명 \(\texttt{typeName}\)으로 어떤 데이터형으로 변환(리턴)할 것인지를 알 수 있기 때문이다.)
- 변환 함수는 매개변수를 가지지 않는다. (변환 함수는 반드시 클래스의 멤버 함수로 구현되는데, 변환 함수를 호출한 클래스 객체가 곧 변환해야할 값이므로, 따로 매개변수를 필요로 하지 않는다.)

// Ex. 변환 함수 정의 예시

Stonewt::operator int () const {     // Stonewt는 사용자 정의 클래스이다.
    return int (pounds + 0.5);       // pounds는 Stonewt 클래스의 데이터 멤버이다.
}


- 함수 원형 맨 앞에 \(\texttt{explicit}\) 키워드를 추가할 경우, 암시적 데이터형 변환을 제한할 수 있다. (C++11)

// Ex. 암시적 데이터형 변환을 불허하는 변환 함수 원형의 일반형
explicit operator dataType() const;
// const 키워드는 선택사항이나, 변환 함수 내에서 멤버를 수정할 것이 아니라면, const 키워드를 추가하는 것이 권장된다.

- 변환 함수가 위와 같이 정의되어 있을 경우, 명시적인 데이터형 변환만 가능해진다.
- 어차피 암시적 데이터형 변환을 불허할 것이라면, 아예 변환 함수(연산자 함수)가 아닌 일반 함수(보통의 멤버 함수와 같은)로 정의하는 것도 좋은 방법이다. (보다 엄격한 개발방식)


Using the Conversion Function (변환 함수 사용)

- 변환 함수는 일반적인 Type Cast(강제 데이터형 변환)와 같은 문법을 공유한다.

// Ex. 변환 함수의 명시적/암시적 사용 예시

// 명시적 호출 방법
dataType variables = dataType(objectName);
dataType variables = (dataType)objectName;

// 암시적 호출 방법
dataType variables = objectName;


- 두 개 이상의 변환 함수가 정의되어 있을 경우, 변환 함수 호출시에 Ambiguity(모호성) 에러가 발생하지 않도록 주의해야 한다.

// Ex. 두 개 이상의 변환 함수로 인해 Ambiguity Error가 발생하는 예시

class Stonewt {
...
    Stonewt(int, double);
    operator int() const;
    operator double() const;
};

...

Stonewt poppins(9, 2.8);
std::cout << poppins;      // 모호성 에러가 발생한다.
// poppins대신, int(poppins)나 double(poppins)와 같이 하나의 데이터형을 명시해야 하는 경우이다.
// 이는, 변환 함수가 두가지 데이터형으로 정의되어 있기 때문이다.
// 만일, int형 변환 함수만 정의되어 있었다면, 컴파일러는 고민할 거리도 없이 암시적인 int형 변환을 수행했을 것이다.

- 따라서, 변환 함수가 두 개 이상 정의되어 있는 경우, 암시적 데이터형 변환은 지양하는 것이 좋다.