언어 자료구조 알고리즘/Escort C++

[C++] 상수화 멤버

언제나휴일 2016. 4. 15. 13:00
반응형

2.2.4 상수화 멤버

 

 캡슐화된 멤버들을 구분하는 또 다른 기준 중의 하나는 상수 멤버와 비 상수 멤버로 나누는 것입니다. 상수 멤버는 형식 정의 내에 멤버 앞에 const 키워드가 붙여 명시하게 됩니다. 상수 멤버 필드는 const 키워드가 앞에 붙고 상수 멤버 메서드는 뒤에 붙게 됩니다. 상수 멤버 필드는 값이 변경되지 않는 멤버 필드이고 상수 멤버 메서드는 멤버 필드값을 변경하는 구문을 포함하지 못하는 메서드입니다.

 

 예를 들어, 학생 생성 시에 학번을 부여하고 이후에는 학번을 변경하지 못하게 하고자 한다면 상수 멤버 필드로 사용할 수 있습니다. 또 다른 예로 학생의 iq가 최대 200까지만 올라갈 수 있게 하려고 한다면 static 상수 멤버 필드로 정할 수 있습니다. 그리고 학생의 정보를 확인만 하는 목적의 메서드는 상수 멤버 메서드로 정의하여 신뢰성을 높일 수 있습니다.

 

 그리고 상수 멤버 메서드에서는 비 상수 멤버 메서드를 호출할 수가 없습니다. 비 상수 멤버 메서드에서는 멤버 필드를 바꿀 수도 있기 때문에 상수 멤버 메서드에서 비 상수 멤버 메서드를 호출하는 구문이 있으면 컴파일 오류가 생기게 됩니다.

 

 상수 멤버는 아니지만, 상수 개체도 있는데 상수 개체는 상수 멤버 메서드만 사용할 수 있는 개체를 말하며 생성된 개체를 관리하는 변수가 const로 지정되어 있을 때를 말합니다.

 

 상수에 대한 부분도 예를 통해 Look & Feel 하시고 다시 살펴보시기 바랍니다.

 

Stu.h

#pragma once 

class Stu

{

    static const int max_iq; //정적 상수 멤버 필드

    static int last_num;      

    const int num;           //비 정적 상수 멤버 필드

    int iq;

public:

    Stu(void);

    ~Stu(void);

    void Study(int tcnt);

    int GetIq()const;        //상수 멤버 메서드

    int GetNum()const;       //상수 멤버 메서드

private:

    static int SettingStuNum();

}; 

 

 정적 상수 멤버 필드인 max_iq는 다른 정적 멤버 필드처럼 해당 멤버를 위한 메모리를 할당을 받기 위해서는 CPP 파일에 반드시 선언해 주어야 합니다. 그리고 상수 멤버이므로 선언하면서 초기값을 설정해 주어야 합니다.

  

 비정적 상수 멤버 필드인 num은 생성자에서 초기화 기법을 사용해야 합니다. 그 외의 다른 메서드에서는 상수 멤버인 num의 값을 변경할 수 없습니다. Stu.cpp에 구현된 예를 보시면 Stu::Stu():num(0) 과 같이 메서드 구현 정의에서 시작 {를 만나기 전에 콜론(:)을 하고 초기화 할 멤버명과 ( )내부에 초기화할 값을 명시하는 것을 확인할 수 있습니다. 이와 같이 표현하는 것을 초기화 기법이라 합니다. 초기화 기법을 사용할 때 ( ) 내부에는 초기화할 멤버의 형식과 호환되는 값을 반환하는 메서드 호출을 할 수도 있습니다.

 

 마지막으로 상수 멤버 메서드는 내부 멤버 필드의 값을 변경하지 못하는 메서드를 정의할 때 사용이 되는데 정적 멤버를 지정하는 static과 달리 메서드 시그니쳐의 일부로 취급하므로 헤더 파일에서 뿐만 아니라 CPP 파일에 해당 메서드 구현에서도 const 키워드를 붙여주어야 합니다. 다음의 예를 살펴보세요.

 

Stu.cpp

#include "Stu.h" 

const int Stu::max_iq = 200; //정적 상수 멤버 선언 및 초기화

int Stu::last_num;

Stu::Stu(void):num(SettingStuNum()) //비 정적 상수 멤버 초기화

{

    iq = 100;

}

Stu::~Stu(void)

{

void Stu::Study(int tcnt)

{

    iq += tcnt;

    if(iq > max_iq)

    {

        iq = max_iq;

    }

} 

int Stu::GetIq()const   //상수 멤버 메서드

{

    return iq;

} 

int Stu::GetNum()const   //상수 멤버 메서드

{

    return num;

 

int Stu::SettingStuNum()

{

    last_num++;

    return last_num;

} 

 

 

 마지막으로 상수 개체는 상수 멤버 메서드를 호출이 가능하지만, 비 상수 멤버 메서드 호출을 할 수 없다는 것은 [그림 2.10]을 보고 Look & Feel 하시기 바랍니다.


[그림 2.10]


2장 캡슐화 Part1 

2장 캡슐화 Part2 

(모든 동영상 강의는 무료입니다.)

반응형