(C++) 8.8 클래스와 const

이준우·2021년 11월 23일
0

지금까지 const가 여러가지 용법으로 사용되었는데, class와 같이 사용되면 어떤 일을 할지 살펴보자!

main문을 유심히 보자. 자세히 보면 class에 const를 붙인 것을 볼 수 있다. 근데 뭔가 좀 이상하다. 왜 compiler가 오류를 발생시킬까?

우리가 지금까지 알고 있는 const는 값을 바꾸지 않으면 됐었다. 그런데, 값을 바꾸지 않고 출력만 하려는데, 왜 오류를 발생시키는 걸까? 무엇이 잘못된 걸까? class에서 사용된 const를 보기 위해선 아래와 같은 개념을 알아야 한다.

compiler가 판단하는 것은 m_value가 바뀌냐 안바뀌냐가 초점이 아니라 member function이 const냐 아니냐가 중요하다.

이처럼 바꾸게 되면, compiler는 오류를 발생시키지 않는다. 위의 그림처럼 코드를 작성하게 되면 member function은 const이며 안의 m_value값을 바꾸지 않는 다라고 명시되어 있기 때문에, 제대로 동작하게 된다.


compiler는 정말 똑똑하다. 값을 바꾸는 member function에 const를 선언하게 되면 바로 오류가 난다. m_value가 vlaue값으로 바꾸려고 하기 때문에, runtime에 가지도 못하고 compile 오류가 나는 것이다.

const로 넣어줄 수 있는 것은 웬만하면 다 const를 넣어 사용하는 것이 좋다.


이것이 실행된다는 것이 정말 신기하다. 저 주소를 찍어본 이유는 이러하다. 다른 주소를 갖는데, 어떻게 값을 가지고 실행이 되냐는 것이다. 생각을 해보자.

  1. Something class에 something 인스턴스를 만든 상태이다. 이 something 인스턴스의 주소는 0075F828이다.

  2. print(something)을 실행하면 void print(Something st)가 실행된다. 그때의 st인스턴스의 주소는 0075F754라는 값을 가지게 된다.

  3. 여기서 혼란을 겪는다. 주소가 다른데 어떻게 이게 값이 들어가냐는 것이다. 그 이유는 숨겨있는 생성자가 있다는 것이다.

이 부분에 대한 내용이 숨겨져 있다. 만약 사용자가 copy structor를 입력해주지 않는다면 이는 숨겨져 있는 형태로 동작한다.

그러면 우리가 이해하지 못한 것들이 이해되기 시작한다. 완전 순서대로 시작하면

  1. Something class에 something 인스턴스를 만든 상태이다. 이 something 인스턴스의 주소는 0075F828이다.

  2. Something something 을 실행하면 class 안의 Something()이 실행되어 cosole창에 Constructor이 출력된다.

  3. 그 다음에 print(something)을 실행하면 Something(const Something &st_in)가 실행된다.

  4. public에 선언된 m_value값을 가져와서 Something(const Something &st_in)으로 값이 복사(copy)되어 출력된다.

실제로 디버그를 사용하여 출력하면 무슨 내용인지 알기 쉽다.



하지만 이와같이 구성하는 것이 좋다. 하나를 출력하기 위해서 굳이 2개의 메모리를 차지하는 것보다 하나의 메모리를 차지하면서 똑같은 동작을 하는 것이 더 좋기 때문이다. 위에서도 말했지만 const를 많이 사용할수록 좋다.

0개의 댓글