상황에 따라 객체를 생성해야 하거나 A클래스를 B클래스로 대체해야 하는 상황이 발생한다. 그때마다 소스코드를 수정하는 일은 시간, 노력적인면에서 비효율적으로 작용한다.
비효율적인 객체 교체
가령예로 FirstClass 를 TwoClass로 교환한다고 가정을 했을때 main 클래스에서 인터페이스를 통하여 객체를 받아 사용할것이다. new FirstClass or new TwoClass를 삽입하여 교체 하는데 이러한 방법은 비효율적인 방법이다.
TestInterface
package com.company;
public interface TestInterface {
public void whoCall();
}
FirstClass.class
package com.company;
public class FirstClass implements TestInterface{
@Override
public void whoCall() {
System.out.println("FirestClass call");
}
}
TwoClass.class
package com.company;
public class TwoClass implements TestInterface {
@Override
public void whoCall() {
System.out.println("TwoClass call");
}
}
main.class
package com.company;
public class Main {
public static void main(String[] args) {
TestInterface who = new FirstClass();
//TestInterface who = new TwoClass();
who.whoCall();
}
}
Config를 이용한 객체 교환
객체를 효율적으로 교체할 수 있는 방법은 config(설정파일)를 이용하여 하는 방법이 존재한다. 대표적으로 xml, 어노테이션을 이용하는 방법이 존재하는데 지금은 text파일 이용하는 방법을 사용하겠습니다. 아래와 같이 classconfig를 만들어 각 파일의 경로를 입력합니다.
classconfig
우선 해당 클래스의 경로를 입력합니다. (com.company.FirstClass)
main.class
package com.company;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
FileInputStream is = null;
Scanner scan = null;
try {
//해당 설정파일을 읽어 들임
is = new FileInputStream("src/com/company/classconfig");
scan = new Scanner(is);
String className = scan.nextLine();
//Class.forName은 해당 클래스의 정보를 가져온다.
Class clazz = Class.forName(className);
//해당 클래스의 객체를 생성
TestInterface who = (TestInterface) clazz.newInstance();
//해당 객체의 메소드 콜!!
who.whoCall();
}catch (FileNotFoundException | ClassNotFoundException e){
System.out.println(e.toString());
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} finally {
try {
scan.close();
is.close();
}
catch (IOException e){
System.out.println(e.toString());
}
}
}
}
실행결과
실행결과 classconfig 파일에 설정한 firstclass의 객체가 생성되어 메소드를 call 하는것을 확인 할 수 있습니다.
classconfig파일의 클래스경로 변경
classconfig
파일경로를 TwoClass로 변경 했습니다.
실행결과
TwoClass 객체의 메소드를 call하는 것을 확인 할 수 있습니다. 이런식으로 해당 파일의 경로를 config파일로 관리하여 필요상황에따라 교체하여 사용할 수 있으니 활용하시기 바랍니다.
'Java' 카테고리의 다른 글
Java 인스턴스 변수와 정척 초기화 블록 (0) | 2020.08.17 |
---|---|
Java Enum 이란? (0) | 2020.06.28 |
Java 날짜 연산 LocalDateTime (0) | 2020.06.28 |
Java 출력스트림 (0) | 2020.06.21 |