기존의 상속 관계는 Is 관계이지만,
Has관계 (포함관계)를 말한다. == 서로 소유되는 관계
함수 내에 사용할 클래스의 필드속성으로 개체를 선언한다.
이후 초기화를 통해 사용할 함수를 사용한다.
클래스 A
가 클래스 B
를 포함한다는 것은 클래스 A
가 클래스 B
의 인스턴스를 멤버 변수로 가지고 있음을 의미합니다.
이러한 관계에서 클래스 A
는 클래스 B
에 종속되어 있으며, 클래스 A
의 인스턴스가 생성되거나 소멸될 때 클래스 B
의 인스턴스도 함께 생성되거나 소멸될 수 있습니다.
BB가 AA의 클래스를 Has-A 관계로 받아서 AA의 함수를 사용할 수 있게된다.
BB 타입으로 객체를 선언하여 Print를 사용할 경우에, AA의 Print함수를 쓰게 된다.
Has-A 관계를 이용해 매니저 클래스를 쉽게 관리할 수 있게된다.
class Engine
{
public void Start()
{
Console.WriteLine("Engine started.");
}
public void Stop()
{
Console.WriteLine("Engine stopped.");
}
}
class Car
{
private Engine engine; // Engine 클래스를 멤버 변수로 가짐
public Car()
{
engine = new Engine(); // Car 인스턴스가 생성될 때 Engine 인스턴스도 함께 생성됨
}
public void StartCar()
{
engine.Start(); // Engine 인스턴스의 Start 메서드 호출
}
public void StopCar()
{
engine.Stop(); // Engine 인스턴스의 Stop 메서드 호출
}
}
class Program
{
static void Main()
{
Car car = new Car(); // Car 인스턴스 생성
car.StartCar(); // Car 인스턴스의 StartCar 메서드 호출
car.StopCar(); // Car 인스턴스의 StopCar 메서드 호출
}
}
위 코드에서 Car 클래스는 Engine 클래스를 포함(Has 관계)하고 있다.
Car 클래스의 인스턴스가 생성될 때 Engine 클래스의 인스턴스도 함께 생성되며, Car 클래스의 메서드는 Engine 객체의 메서드를 호출하여 자동차를 조작한다.
이렇게 함으로써 Car 클래스와 Engine 클래스 간에 강한 관계를 형성하고, Car 클래스의 동작에 Engine 객체가 필요한 것을 나타낸다.
Has-A 관계는, 약결합과 강결합 두 가지 모두 구현할 수 있다.
약결합(Aggregation)
의 경우, 클래스 A가 클래스 B를 포함하지만 클래스 B의 인스턴스가 독립적으로 존재하는 것이다.
강결합(Composition)
의 경우, 클래스 A가 클래스 B를 포함하면서 클래스 B의 인스턴스는 클래스 A의 인스턴스와 함께 생성되며, 클래스 A의 인스턴스가 소멸될 때 클래스 B의 인스턴스도 함께 소멸하는 것 이다.
① 클래스 객체의 포함 관계(소유관계) - 느슨한 결합
-클래스가 다른 클래스의 객체를 포함
-객체를 관리하는 매니저클래스
로 다른 클래스 객체를 소유해서 관리 및 접근할 수 있음.
-상속관계와 다르게 클래스가 다른 클래스를 소유
하는 관계(캐릭터->무기를 소유)
⑴포함클래스를 배열로 선언할 수 도있다.
⑵객체를 저장할 수 있는 배열
을 선언하여, 코드 간편화 가능.
ㄴ매개변수로 객체를 받아서 클래스를 구동하지 않고, 클래스
자체를 상속
받아서, 여러 개의 객체들(ex: 몬스터들, 캐릭터들) 하나의 클래스로 묶어서 관리 가능.
② 포함된 객체의 메서드를 호출할 수 있지만, 포함하는 객체가 가상함수나 추상함수를 구현하지 않아도 된다.
반면에 상속 관계인 경우에는 부모 클래스가 가상함수나 추상함수를 선언하면 자식 클래스에서 이를 구현해야 한다.
③ Has-A 관계에서는 포함된 객체의 메서드를 호출하는 것이 주요한 목적이다.