Class.forName 메소드의 사용법

Class.forName 메소드의 사용법


클래스의 동적 로딩이 궁금하신 분이나
서블릿을 공부하다보면 클래스가 동적으로 로딩되는 것을 볼 수 있을 것입니다.
저 역시 어떻게 동적으로 로딩 되는지 궁금해서 직접 테스트 해보았고,
이해하지 못하신 분들을 위해 한문장 적어봅니다.
동적 로딩이란 : 어떠한 클래스가 로딩 될지 모르기 때문에 Class 클래스의 forName()함수를 이용해서 해당 클래스를 메모리로 로드 하는 것입니다.
좀더 풀어서 설명하면 우리가 코딩할 때를 생각해보세요
항상 객체를 아래와 같이 생성할 것입니다.

1
String str=new String("test");

이는 문자열을 저장할 객체가 필요하기에 명시적으로 객체를 생성한 것입니다.
하지만 어떤 객체를 생성해서 처리를 해야 될지 모르는 경우가 존재하게 됩니다.
비유를 통해서 설명해 드리겟습니다.

즉석김밥집을 예로 들어보죠.
즉석김밥집의 주인은 손님이 어떤 김밥 종류를 원하는지 모릅니다.

참치김밥을 원하는 손님이 와서 주문을 하면 주인은 그 자리에서 참치 김밥을 만들어 주고,
일반김밥을 원하는 손님이 와서 주문을 하면 주인은 그 자리에서 일반 김밥을 만들어 주죠.
(김밥 종류가 2가지 밖에 생각이 안나네요 ㅎㅎ)

즉 주인은 어떤 손님이 올지 모르기 때문에 김밥을 만들어 둘 수 없죠
( 미리 만들어 두면 즉석김밥이 아니니까.ㅎㅎ)

여기서 코드로 다시 돌아가보면
미리 만들어 둔 김밥은 String str=new String(“미리 만들어 둔 김밥”);
즉석에서 만든 김밥은 Class.forName(“즉석에서 만든 김밥 Class”);
자 이제 이해가 좀 되셨는지요…

/////////////////////////////////////////////////////////
예로서 하나 설명 드리겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class TestClass {
public static void main(String args[]) {
if (args.length >= 1) {
try {
Class classExample = null;
classExample = Class.forName(args[0]); // 이 라인에서 인자로 받은 클래스가
// 메모리로 로드 됩니다.
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}

메모리로 로드 된다고 해서 인자로 받은 클래스가 객체로 생성되어서 메모리로 로드 되는
것이 아니라 이는 static으로 선언한 변수, 함수에 한해서 메모리 공간 static 영역에 로드 되는
것입니다.
(말로서는 이해가 안가시죠?? 다시 아래 코드를 보시면 이해가 가실 것입니다.)
////////////////////////////////////////////////////////

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
package TestClass;

public class LoadClass { // 동적으로 로드될 클래스 입니다.
public String str = null;
private static String staticstr;
static {
staticstr = "정적 변수 로딩 되었습니다.";
}

public static String getStaticstr() {
return LoadClass.staticstr;
}

public LoadClass() {
System.out.println("이제 객체가 생성 되었으며 생성자가 호출되었습니다.");
this.setStr(" 동적 로딩 성공과 객체 생성 됨");
this.printStr();
}

public String getStr() {
return str;
}

public void setStr(String str) {
this.str = str;
}
}
// ---------------------------
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
import TestClass.*;

public class TestClass {
public static void main(String args[]) {
if (args.length >= 1) {
try {
Class classExample = null;
classExample = Class.forName(args[0]); // 메모리로 로드
System.out.println(LoadClass.getStaticstr());
try {
Object obj = classExample.newInstance(); // 여기서 객체가 생성 됨.
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
//--- 위 두 클래스를 실행 시키면 아래와 같은 결과가 출력 됩니다. --

정적 변수 로딩 되었습니다.
이제 객체가 생성 되었으며 생성자가 호출되었습니다.
동적 로딩 성공과 객체 생성 됨

Share