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