( •̀ ω •́ )✧

[Java] 인터페이스의 구현 - 코드 수정을 없애기 위한 설정 본문

✏️ 노트/java

[Java] 인터페이스의 구현 - 코드 수정을 없애기 위한 설정

키루루 2023. 11. 2. 02:23

※ 본 내용은 강의를 수강하며 정리한 글입니다 👉 강의 링크


https://heyitzme.tistory.com/38

 

[Java] 인터페이스의 구현

※ 본 내용은 강의를 수강하며 정리한 글입니다 👉 강의 링크 초기 상태 초기 상태는 위와 같다. main class인 Program과 A, B가 결합력이 강한 상태로 결합되어 있다. 위 코드를 도식화하면 이 그림과

heyitzme.tistory.com

위 글에서는 인터페이스를 통해 A 객체와 결합될 객체를 B, C, ... 로 자유롭게 대체할 수 있다는 가능성까지 제시하였다.

하지만 여전히, B를 C로 대체하기 위해서는 main class의 코드 수정이 불가피하다.

만약 교체가 자주 일어나는 객체의 자리라면, 아래와 같이 설정 부분을 외부 파일로 빼내고 코드는 유지할 수 있다.

📁 setting.txt

ex6.B

먼저 사용할 클래스의 패키지로부터의 경로를 .로 구분하여 써준다.
지금은 B 객체를 사용한다.

📁 class Program (main class)

package ex6;

import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Scanner;

public class Program {
    public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {
        FileInputStream fis = new FileInputStream("src/ex6/setting.txt");
        Scanner scan = new Scanner(fis);
        String className = scan.nextLine();
        // System.out.println(className); = "ex6.B;"
        // 읽어온 후 scan, fis는 close 처리
        scan.close();
        fis.close();

        A a = new A();
        // Class.forName() : class 정보를 읽어옴
        Class clazz = Class.forName(className);
        // .newInstance() : class 정보 clazz를 X의 인스턴스로 만들어 줌
        X x = (X) clazz.getDeclaredConstructor().newInstance();
        a.setX(x);

        a.print();
    }
}

main class에서 해줘야 하는 설정은 위와 같다.
간략히 setting.txt 파일에서 클래스 이름을 읽어오고, 클래스 이름에서 class 정보를 얻어 인스턴스로 변환하는 것이다.
이는 결국 B b = new B(); 와 같은 기능을 한다.

📁 setting.txt

ex6.C

그러므로 B 객체 대신 C를 사용하고 싶다면 소스코드를 바꿀 필요 없이 txt 파일의 클래스명만 바꿔주면 된다.

소스코드를 C c = new C(); 로 바꾸는 대신 txt 파일만 고쳐준 것이다.

'✏️ 노트 > java' 카테고리의 다른 글

[Java] 인터페이스의 구현 - 기본  (1) 2023.11.02
인터페이스의 이해  (0) 2023.11.01
05. 문자와 문자열  (0) 2023.08.17
04. 상수와 리터럴  (0) 2023.08.17
03. 변수의 타입 - 기본형  (0) 2023.08.17
Comments