본문 바로가기

프로그래밍/C++

[C++] 자료형계의 이단심문관, bool

들어가며

오늘은 모순에 관하여 얘기할까 싶다.

마침 bool형 자료형도 참과 거짓을 구분하는 자료형으로

주제와도 어느 정도 공통점을 가진다.

 

모순, 어딜 봐도 딱히 좋은 이미지의 단어는 아니다.

사람에게 적용해보면?

딱 혼자 다니기 좋아 보이는 성격이지 않은가?

우린 솔직해 질 필요가 있다.

우리가 살아가면서 인생에 단 한 번도 모순적인 태도를 보인 적이 없을까?

우리 모두는 모순적인 사람이다.

하지만 우린 한 가지 관점에서만 바라보기에 부정적인 프레임에 갇혀있는 것이다.

 

우린 게으른 프로그래머가 되기 위해 성실히 공부한다.

게으르기 위해 성실해진다. 완벽한 모순이다.

마치 0과 1의 상태가 중첩된 양자컴퓨터의 CPU의 단자 한 구석처럼

우리 인간은 그런 양자적 상태에 자주 놓이게 된다.

 

우린 솔직해질 필요가 있다.

자고로 인간은 애초부터 모순적인 존재다.

우리가 모순적이지 않다면 평면적이고 변함이 없어

운명론적이고 수동적인 인간상이 되어버린 것과 다름이 없다.

우리가 모순적이라면 입체적이고 유연하게 변화한다면

우린 자유롭고 주체적으로 삶을 영위할 수 있다고 생각한다.

 

아무튼 결론은, 우리가 모순적인 존재라는 것을 굳지 부정하지 말자는 것이다.

우린 태초부터 그런 존재였으며, 우리가 양면성을 가지는 것에 대해서

반드시 배척하고 경계해야 할 그런 것만은 아닌

오히려 인정하고 함께해야 할 것이라

믿어 의심치 않는다.

 

사족이 길었다.

그냥 갑자기 생각나서 끄적여본다.

자신을 부정할수록 좋은 일이 생겨날리는 만무하니까.

 

그런 고로 모순과 관점에 관한 인상 깊은 게임 하나를 소개하겠다.

Pillow Castle에서 제작한 「Superliminal」이라는 게임의 트레일러다.

 

들어가며2

잔짜잔! 뇌절에 그랜절에 개천절 및 제헌절까지 와버렸다!

처음에 C에서는 bool 자료형이 존재하지 않았고 C++에만 존재하던 자료형이다.

'???: 왜 우린 bool자료형 없냐? 어? 화나네?'

그리하여 C99 표준부터 stdbool.h 헤더 파일이 추가되어,

공식적으로 _Bool이라는 자료형이 추가되었다.

'???: 누구는 bool이고 누구는 _Bool임? 이거 완전 차별아니냐? 불편하네요;;'

여기서 다시 _Bool을 bool로 정의하여 bool자료형을 사용할 수 있게 되었고

1true, 0false로 정의하여 bool 자료형과 true, false 값을 사용할 수 있게 되었다.

C에서는 말이다.

그리고 실제로 저런 대화는 오가지 않았다.

 

참과 거짓

C와 C++ 모두, 정수 '0''거짓'을 의미하는 숫자로,

정수 '1''참'을 의미하는 숫자로 정의하고 있다.

따라서 참과 거짓의 표현을 위해서 다음과 같이 상수를 정의하는 것이 보통이다.

#define TRUE    1
#define FALSE   0

 

그런데 항상 저 매크로를 사용하기에는 조금 귀찮은 구석이 있다.

아무튼 귀찮다.

'않이, 사람들도 많이 사용하는 개념이면 그냥 컴파일러에 키워드로 넣어버리면 안 됨??'

라고 생각하는 사람들 덕택에, 그래서 표준에 진짜 추가했다.

그리하여 굳이 매크로 상수를 이용해서 할 필요가 없어졌다.

생각해보면 이렇게 앞서 길을 닦아 놓으신 선대 프로그래머 분들께

