본문으로 바로가기

OOP의 이해 - ⑦ const와 mutable 그리고 explicit

class에서 활용되는 기본 키워드들 중 const, mutable, explicit 를 알아본다.

const

붙여줄 수 있는 모든 곳에 붙이는 것이 기본 룰. ex 멤버 함수에서 멤버 변수의 값을 바꾸지 않는다면 무조건 붙인다. const를 붙임으로써 컴파일러가 const를 체크해서 잘못된 점이 있으면 컴파일 시간에 에러를 발생시켜 더 안전한 프로그램을 작성할 수 있게 된다.

 

const를 사용하면 아래와 같이 대표적으로 두 가지의 경우에서 컴파일 에러를 발생시킴으로써 안전한 코드를 작성할 수 있도록 도와준다.

class Cat {
public:
    Cat(std::string name) : mName{ std::move(name) } {}
    void speak() const
    {
        // mName = "no const"; // error
        std::cout << mName << ": mew~" << std::endl;
    }
    void sleep()
    {
        std::cout << mName << ": sleep" << std::endl;
    }

private:
    std::string mName;
};

int main()
{
    const Cat kitty( "kitty" );

    kitty.speak();
    //kiity.sleep(); // error: not const member function

    return 0;
}
  • const 멤버 함수에서 멤버 변수를 변경할 경우 컴파일 에러 발생.
  • const 객체는 항상 const 객체만 호출. 비 const함수는 호출 불가능. 때문에 값을 변경하지 않는 멤버 함수라면 반드시 const 붙이는 것이 원칙.

mutable

mutable이 붙은 멤버 변수는 const 함수에서 값을 변경 가능하다. 가급적이면 사용하지 않는 것이 바람직함.

class Cat {
public:
    Cat(std::string name) : mName{ std::move(name) } {}
    void speak() const
    {
        mName = "mutable"; // modifiable
        std::cout << mName << ": mew~" << std::endl;
    }
    void sleep()
    {
        std::cout << mName << ": sleep" << std::endl;
    }

private:
    mutable std::string mName;
};

int main()
{
    const Cat kitty("kitty");

    kitty.speak();

    return 0;
}

explicit

explicit 키워드는 암묵적 변환을 막기 위해 사용됨. 암묵적인 변환이란 다음과 같은 경우이다.

class Cat {
public:
    Cat(int age) : mAge{ age } {}
private:
    int mAge;
};

int main()
{
    Cat kitty = 3; // 암묵적으로 Cat(int age) 생성자가 호출됨

    return 0;
}

암묵적으로 int 타입 3이 Cat 타입 kitty로 변환되었다. 이런 암묵적인 변환을 막기 위해서 explicit 키워드를 사용한다. C++ 에서 생성자의 매개변수가 하나이고 암묵적인 변환을 의도적으로 지원할 것이 아니라면 다음과 같이 explicit를 무조건 써주는 것이 더 안전한 프로그램을 작성할 수 있어서 좋다.

class Cat {
public:
    explicit Cat(int age) : mAge{ age } {}
private:
    int mAge;
};

int main()
{
    //  Cat kitty = 3; // error
    Cat kitty {3}; // 명시적으로 Cat(int age) 생성자 호출

    return 0;
}

출처: https://www.youtube.com/channel/UCHcG02L6TSS-StkSbqVy6Fg