01. 컴포지션과 어그리게이션
- 컴포지션과 어그리게이션 둘 다 “부분과 전체”의 관계이다.
- 컴포지션은 쉽게 비유하자면 자동차와 부품 관계. 전체인 자동차가 없어지면 부품도 없어지므로, 전체가 없으면 부분도 존재할 수 없는 관계이다.
- 어그리게이션은 학급과 학생 관계를 의미한다. 학급이 없어져도 부분에 해당하는 학생은 독립적으로 존재 가능하므로
💡 컴포지션과 어그리게이션의 가장 큰 차이점:
- 컴포지션 → 포함된 객체(B)는 부모(A)가 없으면 자식이 존재할 수 없음!
- 어그리게이션 → 포함된 객체(B)는 부모(A)가 없어도 따로 자식이 존재할 수 있음!
—
*다중 상속 ( multi inheritance ) : 한 개의 자식 클래스가 두 개 이상의 부모 클래스를 상속받는 것을 의미한다.
—
is-a 관계 vs has-a 관계
1️⃣ is-a 관계 ( 상속, Inheritance )
- “A는 B이다”라는 관계, Ex) “사과는 과일이다”
- 상속( public 또는 protected 상속 )을 사용해서 표현
2️⃣ has-a 관계 ( 컴포지션, Composition )
- “A는 B를 가지고 있다” 라는 관계, Ex) “자동차는 엔진을 갖고 있다.”
- 클래스 안에 다른 클래스의 객체를 멤버 변수로 포함
02. 가상 함수와 동적 바이딩
가상 함수( Virtual function )
C++의 클래스에서 오버라이딩( 재정의 ) 해야 하는 함수는 가상 함수( virtual function )로 선언해야 한다.
가상 함수 사용 방법은 간단하다. virtual 키워드를 멤버 함수를 선언할 때 앞 부분에 붙이기만 하면 된다.
*업캐스팅( upcasting ) : 자식 클래스를 부모 클래스 형식으로 변환하는 것.
가상 소멸자( Virtual destructor )
특히 C++언어에서는 메모리를 해제하는 후처리가 중요한데, 메모리 해제는 보통 소멸자에서 수행한다. 하지만, 의도한 대로 소멸자가 호출되지 않는다면 문제가 발생할 수 있다.
- 소멸자는 함수 이름 앞에 ~ 를 붙여서 정의한다.
- 소멸자는 "마지막 정리" 역할 수행, 잔여 메모리나 자원들을 정리하는 것
주요 차이점
- 표기법:
- 일반 소멸자: 클래스 이름 앞에 **~*만 붙여서 정의.
- 가상 소멸자: 클래스 이름 앞에 **~*을 붙이고, virtual 키워드를 추가.
- 기능적인 차이:
- 일반 소멸자는 다형성( 상속 관계 )에서 부모 클래스의 포인터로 자식 클래스 객체를 삭제할 때, 자식 클래스의 소멸자가 호출되지 않습니다.
- 가상 소멸자는 다형성에서 부모 클래스 포인터로 자식 클래스 객체를 삭제할 때, 자식 클래스의 소멸자가 정확히 호출되어 자식 클래스에서 동적으로 할당한 자원까지 잘 정리됩니다.
03. 추상 클래스와 정적 멤버
- 추상 클래스는, 완전하지 않은 클래스 +