-
[C++] 상수형 메서드프로그래밍/C & C++ 2024. 7. 6. 22:53728x90반응형
상수형 메서드(const member function)는 C++ 클래스에서 멤버 함수가 객체의 상태를 변경하지 않음을 보장하기 위해 사용됩니다. 상수형 메서드는 함수 선언의 끝에
const
키워드를 추가하여 정의합니다. 이를 통해 해당 함수 내에서는 멤버 변수를 변경할 수 없으며, 상수 객체에서도 호출할 수 있게 됩니다.상수형 메서드의 선언과 정의
상수형 메서드는 다음과 같이 선언하고 정의할 수 있습니다:
class MyClass { private: int value; public: MyClass(int v) : value(v) {} // 상수형 메서드 선언 int getValue() const { return value; } // 비상수형 메서드 void setValue(int v) { value = v; } };
위의 예제에서
getValue
메서드는 상수형 메서드로 선언되었으며,setValue
메서드는 비상수형 메서드입니다.상수형 메서드의 사용 예
다음은 상수형 메서드를 사용하는 예제입니다:
#include <iostream> class MyClass { private: int value; public: MyClass(int v) : value(v) {} int getValue() const { return value; } void setValue(int v) { value = v; } }; int main() { const MyClass obj(5); // 상수 객체 std::cout << "Value: " << obj.getValue() << std::endl; // 정상 동작 // obj.setValue(10); // 오류: 상수 객체에서는 상수형 메서드만 호출 가능 return 0; }
설명
상수형 메서드:
getValue
메서드는 상수형 메서드로 선언되었습니다. 이 메서드는 객체의 멤버 변수value
를 변경하지 않음을 보장합니다.- 상수형 메서드는 상수 객체에서도 호출할 수 있습니다. 예제에서는
const MyClass obj(5)
와 같이 상수 객체를 생성하고,obj.getValue()
를 호출하고 있습니다.
비상수형 메서드:
setValue
메서드는 상수형 메서드가 아닙니다. 이 메서드는 객체의 멤버 변수value
를 변경할 수 있습니다.- 상수 객체에서는 비상수형 메서드를 호출할 수 없습니다. 따라서
obj.setValue(10)
은 오류를 발생시킵니다.
상수형 메서드의 장점
객체 불변성 보장:
- 상수형 메서드는 객체의 상태를 변경하지 않음을 보장하므로, 객체의 불변성을 유지할 수 있습니다.
안전한 코드 작성:
- 객체의 상태를 변경하지 않는 메서드를 명확히 구분하여 코드의 안전성을 높일 수 있습니다.
멀티스레딩에서의 안전성:
- 상수형 메서드는 상태 변경이 없으므로, 멀티스레드 환경에서 동기화 문제를 피할 수 있습니다.
코드 가독성 향상:
- 메서드가 객체의 상태를 변경하지 않음을 명시적으로 표현하여 코드의 가독성을 높일 수 있습니다.
상수형 메서드 내에서의 제한사항
상수형 메서드 내에서는 멤버 변수를 변경할 수 없습니다.
int getValue() const { value = 10; // 오류: 상수형 메서드 내에서는 멤버 변수를 변경할 수 없음 return value; }
상수형 메서드 내에서는 비상수형 메서드를 호출할 수 없습니다.
void someFunction() const { setValue(10); // 오류: 상수형 메서드 내에서는 비상수형 메서드를 호출할 수 없음 }
요약
상수형 메서드는 객체의 상태를 변경하지 않는 메서드를 선언하는 방법입니다. 이를 통해 코드의 안전성과 가독성을 높이고, 멀티스레딩 환경에서의 동기화 문제를 줄일 수 있습니다. 클래스 설계 시 상수형 메서드를 적절히 사용하면 객체의 불변성을 보장할 수 있어, 더 안전하고 유지보수하기 쉬운 코드를 작성할 수 있습니다.
728x90반응형'프로그래밍 > C & C++' 카테고리의 다른 글
[C++] Mutable (0) 2024.07.07 [C++] Auto (0) 2024.07.07 [C++] STL 종류 (0) 2024.07.06 [C++] 제네릭 프로그래밍 (0) 2024.07.05 [C++] 템플릿 (0) 2024.07.05