Back-End/Java

[ JAVA ] 클래스간의 관계 1) has-a, DI(Dependency Injection)

oahee 2023. 8. 2. 10:01

클래스에서 다른 클래스를 사용할 때, 초기화를 해주지 않으면 NullPointException이 발생한다.

클래스는 참조변수로 초기화를 하지 않으면 null로 자동 초기화되기 때문이다.

 

NullPointException를 해결하기 위한 초기화 방법에는 3가지가 있다.

[1] 명시적 초기화

[2] 생성자 초기화

[3] 인스턴스 초기화

 

하지만 위 3가지 방법은 클래스 내에서 초기화를 하기 때문에 결합력이 높다는 단점을 가지고 있다.

결합력을 낮추기 위해 has-a, is-a(상속)를 사용해야한다.

 

1. has-a

의존성 주입 DI(Dependency Inejction)

아래 예를 들어보자.

Car클래스 외부에서 engein객체를 생성해서 Car 객체에 매개변수로 넘겨주면 해결된다.

      1) 생성자를 통한 DI

      2) setter 를 통한 DI

package days14;

public class Ex12 {
	public static void main(String[] args) {
		// [ 클래스들간의 관계 ]
		// 1. has-a 관계
		//		2개의 클래스 선언
		//		Car	  클래스
		//		Engine 클래스 - 연료, 구동장치
		//		Car  has-a  Engine
        
		Engine engine = new Engine();
		// DI 2가지 방법
		// 1) 생성자 통해서 DI
		Car myCar = new Car(engine);	// 의존성 주입(Dependency Injection)
		// 2) setter 통해서 DI
		myCar.setEngine(engine);
		
		
		myCar.speedUp(100);
		System.out.println( myCar.getEngine() );
		
		myCar.speedDown(10);
		System.out.println( myCar.getEngine() );
		
		myCar.stop();
		System.out.println( myCar.getEngine() );
		
		System.out.println("  end  ");
	} //main
} //class
package days14;
// Ex12
public class Car {
	// 필드
	String name;
	String gearType;	// 수동, 자동
	int door;
    
	// 엔진 필요 
	// [1]~[3] 단점 : 결합력이 높다.
	// [1] 명시적 초기화
	// Engine engine = new Engine();	
	private Engine engine;

	{
		// [3] 인스턴스 초기화
		// this.engine = new Engine();
	}

	
	// 생성자
	Car() {
		// [2] 생성자 초기화
		// this.engine = new Engine();
	}
	
	Car(Engine engine) {
		this.engine = engine;
	}

	
	// 메서드
	public int getEngine() {
		return engine.speed;
	}

	public void setEngine(Engine engine) {
		this.engine = engine;
	}
	
	void speedUp(int fuel) {
		this.engine.moreFuel(fuel);
	}

	void speedDown(int fuel) {
		this.engine.lessFuel(fuel);
	}

	void stop() {
		this.engine.stop();
	}

} //class
package days14;

public class Engine {
	// 필드
	int speed;
	
	//메서드
	void moreFuel(int fuel) {
		this.speed += fuel*0.05;
	} //moreFuel

	void lessFuel(int fuel) {
		this.speed -= fuel*0.05;
	} //lessFuel

	void stop() {
		this.speed =0;
	} //stop
	
} //class