자바의 모든 클래스와 인터페이스는 컴파일이 되고나면 class 파일로 생성됩니다. 예를들어 a.java 파일이 컴파일 되면 a.class파일이 생성되고 이class파일에는 클래스나 인터페이스에 대한 변수, 메소드, 생성자 등의 정보가 들어 있습니다. Class 클래스는 컴파일된 class 파일에 저장된 클래스나 인터페이스 정보를 가져오는 데 사용합니다.
Class 클래스란?
지금까지 변수를 선언할 때 자료형을 미리 파악하고 그 자료형에 따라 변수를 선언했습니다.
그리고 클래스를 사용할 때도 이미 그 클래스 정보(변수, 메소드 등)를 알고 있는 상황에서 프로그램을 만들었습니다. 그런데 어떤 경우에는 여러클래스 중에 상황에 따라 다른 클래스를 사용해야 할 때도 있고, 반황받는 클래스가 정확히 어떤 자료형인지 모를 때도 있습니다. 이렇게 모르는 클래스의 정보를 사용할 경우에 우리가 클래스 정보를 직접 찾아야 합니다. 이때 Class 클래스를 활용합니다.
Class 클래스를 선언하고 클래스 정보를 가져오는 방법은 다음과 같이 세 가지가 있습니다.
1. Object 클래스의 getClass() 메소드 사용하기
String s = new String();
Class c = s.getClass(); //getClass() 메소드의 반환형은 Class
2. 클래스 파일 이름을 Class 변수에 직접 대입하기
Class c = String.Class;
3.Class.forName("클래스 이름") 메소드 사용하기
Class c = Class.forName("java.lang.String");
1번의 경우 Object에 선언한 getClass() 메소드는 모든 클래스가 사용할 수 있는 메소드 입니다. 이 메소드를 사용하려면 이미 생성된 인스턴스가 있어야 합니다. 2, 3번의 경우에는 컴파일도니 클래스 파일이 있다면 클래스 이름 만으로 Class 클래스를 반환받습니다.
13행에서 forName() 메소드를 살펴보면, 클래스 이름(package 이름 포함)으로 가져오는 경우에는 매개변수로 쓰이는 값이 문자열입니다. 이때 매개변수로 받은 문자열에 해당하는 클래스가 존재하지 않으면 클래스를 가져오는 데 실패합니다. 이때 ClassNotFoundException이 발생합니다. 7, 10, 13행에서 Class 클래스를 가져온 후 getName() 메소드를 호출하면 클래스의 이름인 classex.Person이 잘 출력되는것을 볼 수 있습니다.
즉 Class 클래스를 통하여 클래스 정보를 알 수 있습니다.
Class 클래스를 활용해 클래스 정보 알아보기
프로그래밍을 하다 보면 내가 사용할 클래스의 자료형을 모르는 경우가 있을 수 있습니다. 예를 들어 내 컴퓨터에 저장되어 있지 않은 객체를 메모리에 로드하고 생성하는 경우 그 객체의 정볼르 알 수 없겠죠. 이때 Class 클래스를 가져올 수 있다면 해당 클래스 정보, 즉 생성자.메서드.멤버 변수 정볼르 찾을 수 있습니다. 이렇게 사용하려는 클래스의 자료형을 모르는상태에서 Class 클래스를 활용하여 그 클래스의 정보를 가져오고, 이 정보를 활용하여 인스턴스를 생성하거나 메서드를 호출하는 방식을 ' 리플렉션(reflection)' 이라고 합니다. 사실 우리가 자바로 프로그램을 구현할 때 리플렉션 프로그래밍을 해야 하는 경우는 많지 않기 때문에, 이런 방법이 있다는 것 정도만 알아 두면 됩니다.
Class 클래스를 가져오기 위해 forName()메소드를 사용합니다. 이 메소드는 정적 메소드이므로 클래스를 생성하지 않아도 사용할 수 있습니다. 9행에서 String 클래스 이름 java.lang.String을 사용하여 Class 클래스를 가져왔습니다. 이제 String 클래스의 정보를 알 수 있습니다. 11행에서 String 클래스의 모든 생성자를 가져오기 위해 Class 클래스의 getConstructors() 메소드를 호출했습니다. 향상된 for문을 사용하여 모든 생성자 정보를 출력 합니다. 출력 결과를 보면 String 클래스의 여러 생성자를 볼 수 있습니다. 이렇듯 Class 클래스와 java.lang.reflect 패키지에 있는 클래스를 활용하면 클래스 이름만 알아도 클래스의 성성자, 메소드 등의 정보를 알 수 있습니다. 또한 여기서는 다루지 않았지만 생성자나 메소드를 직접 호출할 수도 있습니다.
newInstance()를 사용해 클래스 생성하기
이런게 있다는것만 일단 알아두자..
'복습용' 카테고리의 다른 글
19. 컬렉션 프레임워크 (0) | 2020.04.03 |
---|---|
18.제네릭 (0) | 2020.04.02 |
17-1.Wrapper 클래스 (0) | 2020.04.02 |
17.String 클래스 (0) | 2020.04.02 |
16.Object 클래스 (equals, hash) (0) | 2020.04.01 |