C++

Ch09. C++ explicit & mutable

javadocq 2024. 1. 19. 15:35
728x90

Explicit

#include <iostream>

class MyDate {
int year;
int month;
int day;
int number;

public:
MyDate(int _year, int _month, int _day);
MyDate(int num);
void show() const;
};

MyDate::MyDate(int _year, int _month, int _day) {
year = _year;
month = _month;
day = _day;
}
MyDate::MyDate(int num) {
number = num;
}
void MyDate::show() const {
std::cout << year << "-" << month << "-" << day << std::endl;
}

int main() {
MyDate date(2000, 2, 2);
date.show();

MyDate date2 = 2000; 
date2.show();

return 0;
}

다음과 같이 Date 클래스를 정의해주고 MyDate를 객체로 받는 show 함수를 정의해준다. 

이후 컴파일하고 실행을 해보면 다음과 같이 실행될 것이다.

 

2000-2-2
0-0-0

[Done] exited with code=0 in 0.815 seconds

 

date2 같은 경우에는 년,월,일을 받지 않았는데도 왜 이렇게 되는 것일까? 

 

MyDate::MyDate(int num) {
number = num;
}

 

바로 이 부분 때문이다. C++은 객체를 생성할 때 값을 잘못 입력하더라도 그에 부합하는 생성자가 있다면 자동으로 그 객체로 생성이된다.

암시적 허용이라고 하는 부분인데 이런 부분을 방지하기 위해 explicit(명시적) 키워드를 사용하는 것이다.

 

explicit MyDate(int num);

 

객체 생성을 할 때 의도된 대로 생성을 하지 않는다면 C++ 프로그램은 부합하는 객체 생성자를 찾아서 생성을 하게 되는데 explicit 명령어를 사용하게 되면 암시적으로 생성이 되는 것을 막아준다. 이 부분은 우리가 잘못 입력하거나 의도치 않은 객체 생성을 방지한다.

위 상태에서 다시 코드를 실행시키게 되면 오류가 뜨게 된다.

 

31:12: error: no viable conversion from 'int' to 'MyDate'
MyDate date2 = 2000;
^ ~~~~

 

----------------------------------------------------------------------------------------------------------------------

 

Mutable

 

우리가 코드를 짜면서 const 키워드를 자주 사용했을 것이다. 만약 함수를 const 키워드를 적용하게 되면 그 변수의 값을 바꾸는 것은 불가능하게 된다. 하지만 가능하게 만드는 게 mutable 키워드이다. 그렇다면 mutable은 언제 사용을 해야할까?

 

웹 페이지 저장시스템에서 mutable 키워드를 사용하는 것을 볼 수 있을 것이다. 우리가 웹 페이지에서 DNS를 통해 데이터베이스에 요청을하게되면 데이터를 받아오는 것이 보통이지만 기본적으로 웹은 캐시라는 도구를 사용한다. 이 캐시는 사용자의 정보를 저장해서 원하는 페이지와 정보들을 빠르게 받아올 수 있다. 첫 번째 방문때는 데이터 베이스를 이용하지만 그 다음부터는 캐시에서 빠르게 받아올 수 있는데 이때 캐시에 저장된 데이터가 없으면 데이터베이스에 있는 값을 캐시로 업데이트 해야한다. 이럴 때 mutable 키워드가 많이 쓰이기도 한다.

 

다음은 간단한 예제를 통해 살펴보자

 

#include <iostream>

class COUNT {
int count;

public:
COUNT() {
count = 0;
}
int getCount() const {
return count;
}
void setCount() const {
count += 1;
}
void show() const {
std::cout << "count is " << count << std::endl;
}
};

int main() {
COUNT cnt;
cnt.show();
cnt.setCount();
cnt.show();
}

 

위와 같이 count의 값을 증가시키는 코드를 간단하게 만들어보았는데 함수를 const 키워드를 통해 읽기 전용으로 만들었기 때문에 실행시켜보면 아래와 같은 오류가 뜨게 된다. 바로 읽기 전용에서 count의 값을 변경했기 때문인데 mutable 키워드를 통해 해결해보자.

 

cannot assign to non-static data member within const member function 'setCount'
count += 1;

 

mutable int count;

 

count 변수 앞에 mutable 키워드를 붙이게 되면 

count is 0
count is 1

 

다음과 같이 count의 값이 변경된 것을 확인할 수 있다.