객체지향프로그래밍의 시작 -4

·2022년 5월 23일
0

cpp_study

목록 보기
7/25

클래스의 explicit과 mutable 키워드

암시적 변환

객체 MyString을 인자로 받는 함수를 생각해보자.
이때 MyString은 다음과 같은 형태의 클래스의 객체다.

#include <iostream>

class MyString {
  char* string_content; int string_length;
  int memory_capacity;
  // 문자열 데이터를 가리키는 포인터 // 문자열 길이
public:
  // capacity 만큼 미리 할당함. MyString(int capacity);
  // 문자열로 부터 생성 MyString(const char* str);
  // 복사 생성자
  MyString(int capacity);
  MyString(const MyString& str);
  ~MyString();
  int length() const;
};

// .. 생략.. 
int main() { MyString s(3); }

이때 DoSomethingWithString이라는 함수가 아래와 같이 객체 s를 인자로 가진다고 하자.

void DoSomethingWithString(MyString s) { // Do something...
}

이때,
DoSomethingWithString("abc") == DoSomethingWithString(MyString("abc"))
이다.

이를 암시적 변환이라고 한다.

explicit 키워드

암시적 변환을 막는 키워드.
복사 생성자의 형태로도 호출되는 것을 막는다.

MyString s = "abc"; // 복사 생성자의 형태, 오류
MyString s = 5;	// 복사 생성자의 형태, 오류

DoSomethingWithMyString(5); // 오류

MyString s(5);	// 허용

mutable 키워드

원래 const 함수에서는 멤버 변수를 read만 할 수 있고, write는 불가하다.
그러나 멤버 변수를 mutable 키워드로 선언했을 때 const 함수에서도 이들 값을 바꿀 수 있다.

mutable, 왜 필요하지?

서버 프로그램을 예로 들어보자.
보통은 자주 쓰이는 데이터를 캐시 데이터로 옮겨 두는데,
데이터를 조회할 때(조회니까 const 멤버 함수)
보통 캐시에서 찾고 -> 캐시에서 없으면 DB에서 찾고 캐시에 업데이트
하는 방식으로 진행한다.

이때, 캐시에 업데이트하는 것 = const 함수에 위배되는 행동이기 때문에
해당 데이터 객체를 선언할 때 mutable로 선언해버리면 된다.

profile
이것저것 개발하는 것 좋아하지만 서버 개발이 제일 좋더라구요..

0개의 댓글