C/C++ Explicit


서론

이 장은 Explicit에 대해서 설명한다.

목차

  1. Explicit Type Casting(명시적 형변환)
  2. Implicit Type Casting(묵시적 형변환)
  3. Explicit을 적용하지 않음
  4. Explicit을 적용

Explicit Type Casting(명시적 형변환)

변수명 앞에 자료형을 명시적(보이게)으로 붙여줘 값을 변환

int val = 2;
float floatval = (float) val; //명시적 형변환

Implicit Type Casting(묵시적 형변환)

변수명 앞에 자료형을 붙여주지 않고 값을 변환

int first = 5;
int second = 2;

float floatVal = first / second; //묵시적 형변환

묵시적 형변환의 경우 값의 소실이 있을 수 있다

  • int→float는 값의 소실 X
  • float→int는 값의 소실 O

따라서값의 소실이 발생할 가능성에 대해 묵시적 형변환을 하지 못하게 막도록 하는 키워드가 Explicit이다.

Explicit을 적용하지 않음

  1. impTypeCasting 함수를 Call하여 Foo라는 객체를 생성한다.
  2. Foo 타입의 인자가 아니라 int형태의 인자를 넘겨준다.
  3. 컴파일러는 자동으로 Foo클래스의 int형 생성자(Foo (int val1))을 자동으로 호출한다.(묵시적 형변환)
#include <iostream>

class Foo {
public :
    int value1;

    Foo() : value1(0) {
        std::cout << "1-init: " << std::endl;
    }

    Foo(int val1) : value1(val1) {
        std::cout << "2-init: " << std::endl;
    }

    void printValue(){
        std::cout << value1 << std::endl;
    }
};

void impTypeCasting(Foo a){
    a.printValue();
}

int main(void) {
    impTypeCasting(100);
}

출력결과

Explicit을 적용

위의 묵시적 형변환을 막는 경우다.

#include <iostream>

class Foo {
public :
    int value1;

    Foo() : value1(0) {
        std::cout << "1-init: " << std::endl;
    }

    explicit Foo(int val1) : value1(val1) {
        std::cout << "2-init: " << std::endl;
    }

    void printValue(){
        std::cout << value1 << std::endl;
    }
};

void impTypeCasting(Foo a){
    a.printValue();
}

int main(void) {
    impTypeCasting(100);
}

출력결과 :

위 에러를 해결하려면 다음과 같은 문법을 사용해야 한다.

#include <iostream>

class Foo {
public :
    int value1;

    Foo() : value1(0) {
        std::cout << "1-init: " << std::endl;
    }

    explicit Foo(int val1) : value1(val1) {
        std::cout << "2-init: " << std::endl;
    }

    void printValue(){
        std::cout << value1 << std::endl;
    }
};

void impTypeCasting(Foo a){
    a.printValue();
}

int main(void) {
    impTypeCasting(Foo(100)); //요기가 다름
}

출력결과 :