Java

Java( 포함관계, 연관, 의존관계)

yoooon1212 2024. 4. 24. 16:41

 

<포함관계(Composition)>

상속처럼 클래스를 재사용할 수 있는 방법

한 클래스가 다른 클래스를 포함하는 관계(하나의 객체가 다른 객체 없이는 의미가 없을 때  사용)

 

한 클래스가 다른 클래스를 자신의 필드(멤버변수)로서 포함하는 것

( = 클래스의 멤버로 다른 클래스 자료형의 참조 변수를 선언하는 것)

has-a 관계로 알려져 있으며 객체 간의 강한 연관성을 나타냄

포함관계 특징
  • 포함된 객체는 포함하는 객체 안에서만 존재하며, 포함하는 객체가 파괴되면 포함된 객체도 함께 파괴됨.
  • 이 관계는 객체 간의 강한 의존성을 특징으로 하며, 소유하는 객체가 완전한 책임을 가짐.
  • 포함관계는 연관관계보다 더 강한 연결을 의미함.

 

 

자동차와 엔진, 컴퓨터와 CPU를 예시로 들 수 있음

 

예시

Engine 클래스 생성

public class Engine {

 

String name;

int price;

 

void start() {

System.out.println("엔진이 시작됩니다");

}

void stop() {

System.out.println("엔진이 멈춥니다");

}

 

}

 

Car 클래스 생성

public class Car{

 

String name;

int price;

Engine engine; // 엔진 클래스를 자신의 필드(멤버변수)로 포함시킴

// 객체 안에 필요한 객체를 직접 생성함 => 포함관계

 

public Car() {  

engine = new Engine(); // 동작하기 위해 초기화 과정을 해야 함.

}

 

public void startCar() {

engine.strat();

System.out.println("자동차가 출발 합니다.");

}

 

public void stopCar() {

engine.stop();

System.out.println("자동차가 멈춥니다.");

}

 

Engine 클래스를 car 클래스의 필드(멤버변수)로 포함시킴

객체 안에 직접 객체를 생성함.

Null 오류가 뜨는 이유 : 객체를 생성하지 않았거나 변수의 객체의 주소값을 넣지 않았을때

 

Car라는 객체가 생성이 될 때 엔진 객체도 함께 생성이 된다. 자동차(부모)가 생성이 되어야 엔진(자식)이 생성된다. 

 

테스트 파일 생성

public class CarMainTest {

 

public static void main(String[] args) {

Car car1 = new Car();

car1.startCar();

 

// 외부에서 엔진의 이름을 지정하고 싶다면?  => 엔진의 속성인 name 변수의 값을 초기화해보자.

car1.engine.name = "V8"; //참조타입 - . 연산자로 접근 // 엔진의 이름

car1.engine.price = 4000; //엔진의 가격

 

System.out.println(car1.engine.name);

System.out.println(car1.engine.price);

}

 

먼저 car 객체를 생성하였고, 

car.startCar() 출력 시 엔진이 시작됩니다가 출력된다.

이유는 car1 변수의 Car 클래스의 객체에 접근하여 startCar를 호출하였고, startCar 메서드 내에서는 Car 클래스의 기본 생성자에서 생성되었던  engine 객체가 생성되어 . 연산자를 통해 객체에 접근하였고,  Engine 클래스의 start 메서드가 출력되었기 때문이다. 

 

car1 변수에서 . 연산자를 통해 객체에 접근하여 멤버변수인 engine을 통해  Engine 클래스의 속성인 name에 접근하여

V8이 출력된다. 

 

 

연관관계

한 클래스의 객체가 다른 클래스의 객체와 상호작용을 하지만,

둘 사이의 생명주기에 대한 의존성은 갖지 않은 경우를 의미함.

 

연관관계와 포함관계는 객체지향 프로그래밍에서 객체 간의 관계를 나타내는 다른 개념이다.

모든 포함관계는 연관관계 이지만, 모든 연관관계가 포함관계는 아니다.(포함관계는 연관관계의 특수한 형태임)

 

예시로 한 은행과 여러 고객 사이의 관계(고객은 하나의 은행에 계좌를 갖고, 은행은 여러 고객을 갖지만 고객의 생명주기는 은행에 의존하지 않음.)

 

enum - 열거형으로 Bank 기능 생성

 

 

 

 

 

의존관계

한 클래스가 다른 클래스를 사용하는 관계

즉, 어떤 클래스가 다른 클래스를 참조하는 것을 말함.

 

자동차 클래스가 엔진 클래스에 의존할 때 자동차 클래스는 엔진을 사용하고 있으며 엔진 클래스의 변경이 자동차 클래스에 영향을 줄 수 있다.

 

학생과 학급을 예로 들 수 있다.