[Java] Class 클래스
Class 클래스란?
지금까지 변수를 선언할 때 자료형을 미리 파악하고 그 자료형에 따라 변수를 선언했다.
그리고 클래스를 사용할 때도 이미 그 클래스 정보(변수, 메서드)를 알고 있는 상황에서 프로그램을 만들었다. 하지만 어떤 경우에는 여러 클래스 중에 상황에 따라 다른 클래스를 사용해야 할 때도 있고, 반환받는 클래스가 정확히 어떤 자료형인지 모를 때도 있다. 이렇게 모르는 클래스의 정보를 사용할 경우에는 우리가 클래스 정보를 직접 찾아야한다. 이때 Class 클래스를 사용한다.
Class 클래스를 선언하고 클래스 정보를 가져오는 방법은 다음과 같다.
- Object 클래스의 getClass() 메서드 사용하기
1 2
String s = new String(); Class c = s.getClass
- 클래스 파일 이름을 Class 변수에 직접 대입하기
1
Class c = String.Class;
- Class.forName(“클래스 이름”) 메서드 사용하기
1
Class c = Class.forName("java.lang.String")
1번의 경우는 모든 클래스가 사용할 수 있는 메서드이다. 이 메서드를 사용하려면 이미 생성된 인스턴스가 있어야한다. 2,3번의 경우는 컴파일된 클래스 파일이 있으면 클래스 이름만으로도 Class 클래스를 반화놘다.
다음 예제로 Class 클래스를 반환받아 사용해보자.
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
package objectclass;
public class Person {
private String name;
private int age;
public Person(){}
public Person(String name){
this.name = name;
}
public Person(String name, int age){
this.name = name;
this.age = age;
}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public int getAge(){
return age;
}
public void setAge(int age){
this.age = age
}
}
이 예제 클래스는 사람의 이름과 나이를 변수로 갖고, 생성자 매개변수가 없는경우, 이름만 있는경우, 이름과 나이가 있는경우를 만들었고, get 과 set 함수를 만들어 이름과 나이를 불러오고, 접근할 수 있도록 만들었다.
이제 Person의 Class 클래스를 가져와보자.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package objectclass;
public class PersonTest {
public static void main(String[] args) throws ClassNotFoundException{
Person person = new Person();
Class pClass1 = person.getClass();
System.out.println(pClass1.getName());
Class pClass2 = Person.class;
System.out.println(pClass2.getName());
Class pClass3 = Class.forName("objectclass.Person");
System.out.println(pClass3.getName());
}
}
>>> objectclass.Person
>>> objectclass.Person
>>> objectclass.Person
Person의 클래스를 가져온것을 확인할 수 있다.
Class를 활용해 클래스 정보 알아보기
프로그래밍을 하다 보면 내가 사용할 클래스의 자료형을 모르는 경우가 왕왕 생기곤한다. 예를 들어 내 컴퓨터에 저장되어 있지 않은 객체를 메모리에 로드하고 생성하는 경우에는 그 객체의 정보를 알기가 쉽지 않을 것 이다. 이때 Class 클래스를 가져올 수 있다면 해당 클래스의 생성자, 메서드, 멤버변수 정보를 찾을 수 있다. 이렇게 사용하려는 클래스의 자료형을 모르는 상태에서 Class 클래스를 활용하여 그 클래스의 정보를 가져오고, 이 정보를 활용하여 인스턴스를 생성하거나 메서드를 호출하는 방식을 리플렉션 (reflection) 이라고 한다.
그럼 클래스의 Constructor, Method, Field 클래스를 사용하여 리플렉션 프로그래밍을 해보자.
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
package objectclass;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class StringClassTest {
public static void main(String[] args) throws ClassNotFoundException{
Class strClass = Class.forName("java.lang.String");
Constructor[] cons = strClass.getConstructors();
for(Constructor c : cons) {
System.out.println(c);
}
System.out.println();
Field[] fields = strClass.getFields();
for(Field f : fields){
System.out.println(f);
}
System.out.println();
Method[] methods = strClass.getMethods();
for(Method m : methods){
System.out.println(m);
}
}
}
Class 클래스를 가져오기위해 forName() 메서드를 사용한다. 이 메서드는 정적 메서드이므로 클래스를 생성하지 않아도 사용할 수 있으며, java.lang.String을 사용하여 Class를 가져왔다. 이제 String 클래스의 정보를 알 수 있는데, 출력결과를 보면 String 클래스의 여러 생성자를 볼 수 있다. 이렇게 Class 클래스와 java.lang.reflect 패키지에 있는 클래스를 활용하면 클래스 이름만 알아도 클래스의 생성자, 메서드등의 정보를 얻을 수 있다.
댓글남기기