두 손 두 발 다 들고 엄지 손가락 발가락으로 쿼드라 따봉을 날려주고 싶은 심정이다.

#include <iostream>

using namespace std;

int main()
{
    int num = 10;
    int i = 0;

    cout << "true: " << true << endl;
    cout << "false: " << false << endl;

    while (true)       // 논리적인 의미의 참과 거짓이 필요한 위치
    {
        cout << i ++ << ' ';
        if (i > num)   // 논리적인 의미의 참과 거짓이 필요한 위치
        {
            cout << endl;
            break;
        }
    }
    
    cout << "sizeof 1: " << sizeof(1) << endl;
    cout << "sizeof 0: " << sizeof(0) << endl;
    cout << "sizeof true: " << sizeof(true) << endl;
    cout << "sizeof false: " << sizeof(false) << endl;

    return 0;
}

위 코드에서 보이는 바와 같이 논리적인 의미의 참과 거짓이 필요한 위치에서는

키워드 'true'와 'false'를 사용하면 된다.

 

자주 범하는 오류

이쯤 왔으면 한 번쯤 이런 생각이 들 법하다.

'아 그럼 true는 1을, false는 0을 의미하는 거 맞죠? 내 말 맞죠?'

그렇다! 정확하게 오류를 범했다!

true는 1을 의미하지 않으며 false 또한 0을 의미하지 않는다.

이 두 키워드는 그저 '참'과 '거짓'을 표현하기 위한 '1바이트 크기의 데이터' 일뿐이다.

이 두 키워드가 정의되기 이전에 사용하던 관습이 굳어졌기 때문에,

혹시라도 이 키워드를 출력하거나 정수으 형태로 형 변환하는 경우에 한하여

1과 0으로 변환되도록 정의되어 있을 뿐이다.

 

'아니 필자 양반, 저 들어가며2에서 1true, 0false로 정의했다면서요. 이거 독자 기만아니냐? 불'

어디까지나 들어가기2에서는 C가 bool자료형을 추가하게된 배경과 과정을 설명하는 것이다.

우린 C++을 공부하는 입장이니 방금 설명한 내용을 받아들이면 된다.

 

아무튼 C++에서는 true와 false를 굳이 숫자에 연결시켜서 이해하려는 시도는 바람직하지 않다.

'true와 false'는 그 자체로 '참과 거짓'을 나타내는 목적으로 정의된 '데이터'로인식하는 것이 바람직하다.

 

자료형 bool

true와 false는 그 자체로 참과 거짓을 의미하는 데이터이기 때문에,

이들의 데이터 저장을 위한 자료형이 별도로 정의되어 있는 것은 당연하다.

이때 'true와 false'를 가리켜 「bool 형 데이터」라고 한다.

그리고 bool은 엄연히 하나의 '자료형'이므로 변수를 선언하는 것이 가능하다.

bool isTrueOne = true;
bool isTrueTwo = false;

 

그럼 다음의 코드를 통하여 bool의 전체적인 쓰임세를 확인해 보도록 하겠다.

#include <iostream>

using namespace std;

bool IsPositive(int num)    // bool도 기본자료형이기 때문에 반환형으로도 선언이 가능하다.
{
    if (num < 0)
        return false;
    else
        return true;
}

int main()
{
    bool isPos;
    int num;
    cout << "Input number: ";
    cin >> num;

    isPos = IsPositive(num);   // 반환한 bool형 데이터를 bool형 변수에 저장
    if (isPos)
        cout << "Positive number" << endl;
    else
        cout << "Negative number" << endl;

    return 0;
}

 

위 코드는 bool도 기본자료형들 중 하나이므로,

다른 자료형들과 동일한 방식으로 사용할 수 있음을 알 수 있도록 구성되어 있다.

 

마치며

오늘은 좀 짧은 포스팅이다.

처음 사족이 길어서 그런가.

자료형 bool과 키워드 ture와 false가 워낙 많이 사용되고

혼동하기 쉬워서 다뤄보았다.

다음 시간엔 참조자(Reference)에 대해 알아보도록 하겠다.


참고 및 출처

  • 윤성우 열혈 C++ 프로그래밍