언어 자료구조 알고리즘/디딤돌 C++

26. 캡슐화 최종 실습 - 구체적 구현

언제나휴일 2016. 1. 27. 19:59
반응형
안녕하세요. 언제나 휴일, 언휴예요.
이번에는 캡슐화 최종 실습의 마지막 단계인 구체적 구현을 할 차례네요.
여러분께서는 먼저 구현한 후에 비교해 보세요.

 

이제 마지막으로 메서드를 구체적으로 구현합시다. 약속한 기능을 구현하면서 필요하면 별도의 메서드를 추가하세요. 여기에서 추가하는 메서드는 다른 형식에서 호출해서 사용하지 않는 메서드이므로 접근 지정을 private으로 지정하세요.
 
특히 멤버 필드의 값이 특정 범위 내에 있어서 필터링을 요구하면 설정자 메서드를 추가하여 구현하세요. 설정자 메서드에서 멤버 필드 값을 범위 내에서 조절하는 기능을 작성하면 버그를 만들 확률을 줄일 수 있습니다.
 
여러분께서 각자 구현해 본 후에 비교해 보세요.
 
여기에서는 지력, 체력, 스트레스, 연속으로 공부한 횟수는 범위가 정해져 있습니다. 이에 이들 멤버 필드 값을 설정하는 설정자를 추가합시다. 물론 이들 메서드는 형식 외부에서 직접 접근할 수 없게 private으로 접근 지정하세요.
private:
    void SetIQ(int iq);//지력 설정자
    void SetHP(int hp); //체력 설정자
    void SetStress(int stress); //스트레스 설정자
    void SetScnt(int scnt); //연속으로 공부한 횟수 설정자
 
설정자 메서드에서는 입력 인자로 받은 값이 최대값과 최소값을 벗어나지 않게 설정하세요.
void Student::SetIQ(int iq)
{
    if(iq>max_iq)
    {
        iq = max_iq;
    }
    if(iq<min_iq)
    {
        iq = min_iq;
    }
    this->iq = iq;
}
 
다른 설정자도 같은 방법으로 구현합니다.
 
생성자에서 이름은 입력 인자로 받은 값으로 설정하고 나머지 멤버들은 디폴트 값으로 설정하세요.
Student::Student(string name):pn(++last_pn)
{
    this->name = name;
    SetIQ(def_iq);
    SetHP(def_hp);
    SetStress(def_stress);
    SetScnt(def_scnt);
}
 
"공부하다." 메서드에서는 먼저 무엇을 하는지 출력 후에 시나리오에 맞게 값을 설정하세요.
void Student::Study()
{
    //공부하다(체력 5소모, 지력: scnt 만큼 증가, 스트레스: 2감소)
    cout<<pn<<","<<name<<" 공부하다."<<endl;
    SetHP(hp - 5);
    SetIQ(iq+scnt);
    SetStress(stress-2);
    SetScnt(scnt+1);
}
 
나머지 메서드도 같은 방법으로 구현하세요. 그리고 구현하였으면 제대로 동작하는지 테스트하고 잘못 작성한 부분이 있으면 수정하세요.
 
다음은 이제까지 실습한 전체 코드입니다.
//Student.h
#pragma once
#include <string>
using namespace std;
class Student
{
    const int pn;//주민번호
    static int last_pn;//가장 최근에 부여한 주민 번호
    string name;//이름
    int iq;//지력
    int hp;//체력
    int stress;//스트레스
    int scnt;//연속으로 공부한 횟수
   
    //능력치의 디폴트, 최소, 최대값
    static const int def_iq;
    static const int min_iq;
    static const int max_iq;
 
    static const int def_hp;
    static const int min_hp;
    static const int max_hp;
 
    static const int def_stress;
    static const int min_stress;
    static const int max_stress;
 
    static const int def_scnt;
    static const int min_scnt;
    static const int max_scnt;
public:
    Student(string name);//생성자
    void Study();//공부하다.
    void ListenLecture();//강의받다.
    void Sleep();//잠자다.
    void Relax();//휴식하다.
    void Drink();//음료마시다.
    void Sing();//노래하다.
    string GetName()const;//이름 접근자
    int GetPN()const;//주민번호 접근자
    int GetIQ()const;//지력 접근자
    int GetHP()const;//체력 접근자
    int GetStress()const;//스트레스 접근자
private:
    void SetIQ(int iq);//지력 설정자
    void SetHP(int hp); //체력 설정자
    void SetStress(int stress); //스트레스 설정자
    void SetScnt(int scnt); //연속으로 공부한 횟수 설정자
};
 
