Java 코드연습/인터페이스

[뉴렉처] 새로운 객체로 바꾸기(문자열을 읽어서 객체로 만들기)

양상추상츄 2021. 11. 2. 12:35

https://www.youtube.com/watch?v=YZzpGtpW2h0&list=PLq8wAnVUcTFX4E2NplMvJfqlcgAeF_BxK&index=34 

뉴렉처 동영상 강의

패키지 안에 메모장 생성, 메모장 안에는 Exam_1.인터페이스.B 라고 입력

 

 

메모장 setting.txt에 B로 해놨을때의 결과

FileInputStream을 통해서 경로받은다음 Scanner을 통해서 입력하고 둘다 닫아준다.

예외처리는 모두 던지기로

 

 

결합을 바꿔볼 다른 클래스 생성 하여 인터페이스 X 상속

 

 

메모장 setting의 문자를 B->C로 바꾸기만 했는데 결합이 변경되었다.


*정리 

외부파일의 문자열 가지고 클래스파일의 정보를 얻을 수 있고 그걸 통해서 새로운 인스턴스를 만들 수 있다.

오직 new만 인스턴스를 만들 수 있는게 아니고 메소드 통해서도 인스턴스를 만들 수 있다.

 

외부파일을 가지고 내부의 인스턴스 내용을 바꿔서 객체를 다른 객체로 바꾸는 방법

변화가 있는 부분을 외부설정으로 빼고 외부설정에 따라서 결합되는 객체가 달라지는 방법

여기서 인터페이스의 역할이 크다.

 

외부파일에 기록된 문자열을 읽어들여서 새로운 인스턴스를(B->C) 만든다 -> 즉, 소스코드를 수정 및 재배포하지 않고, 외부파일 수정만으로도 객체를 바꿔낄 수 있다.(느슨한 결합력)

댓글로 어떤분이 정리해주신것


package Exam_1.인터페이스;

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


public class Program {

	public static void main(String[] args) throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException {
		FileInputStream fis = new FileInputStream("src/Exam_1/인터페이스/setting.txt");
		Scanner scan = new Scanner(fis);
		String className = scan.nextLine();
		//System.out.println(className);
		scan.close();
		fis.close();
		
		//A.class.newInstance();
		//new A();
		
		Class clazz = Class.forName(className);
		A a = new A();//핸드폰
		X x = (X) clazz.newInstance();
		a.setX(x);
		a.print();
		
	}

}
package Exam_1.인터페이스;

public class A {
	private X x;
	
	public void setX(X x) { //도킹역할
		this.x = x; // 핸드폰의 베터리 단자 같은 역할
	}

	public A() {
		//b = new B();// private B b를 사용하기 위해 생성자로 세팅
	}
	
	public void print() {
		int total = x.total();
		System.out.printf("total is %d\n", total);
	}

}
package Exam_1.인터페이스;

public interface X {//오직 기능만 적음 
	int total();//앞에 public같은 보호같은거 필요없음
}
package Exam_1.인터페이스;

public class B implements X {

	public int total() {
		return 30;
	}
	
}
package Exam_1.인터페이스;

public class C implements X {
	@Override
	public int total() {
		// TODO Auto-generated method stub
		return 50;
	}

}