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

[C++] 캡슐화 실습 - 멤버 메서드 구현

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

3. 5 멤버 메서드 구현

 

 이제 Stu 클래스에 멤버 메서드들을 약속에 따라 구현을 하는 작업을 수행해 봅시다. 여기에서는 멤버 메서드들 중에 번호를 자동 부여하기 위한 부분과 상수 멤버 메서드를 구현하는 부분, 나머지 부분으로 나누어서 설명하려고 합니다. 여러분께서는 각 부분을 구현해 보고 각 부분에 대한 설명을 살펴보시고 참고하십시오.

 

3.5.1 번호 자동 부여하기 구현

 

 Stu 클래스에서는 정적 멤버인 last_num 멤버 필드가 가장 최근에 생성한 학생 번호를 가지고 있습니다. 이를 이용해서 번호를 부여하면 될 것입니다. 그런데 Stu 개체의 번호에 해당하는 num 멤버 필드는 상수 멤버 필드로 약속하여 생성자 메서드의 초기화 기법을 이용해야 합니다. 여기에서는 부여할 번호를 반환하는 정적 메서드를 정의하여 이를 이용하여 초기화 기법을 사용하도록 하겠습니다.

 

 학생 번호를 부여하는 정적 메서드 이름은 SetStuNum이라 명명을 한다면 다음과 같이 클래스 내에 캡슐화할 수 있을 것입니다.

 

private:

         static int SetStuNum();

 

 SetStuNum은 외부 스코프에 의해 접근을 노출한다면 학생 개체를 생성하지도 않으면서 부여할 번호가 변하게 되므로 접근 지정자를 private로 설정하였습니다.

 

 그리고 해당 메서드에서는 last_num을 증가시키고 증가한 last_num을 반환하면 새로 생성되는 학생 개체에게 부여할 번호를 적절히 반환할 수 있고 last_num은 가장 최근에 생성한 학생 번호를 유지할 수 있겠네요.

 

int Stu::SetStuNum()

{

         last_num++;

         return last_num;

}

마지막으로 생성자 메서드에서 초기화 기법을 이용하여 학생 개체의 멤버 필드를 초기화를 해 봅시다.

 

Stu::Stu(string _name):num(SetStuNum())

{

}

 

3.5.2 상수 멤버 메서드 구현

 

 Stu 클래스에는 학생의 이름을 얻어오는 메서드와 번호를 얻어오는 메서드, 학생 정보를 출력하는 메서드를 상수 멤버 메서드로 정의하기로 약속하였습니다. 해야 할 기능이 직관적이기 때문에 별다른 설명을 하지 않고 예를 보여주고 넘어가기로 하겠습니다.

 

string Stu::GetName()const

{

         return name;

}

int Stu::GetNum()const

{

         return num;

}

void Stu::View()const

{

         cout<<"번호:"<<num<<" 이름:"<<name<<endl;

         cout<<"체력:"<<hp<<" 아이큐:"<<iq<<" 스트레스:"<<stress<<endl;

}

 

3.5.3 나머지 멤버 메서드 구현

 

 먼저, 생성자 메서드에서는 인자로 전달된 이름을 설정하고 나머지 멤버 필드들을 약속에 명시된 디폴트 값으로 설정해야 할 것입니다.

 

Stu::Stu(string _name):num(SetStuNum())

{

         name = _name;

         hp = StuProperty::def_hp;

         iq = StuProperty::def_iq;

         stress = StuProperty::def_stress;

         scnt = StuProperty::def_scnt;

}

 

 이 외의 나머지 메서드들은 약속에 따라 멤버 필드의 값을 변경하면 될 것입니다. 그런데 각 멤버 필드의 값을 변경할 때 주의할 것은 특정 범위를 벗어나지 않게 조정을 해 주어야 합니다. 이러한 조정 작업을 각 메서드에서 모두 구현하는 것은 유지 보수 비용을 증가하게 하는 요인이 됩니다. 보다 효과적으로 구현하기 위해서 멤버 필드의 값을 변경하거나 설정하는 메서드는 Get필드 명, Set필드 명과 같은 이름으로 부여하고 이를 이용하는 방법을 사용해 봅시다. 참고로 이와 같은 메서드를 속성(Property) 메서드라고 부르기도 합니다.

 

 이와 같은 속성 메서드를 정의할 때 Set속성 메서드의 접근 지정자를 설정할 때에는 신중하게 생각해야 합니다. 여기에서는 모든 속성 메서드를 private로 설정하도록 하겠습니다.

 

private:

         void SetIq(int _iq);

         void SetHp(int _hp);

         void SetStress(int _stress);

         void SetSCnt(int _scnt);

         int GetIq()const;

         int GetHp()const;

         int GetStress()const;

         int GetSCnt()const;

 

 

 그리고 Set 속성 메서드에서는 값을 변경하는 작업과 약속된 범위를 벗어나는 부분에 대한 조정 작업이 있어야 할 것입니다.

 

void Stu::SetIq(int _iq)

{

         iq = _iq;

         if(iq > StuProperty::max_iq)

         {

                      iq = StuProperty::max_iq;

         }

         if(iq < StuProperty::min_iq)

         {

                      iq = StuProperty::min_iq;

         }

}

 

 이와 같은 형태로 속성 메서드에 대한 구현을 하였으면 이제 각 메서드들을 약속에 맞게 구현해 봅시다.

 

void Stu::Study()

{

         SetIq(GetIq() + (5 - GetSCnt());

         SetHp(GetHp() - 5);

         SetStress(GetStress() + 10);

         SetSCnt(GetSCnt()+1);

}

 

이상으로 캡슐화에 대한 실습은 마치도록 하겠습니다.


3장 캡슐화 실습 Part1 

3장 캡슐화 실습 Part2 

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

반응형