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

[C++] 클래스에 캡슐화 할 멤버 약속하기

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

3. 2 클래스에 캡슐화 할 멤버 약속하기

 

 구현해야 할 멤버 필드와 멤버 메서드에 대해서 살펴보았으면 이를 프로젝트에 Stu 클래스를 추가한 후에 목적에 맞게 멤버 필드와 멤버 메서드를 추가해 보시기 바랍니다. 멤버 메서드의 내부 구현은 다음 단계에서 할 것이니 CPP 소스 파일에 멤버 메서드는 내부가 비어 있는 상태로 만들어 보세요. (리턴 형식이 있는 메서드는 0이나 ""와 같은 값으로 형식에 맞게 반환하는 코드는 표현하여 컴파일 오류가 나지 않도록 작성해 보시기 바랍니다. 효과적으로 표현하기 위해 프로젝트를 생성하여 Program.cpp 소스 파일을 추가하시고 Class 추가를 통해 Stu.h Stu.cpp 파일도 추가하신 후에 [그림 3.1] [그림 3.2]에 있는 멤버들을 캡슐화해 보시기 바랍니다. 여러분이 각자 이 작업을 수행한 후 다음의 설명과 구현 예를 비판적인 시각으로 살펴보세요.

 

3.2.1 멤버 필드 캡슐화

 

 Stu 클래스에 구현해야 할 사항을 파악하여 필요한 멤버 목록을 작성하였으면 각 멤버의 형식을 정의해야 할 것입니다. 멤버 필드는 외부 scope에서 접근하지 못하게 가시성을 차단하고 이에 대한 참조나 변경이 필요한 경우에는 멤버 메서드를 통해 접근하게 함으로써 정보 은닉을 통해 신뢰성 있게 프로그래밍할 수 있습니다.

 

 먼저, last_num은 정적 멤버 필드이므로 Stu 클래스 내부에 static 키워드를 명시하고 int 형으로 표현하면 되겠네요. 그리고 정적 멤버 필드는 CPP 소스 파일에 선언해야 한다는 것을 잊지 마시기 바랍니다.

 

헤더 파일: static int last_num;

소스 파일: int Stu::last_num;

 

 그리고 학생 번호는 생성 멤버 필드로 하기로 했으니 const 키워드를 명시하고 int 형으로 표현합니다. 비정적 상수 멤버 필드는 생성자 메서드에서 초기화 기법을 사용해야 하므로 주의하시기 바랍니다. 아직까지는 메서드 내부에 구체적인 구현은 다루지 않기로 했으니 num 0으로 초기화하고 구체적 구현을 할 때 수정하도록 합시다.

 

헤더 파일: const int num;

소스 파일: Stu::Stu():num(0)

 

 이름은 string 형식으로 하면 되겠네요. string 형식을 사용하려면 헤더 파일에 #include <string>을 포함하고 std 네임 스페이스에 있는 string을 사용하겠다는 의미로 using std::string;과 같은 표현을 하시면 됩니다. C언어에서의 string.h와 다른 파일이니 주의하시기 바랍니다. 이후에 Stu 클래스 내부에 string 형식의 멤버 필드를 선언하면 되겠네요.

 

헤더 파일: string name;

 

 여러분의 생각처럼 그 외에 나머지 멤버 필드들은 int 형식으로 Stu 클래스 내부에 추가하면 됩니다. 여기까지 표현하면 다음과 같이 Stu.h 파일과 Stu.cpp 파일이 작성되겠지요. 예를 보시면 멤버 필드들은 접근 지정자를 표현하지 않았기 때문에 디폴트 접근 지정자인 private이 됩니다.

 

Stu.h - 멤버 필드를 캡슐화 표현한 예

#pragma once

#include <string>

using std::string;

class Stu

{

    int hp;

    int iq;

    string name;

    const int num;

    int scnt;

    int stress;

    static int last_num;

public:

    Stu();

    ~Stu(void);

};

 

Stu.cpp - 멤버 필드를 캡슐화 표현한 예

#include "Stu.h"

int Stu::last_num;

Stu::Stu():num(0)

{

}

Stu::~Stu(void)

{

}

 

 

3.2.2 멤버 필드 캡슐화

 

 이번에는 멤버 메서드를 캡슐화 약속을 표현하는 예를 살펴보기로 합시다. 먼저, 생성자는 이름을 입력 인자로 전달받기로 했기 때문에 이를 반영해야 할 것입니다.

 

헤더 파일: Stu(string _name);

소스 파일: Stu::Stu(string _name):num(0) {  }

 

 춤을 추다, 음료를 마시다, 강의를 듣다, 휴식을 취하다, 잠을 자다, 공부하다에 해당하는 멤버 메서드는 특별한 사항이 없으니 어렵지 않게 표현할 수 있었을 것입니다. 그렇지만 이름을 얻어오다, 번호를 얻어오다, 정보를 보다와 같은 멤버 필드들이 변화가 생기지 않는 상수 멤버 메서드의 경우는 헤더 파일에 함수 시그니쳐를 약속을 할 때에도 const 키워드를 뒤에 명시하여야 하고 소스 파일에도 함수 시그니쳐에 const 키워드를 명시하여야 합니다. 이를 표현한 예를 여러분이 작성한 코드와 비교해 보시기 바랍니다. 여기에서 보여주는 것은 예일 뿐이며 여러분의 비판적인 시각이 필요합니다.

 

Stu.h - 멤버 필드와 멤버 메서드 캡슐화 약속을 표현

#pragma once

#include <string>

#include <iostream>

using std::cout;

using std::endl;

using std::cin;

using std::string;

class Stu

{

    int hp;

    int iq;

    string name;

    const int num;

    int scnt;

    int stress;

    static int last_num;

public:

    Stu(string _name);

    ~Stu(void);

    void Dance();

    void Drink();

    string GetName()const;

    int GetNum()const;

    void ListenLecture();

    void Relax();

    void Sleep();

    void Study();

    void View()const;

};

 

 GetName 메서드와 GetNum 메서드, View 메서드는 내부에서 멤버 필드를 변경하지 않기 때문에 상수 멤버 메서드로 표현하고 있습니다.

 

Stu.cpp - 멤버 필드와 멤버 메서드 캡슐화 약속을 표현

#include "Stu.h"

int Stu::last_num; //정적 멤버 필드는 소스 파일에 선언해야 합니다.

Stu::Stu(string _name):num(0) //비 정적 상수 멤버 필드는 초기화 기법을 사용해야 합니다.

{

}

Stu::~Stu(void){ }

void Stu::Dance(){ }

void Stu::Drink(){ }

string Stu::GetName()const //상수 멤버 메서드의 const는 시그니쳐의 일부입니다.

{

         return 0;

}

int Stu::GetNum()const  //상수 멤버 메서드의 const는 시그니쳐의 일부입니다.

{

         return 0;

}

void Stu::ListenLecture(){ }

void Stu::Relax(){ }

void Stu::Sleep(){ }

void Stu::Study(){ }

void Stu::View()const  //상수 멤버 메서드의 const는 시그니쳐의 일부입니다.

{

}

 

3장 캡슐화 실습 Part1 

3장 캡슐화 실습 Part2 

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

반응형