pooney
article thumbnail
Published 2020. 6. 21. 17:19
Java 동적으로 객체 생성하기 Java

상황에 따라 객체를 생성해야 하거나 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
profile

pooney

@pooney

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!