1. 변경에 유리한 코드(1) - 다형성, 추상화, factory method
class Car {}
class SportsCar extends Car {}
class Truck extends Car {}
SportsCar car = new SportsCar();
=>
Truck car = new Truck();
--> SportsCar() 클래스를 다른 클래스로 바꿀 때 두 군데를 고쳐야한다.
Car car = new SportsCar();
=>
Car car = new Truck();
--> 코드를 이렇게 적으면 한 군데만 고치면 된다. (변경에 더 유리한 코드)
- 더 변경에 유리한 코드로 만드려면, 메소드로 작성
Car car = getCar();
static Car getCar() {
return new SportsCar();
}
static Car getCar() {
return new Truck();
}
변경 포인트가 SportsCar() 한군데이고, 만약 다른 클래스의 객체를 사용하고 싶으면 Truck()부분을 바꾸면 된다.
Car car = getCar(); 처럼 사용하는 쪽은 여러 번 사용될 수 있지만, 제공하는 곳은 한군데만 고치면 되니까
사용하는 곳이 여러군데 있다고 했을 때 이전 코드보다 이렇게 메소드를 이용해서 객체를 반환하는 쪽이 훨씬 더
변경 포인트가 적어 유리하다.
1. 변경에 유리한 코드(2) - Map과 외부 파일
[config.txt]
car=com.fastcampus.ch3.SportsCar
engine=com.fastcampus.ch3.Engine
Car car = (Car) getObject("car");
Engine engine = (Engine) getObject("engine");
static Object getObject(String key) throws Exception {
// config.txt를 읽어서 Properties에 저장
Properties p = new Properties();
p.load(new FileReader("config.txt"));
// 클래스 객체(설계도)를 얻어서
Class clazz = Class.forName(p.getProperty(key));
return clazz.newInstance(); // 객체를 생성해서 반환
}
Properties객체는 Map처럼 데이터를 Key, Value형태로 저장하며, Map과 달리 (String, String) 형태로 저장한다.
| Key | Value |
| "car" | "com.fastcampus.ch3.SportsCar" |
| "engine" | "com.fastcampus.ch3.Engine" |
직접 new SportsCar()라고 적는건 하드코딩인데 이걸 안하고, Properties 객체에 우리가 생성할 객체의 클래스 정보를
저장한 다음 그걸 읽어서 동적으로 처리한다.
car=com.fastcampus.ch3.Truck
engine=com.fastcampus.ch3.TurboEngine
나중에 이걸 이렇게 바꿔서 사용할수도 있다.
| Key | Value |
| "car" | "com.fastcampus.ch3.Truck" |
| "engine" | "com.fastcampus.ch3.TurboEngine" |
적용이 되면 이런식으로 바뀜!
<실습>
- 새로운 프로젝트 생성


설정 후 생성해준다.
- di1패키지를 생성해서 Main 클래스 생성
package com.fastcampus.ch3.di1;
class Car {}
class SportsCar extends Car {}
class Truck extends Car {}
public class Main {
public static void main(String[] args) {
Car car = new Truck();
car = getCar();
System.out.println("car = " + car);
}
static Car getCar() {
return new Truck(); // getCar(); 를 호출하는 부분이 많아도 여기만 수정하면 된다.
}
}
- 다양한 객체를 반환할 수 있도록 수정해보자.
- config.txt 파일 생성
car=com.fastcampus.ch3.di1.SportsCar
engine=com.fastcampus.ch3.di1.Engine
engine=com.fastcampus.ch3.di1.Door
'SpringBoot' 카테고리의 다른 글
| ch3 03. Spring DI의 원리(2) (0) | 2023.07.29 |
|---|---|
| ch3 02. Java Reflection API (0) | 2023.07.19 |
| ch2 16. thymeleaf 사용하기 (0) | 2023.07.18 |
| ch2 15. forward와 redirect - 실습 (0) | 2023.07.14 |
| ch2 14. forward와 redirect - 이론 (0) | 2023.07.14 |