//Student.cpp
#include "Student.h"
#include <iostream>
using namespace std;
int Student::last_pn;
const int Student::def_iq=100;
const int Student::min_iq=0;
const int Student::max_iq=200;
const int Student::def_hp=100;
const int Student::min_hp=0;
const int Student::max_hp=200;
const int Student::def_stress=0;
const int Student::min_stress=0;
const int Student::max_stress=100;
const int Student::def_scnt=0;
const int Student::min_scnt=0;
const int Student::max_scnt=5;
Student::Student(string name):pn(++last_pn)
{
    this->name = name;
    SetIQ(def_iq);
    SetHP(def_hp);
    SetStress(def_stress);
    SetScnt(def_scnt);
}
void Student::Study()
{
    //공부하다(체력 5소모, 지력: scnt 만큼 증가, 스트레스: 2감소)
    cout<<pn<<","<<name<<" 공부하다."<<endl;
    SetHP(hp - 5);
    SetIQ(iq+scnt);
    SetStress(stress-2);
    SetScnt(scnt+1);
}
void Student::ListenLecture()
{
    //강의를 받다.(체력 3소모, 지력: scnt 만큼 증가, 스트레스: scnt 만큼 증가)
    cout<<pn<<","<<name<<" 강의받다."<<endl;
    SetHP(hp - 3);
    SetIQ(iq+scnt);
    SetStress(stress+scnt);
    SetScnt(0);
}
void Student::Sleep()
{
    //잠자다.(체력 10회복, 스트레스: 5감소)
    cout<<pn<<","<<name<<" 잠자다."<<endl;
    SetHP(hp + 10);   
    SetStress(stress-5);
    SetScnt(0);
}
void Student::Relax()
{
    //휴식하다.(체력 3회복, 스트레스: 25감소)
    cout<<pn<<","<<name<<" 잠자다."<<endl;
    SetHP(hp -+ 3);   
    SetStress(stress-25);
    SetScnt(0);
}
void Student::Drink()
{
    //음료를 마시다.(체력 5회복, 지력:  10감소 , 스트레스: 2증가)
    cout<<pn<<","<<name<<"음료마시다."<<endl;
    SetHP(hp + 5);
    SetIQ(iq - 10);
    SetStress(stress + 2);
    SetScnt(0);
}
void Student::Sing()
{
    //노래하다.(체력 10 소모, 지력: 5-scnt감소, 스트레스: 5-scnt증가)
    cout<<pn<<","<<name<<" 노래하다."<<endl;
    SetHP(hp - 10);
    SetIQ(iq - (5-scnt));
    SetStress(stress+(5-scnt));
    SetScnt(0);
}
string Student::GetName()const
{
    return name;
}
int Student::GetPN()const
{
    return pn;
}
int Student::GetIQ()const
{
    return iq;
}
int Student::GetHP()const
{
    return hp;
}
int Student::GetStress()const
{
    return stress;
}
void Student::SetIQ(int iq)
{
    if(iq>max_iq)
    {
        iq = max_iq;
    }
    if(iq<min_iq)
    {
        iq = min_iq;
    }
    this->iq = iq;
}
void Student::SetHP(int hp)
{
    if(hp>max_hp)
    {
        hp = max_hp;
    }
    if(hp<min_hp)
    {
        hp = min_hp;
    }
    this->hp = hp;
}
void Student::SetStress(int stress)
{
    if(stress>max_stress)
    {
        stress = max_stress;
    }
    if(stress<min_stress)
    {
        stress = min_stress;
    }
    this->stress = stress;
}
void Student::SetScnt(int scnt)
{
    if(scnt>max_scnt)
    {
        scnt = max_scnt;
    }
    if(scnt<min_scnt)
    {
        scnt = min_scnt;
    }
    this->scnt = scnt;
}
 
//Program.cpp
#include "Student.h"
#include <iostream>
using namespace std;
 
