Noah_Developer
Developer Noah
Noah_Developer
전체 방문자
오늘
어제
  • 전체보기 (88)
    • Programmers (33)
      • Level1 (33)
    • FRONT-END (3)
      • React (2)
      • HTML (0)
      • CSS (0)
      • JavaScrpit (1)
    • BACK-END (23)
      • JAVA (14)
      • C (0)
      • Spring (5)
    • DATABASE (11)
      • MySQL (3)
      • Oracle (0)
    • IDE (2)
      • IntelliJ (2)
      • Eclipse (0)
      • VSCode (0)
    • Android (1)
    • 용어 (2)
      • 금융 (2)
    • Developer Diary (5)
      • Web (1)
    • 자격증 (1)
    • Operating System (3)
      • Linux (2)
    • Info (3)

블로그 메뉴

  • 홈
  • 방명록
  • 포트폴리오
  • 깃허브

공지사항

  • 🙏 방문 감사합니다.

인기 글

태그

  • 개발일기
  • 카카오 블라인드
  • 자바 쉬운 알고리즘
  • 코딩테스트 문제
  • 카카오 블라인드 테스트
  • level1
  • 알고리즘 예제
  • 프로그래머스 레벨1
  • 코딩테스트 문제 풀이
  • 알고리즘 문제
  • 자바 알고리즘 연습문제
  • 프로그래머스 연습문제
  • 알고리즘 풀이
  • 알고리즘 연습문제
  • 초보자 알고리즘
  • 카카오공채
  • MySQL
  • 알고리즘 쉬운문제
  • 알고리즘 블로그
  • 크레인 인형뽑기 풀이
  • String StringBuilder 차이
  • 프로그래머스 문제풀이
  • 코딩테스트 준비
  • programmers
  • 크레인 인형뽑기 정답
  • 프로그래머스
  • 프로그래머스 코딩연습
  • programmers level 1
  • 코딩테스트
  • 크레인 인형뽑기

최근 댓글

최근 글

티스토리

250x250
hELLO · Designed By 정상우.
Noah_Developer

Developer Noah

[JAVA] 메인 메소드에서 클래스 생성하기
BACK-END/JAVA

[JAVA] 메인 메소드에서 클래스 생성하기

2021. 5. 3. 15:44
728x90

소스 바로보기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import level1.CheckCntN;
import level1.CrainGame;
import level1.HateSameNum;
import level1.Marathon;
import level1.PracticeTest;
import level1.RecommandNewID;
import level1.getMidStr;
import level1.SumTwoInt;
 
public class App {
    public static void main(String[] args) throws Exception {
        // new CrainGame();
        // new Marathon();
        // new PracticeTest();
        // new RecommandNewID();
        // new CheckCntN();
        // new getMidStr();
        // new HateSameNum();
        new SumTwoInt();
    }
}
Colored by Color Scripter
cs

최근에 알고리즘 문제를 풀다 보니 프로그래머스 프로젝트의 메인 메소드에 위와 같이 계속해서 반복되는 new 클래스와 주석처리되는 수많은 클래스...

그리고 계속계속 추가되는 import와 주석칠때 마다 나오는 노란색 경고문....

너무 보기싫어 원하는 클래스만 생성할 수 있도록 처리를 진행하기로 했다.

1차 리펙토링.

메인 메소드에서 패키지 명과 클래스명을 하드코딩하여 실행하면 해당 클래스를 하도록 설정.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import java.io.File;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
 
public class App {
 
    /// Fields
 
    /// Constructor 
 
    /// Method
    /**
     * @param packageName 
     * @param className
     */
    public static void classLoader(String packageName, String getClassName) throws Exception{
 
        // String packageName = "level1";
        String packageNameSlashed = "./" + packageName.replace(".", "/");
        System.out.println(packageNameSlashed);
        URL packageDirURL = Thread.currentThread().getContextClassLoader().getResource(packageNameSlashed);
 
        String directoryString = packageDirURL.getFile();
 
        List<Class<?>> classList = new ArrayList<Class<?>>();
        File directory = new File(directoryString);
        if(directory.exists()){
            String[] files = directory.list();
            for(String fileName : files){
                fileName = fileName.substring(0, fileName.length() - 6); // 확장자 삭제
                Class<?> c = Class.forName(packageName + "." + fileName); // Dynamic Loading
                classList.add(c); // List<Class> list 에 넣는다
            }
        }
 
        String target = packageName + "." + getClassName;
        for(Class<?> className : classList){
            if(target.equals(className.getName())){
                className.getDeclaredConstructor().newInstance();
            }
        }
 
    }
    public static void main(String[] args) throws Exception {
 
        // package, class명을 전달하여 클래스 생성하는 메소드 호출
        classLoader("level1","Ponketmon");
 
    }
}
Colored by Color Scripter
cs

