티스토리 뷰

반응형

* has ~ a 관계

외부 에서 입력한 데이터를 데이터_관리_class를 통해 데이터_class에 넘기고 받을 수 있으며 다른 객체를 멤버로 선언한 관계이다. 이때 데이터_class는 입력된 데이터만 관리하며 외부에서 접근 할수 없는 구조로 되어 있다. 데이터_class는 오직 데이터_관리_class를 통해서만 전달받고 전송 할수 있는 구조이다. 따라서 데이터_class는 캡슐같은 구조로 외부로부터 데이터를 은닉, 보호 하고 있으며 외부에서는 데이터_class가 있는지 조차 알 수 없다.

has ~ a 관계를 만들기위해선 조건이 있는데, 데이터_관리_class가 데이터_class를 연결하려면 데이터_class 타입의 객체가 반드시 존재해야 한다.

has ~a 관계의 장점은 데이터를 은닉, 보호할 수 있고 필요한 기능만 골라서 가져와 쓸 수 있다.

 

 

 

 

 

 

* 위 사진을 이용해 has~a 관계를 알아보자. 데이터 입력, 출력을 할 수 있는 외부에서 데이터 class로 접근하려면 오직 데이터 관리 class를 거쳐야 할 수 밖에 없다. 바로 건너뛰어 데이터 class로 이동 할 수 없다는 뜻이다. 데이터 관리 class는 데이터 class와 입,출력할 수 있는 외부를 연결하고 있는 구조이다.

 

 

 

 

 

* 코드를 통해 has ~ a 관계를 이해해 보자

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include <iostream>
#include <iomanip>
#include <string>
using namespace std;
 
/*
1. has a (data 와 달리  class) : 포함 오브젝트, ~는 ~를 가지고 있다. 
    필요할때 필요한 것만 가져올수 있다. 관계된 class 객체를 이용해 필요한 데이터를 가져올 수 있다.
2. is a :  ~는 ~이다. 상속구조.
*/
 
class A {
    string name;
 
public:
    A() {
    
        cout << "A생성자" << endl;
    }
 
    A(string name) {
        this->name = name;
        cout << "A생성자" << endl;
    }
    
    void setName(string name) {
        this->name = name;
 
    }
    string getName() const{
    
        return name;
    }
};
class B {
    //private 공간
    A aa;//포함 오브젝트//A 클레스의 모든것을 aa가 쓰겠다
    //다른 객체를 멤버로 선언한 것을 has a 관계라한다
    int age;
public:
 
    /*B(string name, int age) {
        this->age = age;
    }*/
 
    //B의 생성자는 name 데이터를 처리할 기능이 없기 때문에
    //const를 이용해 name을 A class로 보내야 한다.
    B(string name,int age):aa(name) {
        this->age = age;
        cout << "B생성자" << endl;
    }
    void setAge(int age) {
        this->age = age;
        
    }
    int getAge() const {
 
        return age;
    }
    void setName(string name) {
        aa.setName(name);
    }
    string getName() const{
        return aa.getName();
    }
};
void main() {
    /*A aa;
    aa.setName("superman");
    cout << aa.getName() << endl;
    */
 
    //has a 상속
    //main에서는 B 클래스에서 A클래스가 있는지 모르기때문에
    //B를 통해서 A한테 가야한다.
    //때문에 B를 통해 A로 들어가면 B는 A가 있는걸 알기 때문에
    //A에게 값을 넘겨줄수있다.
 
    //bb.aa.setName("superman");//오류 코드. main에서는 bb에 aa가 있는지 모르기 때문
 
    B bb("superman",1000);//객체 선언과 동시에 인자를 넣으면 생성자로 간다.    
    //bb.setName("superman");//이름입력
    //bb.setAge(10);    //나이입력
    cout<<bb.getName()<<endl;    //이름출력
    cout<<bb.getAge()<<endl;    //나이출력
 
}
cs

 

 

 

 

* has ~ a 관계를 이해했으면 사람수 제한 없는 성적프로그램으로 응용해 보자

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include <iostream>
#include <iomanip>
#include <string>
using namespace std;
 
//이름 데이터 관리 class
class Name {
    string name;
public:
    //이름 값을 받아서 넣어줌
    void setName(string name) {this->name = name;}
 
    string getName() {return name;}
 
};
 
//과목 데이터 관리 class
class Subject {
    int sco;
public:
    //과목 값을 받아서 넣어줌
    void setSubject(int sco) {this->sco = sco;}
 
    int getSubject() {return sco;}
    
};
 
//성적 관리 class
class Sco {
    //Subject class 상속
    Subject kor;
    Subject eng;
    Subject mat;
    Name na;
    
    int total;//성적 총합
    float avg;//성적 평균
 
public:
 
    void setname(string name) { na.setName(name); }
    void setkor(int sco) { kor.setSubject(sco); }
    void setmat(int sco) { mat.setSubject(sco); }
    void seteng(int sco) { eng.setSubject(sco); }
    void settotal(int total) { this->total = total; }
    void setavg(float avg) { this->avg = avg; }
 
    string getname() { return na.getName(); }
    int getkor() { return kor.getSubject(); }
    int getmat() { return mat.getSubject(); }
    int geteng() { return eng.getSubject(); }
    int gettotal() {
        return kor.getSubject() + mat.getSubject() + eng.getSubject();
    }
    float getavg() { return gettotal() / 3.f; }
 
    //출력
    void output(int num, Sco *sc) {
        for (int i = 0; i < num; i++)
        {    cout<<sc[i].getname()<<endl;
            cout << sc[i].getkor() << endl;
            cout << sc[i].getmat() << endl;
            cout << sc[i].geteng() << endl;
            cout << sc[i].gettotal() << endl;
            cout << sc[i].getavg() << endl
        }
    }
};
 
void main() {
        string sname;//
        int skor, smat, seng;//국어,수학,영어
        Sco *sc, sco;
 
        int num;
 
        cout << "몇명 입력할 거야?" << endl;
        cin >> num;
 
        sc = new Sco[num];//메모리 할당
 
        //입력
        for (int i = 0; i < num; i++)
        {
            cout << "이름을 입력하세요" << endl;
            cin >> sname;
            sc[i].setname(sname);
 
            cout << "국어를 입력하세요" << endl;
            cin >> skor;
            sc[i].setkor(skor);
            cout << "수학를 입력하세요" << endl;
            cin >> smat;
            sc[i].setmat(smat);
            cout << "영어을 입력하세요" << endl;
            cin >> seng;
            sc[i].seteng(seng);
            cout << "---------------------" << endl;
 
        }
        //출력
        sco.output(num, sc);//사람수, 데이터 주소 
 
        //메모리 할당 해제
        delete[]sc;
    }
 
cs

 

 

반응형

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

[c++]상속 및 has~a관계를 이용한 급여관리프로그램  (0) 2018.03.12
[c++] 상속  (0) 2018.03.09
[c++]const  (0) 2018.03.08
[c++]소멸자함수  (2) 2018.03.07
[c++]복사생성자  (0) 2018.03.07
댓글
공지사항