[Spring]변경에 유리한 코드

유진·2025년 2월 27일

Spring

목록 보기
4/11

다형성, Factory Method

class Car{}
class SportsCar extends Car{}
class Truck extends Car{}

Car클래스와, Car클래스를 상속하여 SportsCar, Truck 클래스를 만든다.

1. 다형성 적용 안하는 경우

SportsCar car = new SportsCar();
↓
Truck car = new Truck();

위의 코드는 특정 클래스에 직접 의존하고 있다.
따라서 car의 클래스를 SportsCar에서 Truck으로 변경할 때 코드 수정이 불가피하다.(직접 수정해줘야 함)

2. 다형성 적용하는 경우

Car car = new SportsCar();
↓
Car car = new Truck();

이는 다형성을 활용한 객체 변경이다.
SportsCar와 Truck의 부모 클래스는 Car로 동일하다.
이렇게 선언을 하게 되면 같은 부모를 공유하고 있기 때문에 나중에 SportsCar -> Truck 클래스로 변경이 가능하게 된다.
이렇게 되면 프로그램 내에서 조건에 의해 car의 형태를 원하는대로 변경해줄 수 있다.

3. Factory Method

Factory Method

상위 클래스

객체를 생성하는 인터페이스를 정의
인스턴스를 만드는 방법만 결정

하위 클래스

인스턴스를 생성
데이터의 생성을 책임지고 조작하는 함수들을 오버라이딩하여 인터페이스와 실제 객체를 생성하는 클래스를 분리

Car car = new getCar();

static Car getCar(){
	return new SportsCar();
}
↓
static Car getCar(){
	return new Truck();
}

특정 객체를 직접 생성하는 것이 아니라 메서드를 통해 객체를 반환하는 방식으로 객체를 생성한다.
필요에 따라 반환 객체를 쉽게 변경할 수 있다.

Map과 외부 파일

기존 방식의 문제점

Car car = new SportsCar();
Car car = new Truck();

기존에는 객체를 생성할 때 직접 new 연산자를 사용하여 생성하였다.
이렇게 객체를 생성하면 크도를 직접 수정해야만 객체를 변경할 수 있기 때문에 유지 보수에 불리하다.

개선된 방식 : 외부 설정 파일 활용(config.txt)

객체를 직접 코드에서 생성하는 것이 아니라, 설정 파일에서 어떤 클래스를 사용할지 결정한다.
이 경우 코드가 아니라 config.txt만 수정하면 객체 변경이 가능하다.

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");
        System.out.println("car: "+car);
        Engine engine = (Engine)getObject("engine");
        System.out.println("engine: "+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();
    }
}
config.txt
car=com.springproject.ch1.SportsCar
engine=com.springproject.ch1.Engine
↓
car=com.springproject.ch1.Truck
engine=com.springproject.ch1.TurboEngine

main에서 getObject()에 매개변수로 car를 넣어서 보낸다.
-> 맵에서 key값이 car인 객체를 찾아 리턴하라는 의미
engine도 동일하게 동작

Properties는 <String, String> 형식으로 값을 저장하는 형태이다.
(맵과 비슷 <Object, Object>)
p.load()를 통하여 config.txt에 있는 내용을 불러온다.
그 후 clazz에 key의 값을 key로 가지고 있는 property를 저장하고, 새로운 인스턴스를 생성하여 반환한다.

0개의 댓글