C++/기타

[C++] 함수에 const 한정자

sseram 2023. 6. 15. 22:08
반응형
class myClass {
public:
    const int getdata1();
    int const getdata2();
    int getdata3() const;
};

 

 

이런 느낌의 함수.

어디 클린 코드의 강의 내용을 보면 한정자를 잘 쓸수록 코드가 좀 더 정확해진다는데, 지금까진 별 개념없이 사용해 왔어서, 시간이 나서 한 번 정리해본다.

 

 

 


결론부터 말하자면, getdata3() 빼고는 의미가 없다.

 

getdata3 은 함수 내부에서 값이 바뀌지 않을 거라고 보증해준다. 그러므로 코드를 작성하다, 만약 const라고 붙인 함수 내부에서 값이 변경되면 컴파일러가 빌드 전에 바로 알려준다.

 

다만, const가 앞에 붙은 경우엔 다르다. 이 때는 return type인 int를 const라고 해 준다.

 

return type을 const를 해 주면 무슨 일이 일어나느냐?

 

 

 

 

 

 

그저 const int라는 형태의 type을 복사하여 새로운 변수를 만들어 내게 된다.

 

 

 

즉 이 코드와 같은 일을 하게 된다.

return type에 const 한정자가 붙어 있다고 하더라도, 해당 값을 '복사' 하여 새로운 변수를 만들어내기 때문에 의미가 없어진다.

 

 

 

물론 이런 식으로 xvalue에다 바로 값을 넣겠어! 라는 느낌으로 구현하면 의미가 있겠지만...

 

저런 특수한 상황이 아니고서야, 위에서 예시로 든 코드는 int getdata3() const {} 말고는 의미가 없다.

 


 

 

return type을 pointer로 바꾸고 const를 붙이면 어떻게 될까?

raw pointer 사용은 자제하고 smart pointer를 사용하는 것이 백번 낫다만, 그 부분은 잠시 접어 두고 생각해 보자.

 

class myClass {
private:
    int data{0};
public:
    const int* getdata1();
    int* const getdata2();
};

const int* myClass::getdata1()
{
    return &data;
}

int * const myClass::getdata2()
{
    return &data;
}

 

실제 작성을 한다면 이런 식으로 작성이 될 것이다.

 

const int* 는 해당 포인터가 가리키는 곳의 값을 바꿀수 없다는 뜻이고,

int * const는, 해당 포인터 자체를 바꿀 수 없다는 뜻이다. 이 함수를 실행시키면 어떻게 될까?

 

 

 

 

getdata1 함수의 return 값은 원래 의도한 것 처럼, 가리키는 곳의 값을 바꾸지 못하게 설계된다.

 

 

 

 

 

다만, getdata2 함수의 return type에 의도했던 점은 무시되어 버린다.

결국은 위와 같다. 해당 타입을 복사하여 새롭게 만들었기 때문에. getdata2에서 가지고 있던 const성은 무시되어 버린다.

 

 

 


 

 

 

const를 사용하여 클린 코드를 만들자. const를 많이 사용할수록 프로그래머의 의도가 명확히 코드에 드러나게 되고, 해당 코드를 보는 다른 사람도 쉽게 이해 할 수가 있다고 한다.

물론 맞는 말이다. 다만 우리는 이런 좋은 의도의 한정자를 기계적, 또는 습관적으 사용해선 안 될 것이다. 괜히 보는 사람만 헷갈려지고, 실제 코드 내부에선 프로그래머의 의도와 전혀 다르게 동작하게 될 수도 있다.

 

그러니 내가 이 한정자를 함수에 붙이기 전에 반드시 생각해 보고 진행해야 할 것이다.

 

반응형