이렇게 처리를 해서 사용하니 노란 경고줄도 안떠서 이정도면 됐지 하면서 사용했다.

그러던 중 회사에서 같이 블로그를 운영하고 있는 팀원이 있는데 내 코드를 보고서 개선 하면 좋을 부분에 대해 피드백을 해주었다. 듣고보니 나도 여기서 더 나은 방법을 생각하지 못했었는데 단번에 문제점을 찾는다는게 대단하다고 생각했다.

팀원 블로그 : xxxelppa.tistory.com/

 

한칸짜리책상서랍

I work diligently to become lazy.

xxxelppa.tistory.com

피드백 받은 부분 중에 클래스 이름을 보여주고 실행할 파일을 선택받아 생성하도록 처리를 해보았다.

2차 리펙토링.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import java.io.File;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
 
public class App {
 
    /// Fields
 
    /// Constructor 
 
    /// Method
    /**
     * 앱 실행시 최초 호출하는 클래스 로더 메소드
     * 사용자에게 입력 받은 클래스의 생성을 담당한다.
     */
    public static void classLoader() throws Exception{
 
        // 처리할 데이터 객체 선언
        Map<Integer,Class<?>> classMap = new HashMap<Integer,Class<?>>();
 
        // 패키지 주소 설정
        String packageName = "level1";
        String packageNameSlashed = "./" + packageName.replace(".", "/");
        URL packageDirURL = Thread.currentThread().getContextClassLoader().getResource(packageNameSlashed);
        
        // 주소 설정한 경로에서 파일 얻어오기 위한 경로 세팅
        String directoryString = packageDirURL.getFile();
        
        // 경로에서 읽어 파일로 처리
        File directory = new File(directoryString);
        // 클래스 매핑 처리를 위한 클래스 번호 변수
        int classNo = 1;
        // 경로가 있을 경우에 처리한다
        if(directory.exists()){
            // 디렉토리의 파일 리스트를 String[]로 받는다
            String[] files = directory.list();
            // 파일 수 만큼 처리한다.
            for(String fileName : files){
                // 확장자 삭제
                fileName = fileName.substring(0, fileName.length() - 6); 
                // 클래스 로딩
                Class<?> clas = Class.forName(packageName + "." + fileName); 
                // 실행할 파일을 보여주기 위한 클래스 번호와 파일이름                
                System.out.println( classNo + ". " + fileName );
                // 매핑 처리할 데이터맵에 데이터 넣기
                classMap.put(classNo, clas);
                classNo++;
            }
        }
 
        // 실행 할 파일을 입력 받는다
        System.out.print("실행 할 파일을 선택 하세요 : ");
        Scanner scan = new Scanner(System.in);
 
        // 입력 받은 클래스의 Default Constructor를 생성한다.
        classMap.get(scan.nextInt()).getDeclaredConstructor().newInstance();
 
        // 스캐너가 사용되었으면 닫는다.
        if(scan!=null) scan.close();
 
    }
    public static void main(String[] args) throws Exception {
        
        classLoader();
    }
}
 
Colored by Color Scripter
cs

리스트 출력 후 입력받은 넘버로 클래스를 호출하여 수행한다.

3차 리펙토링은. 테스트 케이스 안내 후 입력받아 해당 케이스를 수행할 수 있도록 처리 할 예정이다.

 

좀 더 나은 방법이나 아이디어 있다면 댓글로 남겨주시면 검토 후 적용 시켜볼 의향이 있으니 댓글 달아주시면 감사하겠습니다.

728x90
저작자표시 (새창열림)

'BACK-END > JAVA' 카테고리의 다른 글

[Java] 308 Permanent Redirect  (0) 2021.08.27
[Java] 문자 길이를 고정 처리하여 보기 좋게 만들자.  (0) 2021.05.18
[Java] 마스킹 알고리즘 (Masking Algorithm)  (0) 2021.04.22
[Java] 로그 생성 파일 경로 추출  (0) 2021.04.19
[Java] 알고리즘 문자열 2진 검색(Binary Search) 예제  (0) 2021.04.16
    'BACK-END/JAVA' 카테고리의 다른 글
    • [Java] 308 Permanent Redirect
    • [Java] 문자 길이를 고정 처리하여 보기 좋게 만들자.
    • [Java] 마스킹 알고리즘 (Masking Algorithm)
    • [Java] 로그 생성 파일 경로 추출
    Noah_Developer
    Noah_Developer
    개발 기록 목적을 가진 블로그입니다.

    티스토리툴바