학교 수업으로 C++ Class Relationships 를 배우는 도중 헷갈리는 부분이 있어서 정리하려고 한다.
1 ) Inheritance
2 ) Association (=is related to)
2-1 ) Aggregation
Aggregation은 한국어로 "집합"이다.
인터넷에 찾아보니,
A 클라스와 a 클라스가 있다고 가정했을 때, a 클라스를 타입으로 하는 객체가 A 클라스의 멤버 변수로 사용이 될때, A클라스의 생성과 함께 a클라스가 생성되지 않는 케이스를 지칭한다.
따라서, 객체의 생성과 소멸이 A클라스의 생성과 소멸의 영향을 받지 않는다.
#include "person.h"
int main() {
Date date1(5, 6, 1983);
Person person1(111111456, date1);
person1.print();
return 0;
}
위의 코드에서 처럼, Date 클라스가 Person클라스의 생성과 소멸에 의해 영향을 받지 않고 lifetime이 독립적으로 이어진다.
2-2 ) Composition
반면, Composition은 lifetime이 종속적으로 이어지는 것이다.
한국어로는 Composition을 구성이라고 한다.
코드로 보면 아래와 같다.
#include "employee.h"
int main() {
Employee employee1("Mary", "B", "White", 2212000.00);
Employee employee2("William", "S", "Black", 4670880.00);
Employee employee3("Ryan", "A", "Brown", 1233500.00);
employee1.print();
employee2.print();
employee3.print();
return 0;
}
위 코드에서는 Name 클라스의 생성과 소멸 (lifetime)이 Employee클라스의 생성과 소멸(lifetime)에 종속되어 파일이 실행된다. 따라서, 위 코드에서는 Aggregation에서의 코드 예시와 다르게 Name 클라스 객체를 별도의 코드로 정의하지 않고, Employee 객체의 멤버변수에서 정의한다.
2-3 ) 정리
처음에 Aggregation 과 Composition 의 한국어 뜻의 차이만 봤을 때, '집합'과 '구성'이 같은 것 아닌가 라는 생각만 들었다.
하지만 lifetime 과 관련된 차이를 알고나니, 명칭을 비로소 이해할 수 있었던 것 같다.
3 ) Dependency
Dependency는 Inheritance와 Association 관계보다 상대적으로 약한 관계이다. 그래서 dependecy 관계를 "uses" 관계라고 부른다.
dependency는 아래 세가지 경우에 성립한다고 볼 수 있다.
- Class A uses an object of type B as a parameter in a member function. (클라스 A에서 클라스 B의 객체를 멤버 함수의 파라미터로 쓰는 경우)
- Class A has a member function that returns an object of type B. (클라스 A에서의 멤버 함수가 클라스 B의 객체를 반환하는 경우)
- Class A has a member function that has a local variable of type B.**
위 세가지 중 1,2번째는 이해가 직관적으로 되었는데,
3번째는 이해가 잘 안 되어서 설명을 찾아보았다.
한마디로 클라스 A가 가진 멤버 함수가 클라스 B를 함수 내부에서 지역변수로 쓰는 경우이다.
4 ) +++ UML Diagrams
Uml Diagram은 통합 모델링 언어를 사용하여, 프로그램을 단순화 시켜 표현하여 의사소통과 로드맵 전달을 용이하게 하는 역할을 한다. 앞서 보았던, aggregation, composition,dependency 각각의 uml class diagram은 아래와 같다.
위에서 dependency uml 의 경우, class client 가 class provider를 사용한다는 뜻이고, class client가 class B에 의존한다는 의미를 가진다.
'2023 1학기 > c++' 카테고리의 다른 글
[c++] virtual 함수가 필요한 이유 (0) | 2023.04.15 |
---|---|
[c++] string 함수들 (0) | 2023.04.14 |
[c++]파일 입출력 c++ fstream, ofstream 사용 (0) | 2023.03.26 |
[c++] #ifndef #define #endif #pragma once (0) | 2023.03.26 |
[개정 열혈 c++] p.26 문제01-2 <함수 오버로딩> (0) | 2023.03.13 |