CPP/씹어먹는 c++

[c++개념정리]암시적 변환, explicit, mutable

뜨거운 개발자 2023. 1. 27. 19:52
💡
자주 쓰이지는 않지만 나름 중요한 explicit 과 mutable 키워드

암시적 변환

💡
클래스를 만들어서 넘겨줘야하는데 바로 넘겨주는 경우 컴파일러는 똑똑해서 클래스로 알아서 변환을 해줘서 넘겨준다. 이와 같은 변환을 우리는 암시적 변환이라고 부른다.
void DoSomethingWithString(MyString s) {   // Do something... }
  1. DoSomethingWithString(MyString("abc")) 이건 당연하게 가능하다.
  1. DoSomethingWithString("abc") 이것도 신기하게도 가능하다.
  1. "abc " 는 MyString타입이 아니다. 그런데 C++ 컴파일러는 꽤나 똑똑해서 "abc" 를 어떻게 하면 MyString으로 바꿀 수 있는지 생각해봅니다.
  1. 다행히 생성자 중에 MyString(const char* str); 이게 있어서 자동으로 바꿔줬다.
  1. 이것이 언제나 편리한 것은 아니다. 사용자가 의도하지 않은 암시적 변환이 일어나게 되는 경우가 있기 때문이다.
  1. 이것을 해결하기 위해 우리는 암시적으로 변환이 일어나는 것을 막는 키워드를 사용할 수가 있습니다.

explicit

💡
C++ 에서는 원하지 않는 암시적 변환을 할 수 없도록 explicit 키워드를 이용해서 컴파일러에게 명시할 수 있습니다.

explicit MyString(int capacity); 위와 같이 사용하면 된다.

이렇게 사용하면 암시적 변환이 일어나지 않는다.

explicit키워드는 복사 생성자의 형태로도 호출되는 것을 막게 된다.
MyString s(5);   // 허용 MyString s = 5;  // 컴파일 오류!

 

mutable(변이가능한)

💡
const 멤버함수 내부에서는 멤버변수들의 값을 변경불가.
💡
단, 멤버변수를 mutable로 선언했다면 const함수에서도 이를 바꿀 수 있다

예시 안되는 코드

#include <iostream>  class A 
{   
    int data_;  
    public:  
    	A(int data) : data_(data) {} 
        void DoSomething(int x) const {     data_ = x;  // 불가능!   }   
        void PrintData() const 
        { 
            std::cout << "data: " << data_ << std::endl; 
        } 
}; 
int main() 
{ 
    A a(10); 
    a.DoSomething(3); 
    a.PrintData();
}

되는 수정코드

#include <iostream> 
class A 
{  
    mutable int data_;   
    public:  
        A(int data) : data_(data) {} 
        void DoSomething(int x) const {     data_ = x;  // 가능!   } 
        void PrintData() const { std::cout << "data: " << data_ << std::endl; }
};  
int main() 
{  
    A a(10);   
    a.DoSomething(3);   
    a.PrintData(); 
}

 

mutable이 필요한 이유

  • 객체의 내부상태에 영향을 끼치지 않기 위해서 const로 함수를 선언한다.
  • 단 ..! 정보를 데이터에서 빼오는 과정에서 데이터는 건들지 않지만 일반적으로 서버는 메모리에 캐쉬(cash)를 만들어서 자주 요청되는 데이터를 굳이 데이터베이스까지 가서 찾지 않아도 빠르게 조회 할 수 있게 한다.
  • 이 과정에서 읽을때 캐쉬를 이용해야하기 때문에 캐쉬를 보통 mutable로 사용하게 된다.
  • 따라서 보통 캐쉬같이 사용자 입장에서는 const가 당연한 것들이고 구현 하는 방면에서 cash를 사용하는경우 캐쉬만 mutable로 선언해준다.

 


Uploaded by

N2T
728x90