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();
}
}
|
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");
}
}
|
cs |
이렇게 처리를 해서 사용하니 노란 경고줄도 안떠서 이정도면 됐지 하면서 사용했다.
그러던 중 회사에서 같이 블로그를 운영하고 있는 팀원이 있는데 내 코드를 보고서 개선 하면 좋을 부분에 대해 피드백을 해주었다. 듣고보니 나도 여기서 더 나은 방법을 생각하지 못했었는데 단번에 문제점을 찾는다는게 대단하다고 생각했다.
팀원 블로그 : 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();
}
}
|
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 |