[C++] 4.4 클래스-explicit, mutable

Sireal·2022년 3월 7일
0

씹어먹는 C++ 따라하기

explicit 키워드

의도치 않은 암시적 변환을 할수 없도록 컴파일러에 명시해둘 수 있음

암시적 변환이란?

  • 클래스 멤버함수를 예로 들어보자
    DoSomethingString(MyString s){ // do Someting .. }
  • 원래는 이렇게 쓰이지만
    DoSomethingString(MyString("abc"));
  • 여기서 이런식으로 사용해도, 알아서 찰떡같이 알아듣고 위와같은 코드처럼 변환되는 것.
    DoSomethingString("abc");

explicit

명시적 이라는 뜻. 암시적 과 반댓말.
암시적변환을 막는 키워드이다.
변환이 아무때나 되면 예상치 못한 오작동을 일으킨다.

  • 명시적으로 확실하게 프로그램을 구축시키려 할땐 explict 키워드를 사용한다.
// explicit 생성자
explicit MyString(int capcity);

...

`DoSomethingString(MyString s){
// do Someting ..
}

...

// main()
DoSomethingWithString(3); // <- 오류
  • 암시적 형변환이 일어나게 되면 위에 코드는 오류가 안뜨게 된다.
  • 아지만 explicit로 미리 명시적 생성자를 만들어둬서, 오류가 뜬다.
    명시적으로 형변환을 막기때문에 매우 엄격하게 관리된다.
MyString s(5);   // 허용
MyString s = 5;  // 컴파일 오류!
  • 이렇게 복사생성자를 써도 막힌다.

mutable

변이가능한! 이라는 뜻의 지정자. const로 되어있는 친구들도 전부 바꿀 수 있게 만들어버림.

class A{
	int data_;
    public :
    A(int data) : data_(data){}
    void DoSomething(intx) const{
    	data = x; // 상수 함수(const)(읽기만가능)로 해놓곤, 변수를 수정해?? 당연히 오류 뜸.
    }
    
...
  • 이 C++ 헛배운 이 함수에서 오류를 고쳐보자..
class A{
	mutable int data_;
    public :
    A(int data) : data_(data){}
    void DoSomething(intx) const{
    	data = x; // 상수 함수(const)(읽기만가능)로 해놓곤, 변수를 수정해?? >> 근데 변수가 mutable... 원하는 값이 나온다.
    }
    
...
  • mutable 붙여주면 바로 const 함수고 나발이고 다된다. 컽!

아니근데 왜 const 함수의 용도인 '읽기'에서 '변경'으로 억지로 고쳐가며 왜 mutable 까지 써가면서 써야하냐...?

서버를 가지고 예를 들어보자

  • DB에 ID를 리턴받는 함수를 짰다.
  • 당연히 const 함수로 다 짰다.
  • 근데 DB에서 빠르게 ID를 찾으려면 '캐쉬'가 필요하다. (Cash 말고 Cache)
  • 여기서 DB에 있는 Cache를 확인해서 빠르게 ID을 찾아야하는데, 막상 ID를 찾고보니 Cache가 현재 그 ID를 대표하는 Cache 가 다르면 그 Cache를 고쳐줘야한다.
    • 어이쿠.. const 함수네?
    • 바로 Cache변수는 mutable 로 만들어버리자.
    • 컽!
profile
달리다 넘어져도 아픔마저 즐기려하는 사람

0개의 댓글