카테고리 없음

[Practice 07] Functions that support OPP

2wnswoo 2025. 2. 9. 01:02

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++언어에서는 메모리를 해제하는 후처리가 중요한데, 메모리 해제는 보통 소멸자에서 수행한다. 하지만, 의도한 대로 소멸자가 호출되지 않는다면 문제가 발생할 수 있다.

  • 소멸자는 함수 이름 앞에 ~ 를 붙여서 정의한다.
  • 소멸자는 "마지막 정리" 역할 수행, 잔여 메모리나 자원들을 정리하는 것

주요 차이점

  1. 표기법:
    • 일반 소멸자: 클래스 이름 앞에 **~*만 붙여서 정의.
    • 가상 소멸자: 클래스 이름 앞에 **~*을 붙이고, virtual 키워드를 추가.
  2. 기능적인 차이:
    • 일반 소멸자는 다형성( 상속 관계 )에서 부모 클래스의 포인터로 자식 클래스 객체를 삭제할 때, 자식 클래스의 소멸자가 호출되지 않습니다.
    • 가상 소멸자는 다형성에서 부모 클래스 포인터로 자식 클래스 객체를 삭제할 때, 자식 클래스의 소멸자가 정확히 호출되어 자식 클래스에서 동적으로 할당한 자원까지 잘 정리됩니다.

03. 추상 클래스와 정적 멤버

  • 추상 클래스는, 완전하지 않은 클래스 +