C++ explicit 이란?

잡설

회사 코드를 뒤적거리다 explicit 키워드를 봤을때 학부때 명시적 선언이라고 배웠던 기억을 겨우 꺼냈습니다. 다만 중요하게 여기지 않았던 기억이 있어, 그대로 지나치며 한번 정리하자고 생각해두었습니다. 그렇게 기억의 한 구석에 치워두고 확인해볼 생각조차 하지 못했는데, 다시 그 코드를 보았을때 이번에는 정확하게 무엇인지 정리해두어야겠다고하여 이제 정리해둡니다.

explicit이 나온 이유?

explicit으로 검색했을때 가장 먼저 나온 이야기는 cpp 컴파일러가 자동으로 형변환을 한다는 것입니다. 
#include <iostream>
#include <string>
class Test
{
private:
    int _val;
public:
    Test(int val) : _val(val) {}
    std::string to_string() { return std::to_string(_val); }
};
void print(Test test) {
    std::cout << test.to_string() << std::endl;
}
int main(int argc, char* argv[])
{
    int val = 1024;
    print(val);
    return 0;
}

컴파일 및 실행

$ g++ -std=c++11 explicit.cpp
$ a.out
1024
됩니다! print 함수는 분명히 Test를 받도록 되어있는데 int val을 넘겨줘도 됩니다! 
...
네 몰랐습니다. 경력으로 딱지쳤나봅니다.

explicit

여기서는 Test 클래스가 별달리 하는 일이 없지만, 만약 여러가지 일을 한다면 문제가 될 것입니다. 그래서 이런 경우를 방지하기 위해 명시적으로 생성자에 explicit 키워드를 붙여주면 컴파일 과장에서 에러가 발생합니다.
class Test
{
private:
    int _val;
public:
    explicit Test(int val) : _val(val) {}
    std::string to_string() { return std::to_string(_val); }
};

컴파일

$ g++ -std=c++11 explicit.cpp
explicit.cpp: In function ‘int main(int, char**)’:
explicit.cpp:21:14: error: could not convert ‘val’ from ‘int’ to ‘Test’
     print(val);

추가 정보

cplusplus.com의 explicit 항목에서 자세한 내용을 확인할 수 있습니다. class 생성자와 (c++11부터) 변환함수(타입을 바꿀수 있는 operator 함수)에 사용할수 있습니다. 즉 그 외에는 사용할 수 없다는 뜻입니다. explicit의 의미를 정확하게 이해했다면, 다른데 사용할 생각조차 안들겠죠.

댓글

이 블로그의 인기 게시물

WSL2 Ubuntu 20.04 및 네트워크 설정

리눅스 멀티코어를 사용하는 tar 압축/해제

git pull 을 했더니 branch가 갈라지는 경우