조상(Car) 타입의 참조변수를 사용하면
변경에 더 유리하다.
(왼쪽 위 번째 상자는 변경 사항이 2개, 아래 상자는 변경 사항이 1개)
더 변경 사항을 줄이려면
별도의 메소드를 통해 객체를 생성한다.
메소드는 "기능"을 제공하고,
Car car = getCar(); 와 같이 "사용"하는 코드는 바뀌지 않는다.
Properties 클래스는 String,String 쌍으로 저장한다.
p.load와 같이 읽어오는 메소드를 사용할 때 편해서 사용한다.
config.txt처럼 key와 value가 한 줄씩 적혀있으면
읽어와서 Map처럼 등록이 가능하다.
만약 Truck으로 바꾼다면,
config.txt파일만 바꾸면 되고
코드는 전혀 변경하지 않아도 된다.
컴파일이나 테스트를 하지 않아도 된다.
프로그램의 변경이 가장 적어야 좋다.
(변경에 유리하다)
분리
1. 변하는 것 / 변하지 않는 것
2. 관심사
3. 중복코드
package com.fastcampus.ch3.diCopy1;
import java.io.FileReader;
import java.util.Properties;
import static java.lang.Class.forName;
class Car{}
class SportsCar extends Car{}
class Truck extends Car{}
public class Main1 {
public static void main(String[] args) throws Exception {
Car car = getCar();
System.out.println("car = " + car);
}
static Car getCar() throws Exception{
Properties p = new Properties();
p.load(new FileReader("config.txt"));
Class clazz = Class.forName(p.getProperty("car"));
return (Car)clazz.newInstance();
}
}
config.txt
car=com.fastcampus.ch3.diCopy1.Truck
실행 결과
config.txt
car=com.fastcampus.ch3.diCopy1.Truck
실행 결과
이번엔
Object 타입으로 getObject 메소드로 바꾸면,
Class clazz = Class.forName(p.getProperty("car"));
이 코드 또한
변경이 필요없어진다.
package com.fastcampus.ch3.diCopy1;
import java.io.FileReader;
import java.util.Properties;
import static java.lang.Class.forName;
class Car{}
class SportsCar extends Car{}
class Truck extends Car{}
class Engine{}
public class Main1 {
public static void main(String[] args) throws Exception {
Car car = (Car)getObject("car");
Engine engine = (Engine) getObject("engine");
System.out.println("car = " + car);
System.out.println("engine = " + engine);
}
static Object getObject(String key) throws Exception{
Properties p = new Properties();
p.load(new FileReader("config.txt"));
Class clazz = Class.forName(p.getProperty(key)); //key를 이용해서 클래스의 정보를 얻어오고
return clazz.newInstance(); //그것의 객체를 생성해서 반환한다.
}
static Car getCar() throws Exception{
Properties p = new Properties();
p.load(new FileReader("config.txt"));
Class clazz = Class.forName(p.getProperty("car"));
return (Car)clazz.newInstance();
}
}
config.txt
car=com.fastcampus.ch3.diCopy1.SportsCar
engine=com.fastcampus.ch3.diCopy1.Engine
실행 결과
결론 :
config파일을 읽어와서 객체를 만드는 코드였고,
코드 변경이 필요하지 않도록 코드를 바꾸었다!
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
패스트캠퍼스 [직장인 실무교육]
프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.
fastcampus.co.kr
'패캠 챌린지' 카테고리의 다른 글
패스트캠퍼스 챌린지 - 29일차 [스프링의 정석:남궁성과 끝까지 간다] (0) | 2023.03.20 |
---|---|
패스트캠퍼스 챌린지 - 28일차 [스프링의 정석:남궁성과 끝까지 간다] (0) | 2023.03.19 |
패스트캠퍼스 챌린지 - 26일차 : STS3의 프로젝트 import/export (0) | 2023.03.17 |
패스트캠퍼스 챌린지 - 25일차 [스프링의 정석:남궁성과 끝까지 간다] (0) | 2023.03.16 |
패스트캠퍼스 챌린지 - 24일차 [스프링의 정석:남궁성과 끝까지 간다] (0) | 2023.03.15 |