void ViewStuInfo(Student *stu);//학생 정보 출력
void TestPN();//순차적으로 주민 번호 부여 테스트
void TestStudy();//공부하다 테스트
void TestEtc();//나머지 테스트
int main()
{
    TestPN();//순차적으로 주민 번호 부여 테스트
    TestStudy();//공부하다 테스트
    TestEtc();//나머지 테스트
    return 0;
}
void ViewStuInfo(Student *stu)
{
    cout<<"주민 번호:"<<stu->GetPN()<<" 이름:"<<stu->GetName()<<endl;
    cout<<"지력:"<<stu->GetIQ()<<" 체력:"<<stu->GetHP()<<" 스트레스:"<<stu->GetStress()<<endl;
}
void TestPN()
{
    Student *stu;
    cout<<"10명의 학생 생성 후 소멸(순차적으로 주민 번호 부여 테스트)"<<endl;
    for(int i = 0; i<10;i++)
    {
        stu = new Student("테스트");
        ViewStuInfo(stu);
        delete stu;
    }
    cout<<endl;
}
void TestStudy()
{
    Student *stu = new Student("홍길동");
    ViewStuInfo(stu);
    cout<<"공부하다 8회 실시"<<endl;
    for(int i = 0; i<8;i++)
    {
        stu->Study();
        ViewStuInfo(stu);       
    }
    delete stu;
}
void TestEtc()
{
    Student *stu = new Student("홍길동");
    ViewStuInfo(stu);
    cout<<"공부하다 3회 실시"<<endl;
    for(int i = 0; i<3;i++)
    {
        stu->Study();
        ViewStuInfo(stu);       
    }
    cout<<"강의받다 3회 실시"<<endl;
    for(int i = 0; i<3;i++)
    {
        stu->ListenLecture();
        ViewStuInfo(stu);    
    }
    cout<<"공부하다 1회 실시"<<endl;
    stu->Study();
    ViewStuInfo(stu);
    //이하 생략
    delete stu;
}
 
실행 결과
10명의 학생 생성 후 소멸(순차적으로 주민 번호 부여 테스트)
주민 번호:1 이름:테스트
지력:100 체력:100 스트레스:0
주민 번호:2 이름:테스트
지력:100 체력:100 스트레스:0
주민 번호:3 이름:테스트
지력:100 체력:100 스트레스:0
주민 번호:4 이름:테스트
지력:100 체력:100 스트레스:0
주민 번호:5 이름:테스트
지력:100 체력:100 스트레스:0
주민 번호:6 이름:테스트
지력:100 체력:100 스트레스:0
주민 번호:7 이름:테스트
지력:100 체력:100 스트레스:0
주민 번호:8 이름:테스트
지력:100 체력:100 스트레스:0
주민 번호:9 이름:테스트
지력:100 체력:100 스트레스:0
주민 번호:10 이름:테스트
지력:100 체력:100 스트레스:0
 
주민 번호:11 이름:홍길동
지력:100 체력:100 스트레스:0
공부하다 8회 실시
11,홍길동 공부하다.
주민 번호:11 이름:홍길동
지력:100 체력:95 스트레스:0
11,홍길동 공부하다.
주민 번호:11 이름:홍길동
지력:101 체력:90 스트레스:0
11,홍길동 공부하다.
주민 번호:11 이름:홍길동
지력:103 체력:85 스트레스:0
11,홍길동 공부하다.
주민 번호:11 이름:홍길동
지력:106 체력:80 스트레스:0
11,홍길동 공부하다.
주민 번호:11 이름:홍길동
지력:110 체력:75 스트레스:0
11,홍길동 공부하다.
주민 번호:11 이름:홍길동
지력:115 체력:70 스트레스:0
11,홍길동 공부하다.
주민 번호:11 이름:홍길동
지력:120 체력:65 스트레스:0
11,홍길동 공부하다.
주민 번호:11 이름:홍길동
지력:125 체력:60 스트레스:0
주민 번호:12 이름:홍길동
지력:100 체력:100 스트레스:0
공부하다 3회 실시
12,홍길동 공부하다.
주민 번호:12 이름:홍길동
지력:100 체력:95 스트레스:0
12,홍길동 공부하다.
주민 번호:12 이름:홍길동
지력:101 체력:90 스트레스:0
12,홍길동 공부하다.
주민 번호:12 이름:홍길동
지력:103 체력:85 스트레스:0
강의받다 3회 실시
12,홍길동 강의받다.
주민 번호:12 이름:홍길동
지력:106 체력:82 스트레스:3
12,홍길동 강의받다.
주민 번호:12 이름:홍길동
지력:106 체력:79 스트레스:3
12,홍길동 강의받다.
주민 번호:12 이름:홍길동
지력:106 체력:76 스트레스:3
공부하다 1회 실시
12,홍길동 공부하다.
주민 번호:12 이름:홍길동
지력:106 체력:71 스트레스:1

반응형