0. 불변속성이란?


멤버 자체의 값그리고 멤버에 의해 참조되는 개체의 값을 통틀어 우리는 그 객체의 상태라고 한다(간단히 객체의 값이라고도 한다). 뭐니뭐니해도 클래스 설계의 핵심 과제는 일단 객체를 명확하게 정의된 상태에 두고(초기화/생성), 그 객체의 연산이 수행되는 도중에도 그 상태를 일정하게 유지하며마지막에 그 객체를 소멸시킬 때도 우아하게 마무리 짓는 것이다이때 어떤 객체의 상태가 프로그래머의 의도에 맞게 잘 정의되어 있다고 판단할 수 있는 기준을 제공하는 속성을 가리켜 불변속성(invariant)이라고 한다.

출처: The C++ Programming Language (https://oidoman.blog.me/90043583196)


전부는 아니지만, 클래스의 데이터 멤버의 몇 가지 조합 값만은 반드시 유효해야 합니다. 이런 조합을 가리켜 클래스의 불변속성(invariant)이라고 하며, 클래스 차원에서 지켜주어야 하는 부분입니다. 이 불변속성에 따라 클래스 멤버 함수 안에서 해 주어야 할 에러 점검 루틴이 좌우되는데, 특히 생성자, 대입 연산자, 각종 "쓰기(setter)" 함수는 불변속성에 많이 좌우됩니다. 그뿐 아니라 불변속성은 여러분의 함수가 발생시키는 예외에도 영향을 미치며, 혹시나 예외 지정(exception specification)을 쓴다면 그 부분에도 영향을 줍니다.


invariant는 어떤 객체의 유효한 상태를 규정하는 조건 혹은 그 조건을 점검하는 코드를 일컫는 전문 용어로, 불변식 혹은 불변속성이란 우리말 대역을 가지고 있으나, 여기서 쓰인 invariant는 그와 달리 동작이 변하지 않는 함수라는 뜻이다.

출처: Effective C++



객체 지향 프로그래밍에 있어서 불변객체(immutable object)는 생성 후 그 상태를 바꿀 수 없는 객체를 말한다. 반대 개념으로는 가변(mutable) 객체로 생성 후에도 상태를 변경할 수 있다. 객체 전체가 불변인 것도 있고, C++에서 const 데이터 멤버를 사용하는 경우와 같이 일부 속성만 불변인 것도 있다. 또, 경우에 따라서는 내부에서 사용하는 속성이 변화해도 외부에서 그 객체의 상태가 변하지 않은 것 처럼 보인다면 불변 객체로 보기도 한다. 예를 들어, 비용이 큰 계산의 결과를 캐시하기 위해 메모이제이션(Memoization)을 이용하더라도 그 객체는 여전히 불변하다고 볼 수있다. 불변 객체의 초기 상태는 대개 생성 시에 결정되지만 객체가 실제로 사용되는 순간까지 늦추기도 한다.

출처: 위키백과


즉, 클래스의 불변속성(invariant)이란 프로그래머의 설계 의도에 맞는 클래스의 속성 이라고 볼 수 있습니다.




1. 예제


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Rational
{
public:
    Rational(int n = 0, int d = 1);
    ~Rational();
 
public:
    void setDenominator(int d)    
    {
        d == 0 ? error_msg("zero divide"): denominator = d;
    }
 
 
private:
    int numerator, denominator;
};
cs


유리수를 나타내는 Rational 클래스이며, 유리수에서 분모는 0이 될 수 없습니다. 

이를 참고하여, 프로그래머는 클래스의 멤버변수 denominator를 0이 되지 않게 설계하였습니다.


0이 되지 않게 하기 위해 쓰기(setter) 함수에서 input 값을 점검하였고, 다른 멤버 함수들 또한 불변속성에 좌우됩니다.

여기서 설계한 "denominator는 0이 되지 않는다."라는 속성은 Rational 클래스의 불변속성이라고 할 수 있습니다.

'C++ > C++ 일반' 카테고리의 다른 글

스택 되감기(Stack Unwinding)  (0) 2018.10.24
선언과 정의(declaration and definition)  (2) 2018.10.22
인라인(inline) 함수  (0) 2018.10.12
원자성(atomicity)  (0) 2018.10.11
예외 안전성 보장(exception-safety guarantee)  (0) 2018.09.21

+ Recent posts