티스토리 뷰
반응형
* 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 |
댓글
공지사항