본문 바로가기
Java

인터페이스로 느슨한 결합 만들기

by Coarti 2023. 6. 13.

JDK11

본문의 소스코드를 바꾸지 않고 다른 객체로 바꾸는 방법 중 한가지이다

이해를 위한 간단한 예제이다

package useInterface.ex1;

public class A {
	private X x; // has ~ a 관계


	public void setX(X x) {
		this.x = x;
	}

	public void print() {
		System.out.println(this.x.total());
	}
}
package useInterface.ex1;

public class B implements X {
	@Override
	public int total() {
		return 30;
	}
}
package useInterface.ex1;

public class C implements X {

	@Override
	public int total() {
		return 50;
	}
}

같은 패키지 안에 setting.txt ( 이름무관 ) 생성

내용 : 사용할 클래스를 패키지명과 함께 작성

useInterface.ex1.C

 

여기서 부터 적용될 소스코드

package useInterface.ex1;

import java.io.FileInputStream;
import java.util.Scanner;

public class Program {

	public static void main(String[] args) throws Exception {
		// 메모장에는 생성해야할 객체의 이름을 적어놓는다, 외부파일로 빼낸다
		// 이렇게 코드를 작성하면 본문의 코드를 수정할 필요가 없으며
		// 향후 어노테이션 | xml 파일으로도 이러한 효과를 줄 수 있다
		
		// root경로부터 setting.txt의 위치
		FileInputStream fis = new FileInputStream("src/useInterface/ex1/setting.txt");
		Scanner sc = new Scanner(fis); // 파일을 읽을 객채
		String className = sc.nextLine(); // sc로 입력된 문장
		System.out.println(className); // 확인
		fis.close(); // 메모리누수 방지
		sc.close(); // 메모리누수 방지

		A a = new A(); // 인스턴스를 담을 객체
		// B b = new B(); // B라는 클래스 명을 소스코드를 수정하지 않고 어떻게 바꿀 것인가
		// a.setX(b); // 클래스의 바꿀때마다 코드를 고쳐주어야한다.
		
		// 모든 타입을 받아드린다
		Class<? extends Object> clazz
					= Class.forName(className); // 클래스의 정보를 가져오는 구조체
		X x = (X) clazz.getDeclaredConstructor().newInstance(); // 인스턴스 생성
		a.setX(x);

		a.print();

	}
}
728x90