사이드바 영역으로 건너뛰기

삼항연산자와 TypeCasting

이 글은 http://j.strane.net/dokuwiki/doku.php/blog:2007:c_labyrinth_1 에서 제시된 문제에 제가 조금 더 생각해 본 것입니다.

#include "StdAfx.h"
#include
#include
using namespace std;

class B;

class A
{
public:
    A (){}
    A (const B& temp){}

    operator string() { return "It's A!"; };
};
 
class B
{
public:
    B (){}
    B (const A& temp){}
 
    operator string() { return "It's B!"; };
};
 
int main()
{
    A a;
    B b;

    string tTemp = (true ? a : b);
    cout << "Result : " << tTemp << endl;
    return 0;
}

위 예제를 다음과 같이 돌려 보았습니다.

1. A와 B에서 casting을 위한 생성자를 모두 제거합니다.
->  complie error!! : B를 A로 casting할 수가 없다는 error

2. B에서 A로의 생성자만 있는 경우

-> "It's A!"


3. A에서 B로의 생성자만 있는 경우
->
"It's B!"

4. 둘다 있는 경우
-> "It's A!"


삼항연산자 ? : 은 (이걸 뭐라하지;;)
Compile 시간에 결과인 두 항을 서로 Type casting이 가능한지 살핀다.
먼저 왼쪽의 항을 오른쪽으로 바꿀 수 있는 지 살펴본다. 가능하면 컴파일 성공!
이게 불가능하면 두번째로 오른쪽 항을 왼쪽항으로 바꿀 수 있는 지 살펴본다.
만일 이거마저 불가능하면 컴파일 error! 내용은 두번째가 불가능하다는 내용..

왜 이런 일을 하는 것일까요?
C++와 같은 언어는 Strongly-typed 언어이기 때문에...
컴파일러는 Type에 관한 checking을 수행해야 하는데..
이런 Check과정은 보통 Expression( a= b 따위의..) 단위로 이루어지게 됩니다.

대부분의 Expression은 한번의 TypeChecking으로 끝나게 되므로..
삼항연산자가 있는 Expression의 Type을 check할때..
이것을 예외적으로 처리할 수가 없어서..
컴파일러 단에서 일단 Type Cast를 시켜서
하나의 Type으로 맞추어 놓고 Check를 수행하기 때문으로 보입니다.

그 와중에 Casting을 위한 코드를 삽입하게 되고..
만일 이에 대한 생성자가 정의되어 있지 않다면..
Compile error가 날 수 밖에 없는 것이죠.

따라서 왠간히 복잡한 형태를 다루고 있다면..
이런 암묵적 casting은 위험할 수도 있으며..
쓸데없는 생성자까지 만들어줘야하는 불편함이 있으니..
복잡하지 않은 곳에만 삼항연산자를 쓰도록 하는 것이 좋겠습니다.

삼항연산자는 코드를 간결하게는 할 수 있지만 readability가 떨어지게 되니..
가급적 간단한 곳에만 사용하는게 좋겠습니다.


진보블로그 공감 버튼트위터로 리트윗하기페이스북에 공유하기딜리셔스에 북마크