클래스에서 다른 클래스를 사용할 때, 초기화를 해주지 않으면 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
'Back-End > Java' 카테고리의 다른 글
| [ JAVA ] Date, Calendar (0) | 2023.08.15 |
|---|---|
| [ JAVA ] Date to Calendar / Calendar to Date (0) | 2023.08.13 |
| [ JAVA ] 메서드(함수) (0) | 2023.07.23 |
| [ JAVA ] 가변인자 (0) | 2023.07.23 |
| [ JAVA ] 정규표현식 - (예) 주민등록번호, 우편번호, 국어점수 (0) | 2023.07.23 |