Burninghering's Blog
article thumbnail

조상(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파일을 읽어와서 객체를 만드는 코드였고,

코드 변경이 필요하지 않도록 코드를 바꾸었다!


 

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.

http://bit.ly/3Y34pE0

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

 

profile

Burninghering's Blog

@개발자 김혜린

안녕하세요! 반갑습니다.