1. 변경에 유리한 코드(1) - 다형성, factory method
SportsCar에서 Truck로 변경하면 2번 고쳐써야 하지만 다형성에 의해 조상 타입의 참조변수로 바꾸면 변경 포인트가 1개로 줄어든다.
왼쪽 코드를 오른쪽으로 바꾸면 static Car getCar()는 기능을 제공하고 Car car = getCar();는 이 기능을 사용한다. 기능 제공 코드는 1개이지만 사용 코드는 n개가 될 수 있다. 왼쪽을 보면 사용하는 코드를 모두 바꿔야 하지만 오른쪽은 사용하는 코드는 바꾸지 않아도 된다. 사용하는 코드를 바꾸는게 아니라 기능을 제공하는 코드에서 SportsCar()를 Truck()으로 바꾸면 변경 포인트가 줄어든다.
Properties는 config.txt파일을 읽어서 객체를 생성한다. Properties는 (String, String) 한 쌍으로 되어 있어서 Map (Object, Object)와 비슷하다. Properties는 String에만 차이가 있지 Map과 같다. Properties를 사용하는 이유는 p.load 메서드가 파일에서 데이터를 읽고 저장하기 편리하다.
config.txt에 클래스 정보인 'car=com.fastcampus.ch3.SportsCar'가 적혀있다고 하면 car는 key이고 com.fastcampus.ch3.SportsCar는 value이다. new Properties() 객체가 생성되면 key, value를 저장할 공간이 생긴다. key, value 타입은 String이다.
p.load로 파일을 로드하면 key, value값이 위와같이 저장된다. DispatcherServlet.properties 파일에 스프링의 기본 전략이 있는데 txt파일 처럼 등호 표시를 기준으로 key와 value가 저장되어 있다. Truck이 아니라 SportsCar로 변경하면 코드는 변경하지 않고 config.txt 파일만 변경하면 된다. 코드를 변경하지 않는 건 큰 장점이다. 프로그램을 변경하지 않으면 컴파일, 테스트 등 해야할 동작이 준다. OOP의 장점이 변경에 유리하다는 점인데 단순히 자바로 작성하는게 아니라 이런 식으로 점차 방법을 찾아야 한다.
Spring은 txt말고 xml, java 코드를 이용해서 정보를 제공하면 이 정보를 갖고 프로그램을 동작 시킨다.
분리에는 1. 변하는 것, 변하지 않는 것 분리, 2. 관심사의 분리, 3. 중복 코드 분리 가 있다. 지금은 변하는 것을 분리시킨 것이다.
실습
'com.fastcampus.ch2'에 diCopy1 package를 만들고 Main1 클래스를 만든다. psvm을 입력하면 mian 메서드 자동 완성된다. 위 처럼 객체를 생성하면 변경하기 좋지 않다. getCar()메서드를 만든다.
clazz.Instance()객체는 Object 타입으로 Car로 형변환 해야한다.
ch3프로젝트에 config.txt 파일을 만든다. car는 key이고 com.fastcampus.ch3.diCopy1.SportsCar는 value이다.
getCar()를 만들었으므로 car에 대입한다. soutv를 입력하면 System.out.println("car = " + car); 자동 생성된다.
SportsCar 잘 출력된다. Truck으로 바꾸고 싶으면 코드를 바꾸는게 아니라 config.txt에서 SportsCar를 Truck로 바꾸면 된다. 외부의 파일만 바꾸면 프로그래밍이 동작하도록 만드는 것이 핵심이고 이를 spring이 해준다. 결과적으로 변경이 쉽게된다.
위 코드는 좀 더 유용하게 바꿨다. getCar를 getObject로 바꾼다. p.getProperty로 car를 가져왔는데, 다른 객체를 가져오면 이 부분도 바뀌어야 한다. 따라서 config.txt에 key가 여러개 있으면 모든 키를 가져온다.
위와 같이 코드를 바꿔도 똑같이 출력된다.
Engine을 추가한다.
결과는 같다.