인프런 커뮤니티 질문&답변

musetng12님의 프로필 이미지
musetng12

작성한 질문수

이득우의 언리얼 프로그래밍 Part1 - 언리얼 C++의 이해

8강 언리얼 C++ 설계 II - 컴포지션

const에 대한 질문

작성

·

353

0

안녕하세요. Part1 8강을 듣다가 의문이 생겨서 질문드립니다!

FORCEINLINE const FString& GetName() const { return Name; };

강의에서 위의 경우 함수 뒤에 const를 사용시 return 되는 Name에 빨간 줄(오류)이 들어와 반환값에도 const를 붙여준 경우인데요. 이러한 이유는 반환 값에 const를 안 붙이게 되면 참조로 반환되기 때문에 값이 변경될 수 있고 이는 함수 뒤에 붙은 const의 의미가 없어지는 것이라고 하셨습니다. 이 부분까지는 이해가 잘되었습니다.

FORCEINLINE class UCard* GetCard() const { return Card; }

그런데 위의 경우에도 포인터로 반환이 되기 때문에 마찬가지로 값이 변경되는 경우가 발생하지 않나요? 그런데 이 부분에서는 오류로 인식을 안 하는지 궁금합니다. const가 제대로 역할을 하고 있지 않다고 생각이 드는데 교수님의 의견을 여쭤보고 싶습니다. 감사합니다.

답변 2

0

이득우님의 프로필 이미지
이득우
지식공유자

네 좋은 질문이네요.
사실 Getter에 습관적으로 const를 붙였는데, 이는 함수의 실행으로 인해 데이터가 변경되지 않아야 함을 의미합니다. 이는 실행 구문에서만 체크하며, 리턴된 값을 이후에 변경하는 작업은 다른 관점에서 봐야 합니다.

말씀하신 부분까지 고려해야 한다면, 함수 선언에서 포인터 앞에 const를 붙이거나 리턴된 포인터를 로컬 변수로 받을 때 로컬 변수를 const로 지정해야 겠지요. 예제에서는 리턴된 로컬 변수를 const로 선언했습니다.

musetng12님의 프로필 이미지
musetng12
질문자

아 그렇군요! 좋은 답변해주셔서 감사합니다!

0

안녕하세요, 인프런 AI 인턴입니다.
musetng12님, 강의 중에 생긴 궁금증을 정리하여 질문해 주신 부분에 대해 답변드리겠습니다.

해당 질문은 C++에서의 const-correctness와 관련이 있는 부분입니다. 정리해주신 내용처럼 멤버 함수 뒤에 const를 붙여서 이 함수가 객체의 상태를 변경하지 않을 것임을 명시할 수 있습니다. 이 경우 멤버 변수들을 변경할 수 없게 됩니다.

첫 번째 코드에서 GetName 함수는 const 멤버 함수이기 때문에 Name 멤버 변수에 대한 변경을 허용하지 않는데, 반환값이 const FString& 형식이어야만 이를 보장합니다. 질문에 있는 대로, FString&로 반환할 경우 호출자가 반환된 참조를 통해 Name을 변경할 수 있기 때문에 컴파일러는 오류를 발생시킵니다.

두 번째 코드에서 GetCard 함수는 포인터를 반환하는데, 여기서 중요한 것은 반환되는 UCard* 포인터 자체는 const 함수인 ‘GetCard’에서 변경할 수 없습니다. 그러나 이 포인터가 가리키는 객체, 즉 UCard 객체는 const가 아니기 때문에, 반환 후에 객체의 상태를 변경할 수 있는 가능성이 있습니다.

여기서 const 멤버 함수에서 포인터를 반환할 때, 객체의 상태 변경을 전혀 허용하지 않으려면 반환 타입을 const UCard*로 지정해야 합니다. 이렇게 반환 타입에 const를 붙이면 포인터를 통해 원본 객체를 변경하는 것이 금지됩니다.

FORCEINLINE const class UCard* GetCard() const { return Card; }

이 경우 GetCard의 반환값을 통해 UCard 객체의 변경이 불가능하다는 것을 보장할 수 있습니다.

답변이 musetng12님의 이해에 도움이 되었기를 바라며, 추가적인 질문이 있으시면 언제든지 문의해주세요.

감사합니다.

musetng12님의 프로필 이미지
musetng12

작성한 질문수

질문하기