Java 공부 42일차(래퍼, Class 클래스란?)3편

임선구·2025년 3월 17일

몸 비틀며 Java

목록 보기
43/58

오늘의 잔디


공부 타이머를 못찍었다


Class 클래스

자바에서 Class 클래스는 클래스의 정보(메타데이터)를 다루는데 사용된다. Class 클래스를 통해 개발자는 실행
중인 자바 애플리케이션 내에서 필요한 클래스의 속성과 메서드에 대한 정보를 조회하고 조작할 수 있다.

Class 클래스의 주요 기능은 다음과 같다.

  • 타입 정보 얻기: 클래스의 이름, 슈퍼클래스, 인터페이스, 접근 제한자 등과 같은 정보를 조회할 수 있다.
  • 리플렉션: 클래스에 정의된 메서드, 필드, 생성자 등을 조회하고, 이들을 통해 객체 인스턴스를 생성하거나 메서드를 호출하는 등의 작업을 할 수 있다.
  • 동적 로딩과 생성: Class.forName() 메서드를 사용하여 클래스를 동적으로 로드하고, newInstance()
    메서드를 통해 새로운 인스턴스를 생성할 수 있다.
  • 애노테이션 처리: 클래스에 적용된 애노테이션(annotation)을 조회하고 처리하는 기능을 제공한다.

예를 들어, String.classString 클래스에 대한 Class 객체를 나타내며, 이를 통해 String 클래스에 대한 메타데이터를 조회하거나 조작할 수 있다.

다음 코드를 실행해보자.

package lang.clazz;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class ClassMetaMain {
 public static void main(String[] args) throws Exception {
 //Class 조회
 Class clazz = String.class; // 1.클래스에서 조회
 //Class clazz = new String().getClass();// 2.인스턴스에서 조회
 //Class clazz = Class.forName("java.lang.String"); // 3.문자열로 조회
 // 모든 필드 출력
 Field[] fields = clazz.getDeclaredFields();
 for (Field field : fields) {
 System.out.println("Field: " + field.getType() + " " + 
field.getName());
 }
 // 모든 메서드 출력
 Method[] methods = clazz.getDeclaredMethods();
 for (Method method : methods) {
 System.out.println("Method: " + method);
 }
 // 상위 클래스 정보 출력
 System.out.println("Superclass: " + clazz.getSuperclass().getName());
 // 인터페이스 정보 출력
 Class[] interfaces = clazz.getInterfaces();
 for (Class i : interfaces) {
 System.out.println("Interface: " + i.getName());
 }
 }
}

class vs clazz - class는 자바의 예약어다. 따라서 패키지명, 변수명으로 사용할 수 없다.
이런 이유로 자바 개발자들은 class 대신 clazz 라는 이름을 관행으로 사용한다. clazzclass 와 유사하게 들리고, 이 단어가 class 를 의미한다는 것을 쉽게 알 수 있다.

주의!
main() 옆에 throws Exception 이 추가된 부분에 주의하자. 이 코드가 없으면 컴파일 오류가 발생한다. 자세한 내용은 예외 처리에서 학습한다.

실행 결과

Field: class [B value
...
Method: public boolean java.lang.String.equals(java.lang.Object)
Method: public int java.lang.String.length()
...
Superclass: java.lang.Object
Interface: java.io.Serializable
Interface: java.lang.Comparable
...

Class 클래스는 다음과 같이 3가지 방법으로 조회할 수 있다.

Class clazz = String.class; // 1.클래스에서 조회
Class clazz = new String().getClass();// 2.인스턴스에서 조회
Class clazz = Class.forName("java.lang.String"); // 3.문자열로 조회

Class 클래스의 주요 기능

  • getDeclaredFields(): 클래스의 모든 필드를 조회한다.
  • getDeclaredMethods(): 클래스의 모든 메서드를 조회한다.
  • getSuperclass(): 클래스의 부모 클래스를 조회한다.
  • getInterfaces(): 클래스의 인터페이스들을 조회한다.

실행 결과를 보면 String 클래스의 다양한 정보를 확인할 수 있다

클래스 생성하기

Class 클래스에는 클래스의 모든 정보가 들어있다. 이 정보를 기반으로 인스턴스를 생성하거나, 메서드를 호출하고,
필드의 값도 변경할 수 있다. 여기서는 간단하게 인스턴스를 생성해보자.

package lang.clazz;public class Hello {
 public String hello() {
 return "hello!";
 }
}
package lang.clazz;
public class ClassCreateMain {
 public static void main(String[] args) throws Exception {
 //Class helloClass = Hello.class;
 Class helloClass = Class.forName("lang.clazz.Hello");
 Hello hello = (Hello) 
helloClass.getDeclaredConstructor().newInstance();
 String result = hello.hello();
 System.out.println("result = " + result);
 }
}

실행 결과

result = hello!

getDeclaredConstructor().newInstance()

  • getDeclaredConstructor() : 생성자를 선택한다.
  • newInstance() : 선택된 생성자를 기반으로 인스턴스를 생성한다.

리플렉션 - reflection
Class 를 사용하면 클래스의 메타 정보를 기반으로 클래스에 정의된 메서드, 필드, 생성자 등을 조회하고, 이들을 통해 객체 인스턴스를 생성하거나 메서드를 호출하는 작업을 할 수 있다. 이런 작업을 리플렉션이라 한다. 추가로 애노테이션 정보를 읽어서 특별한 기능을 수행할 수 도 있다. 최신 프레임워크들은 이런 기능을 적극 활용한다.
지금은 Class 가 뭔지, 그리고 대략 어떤 기능들을 제공하는지만 알아두면 충분하다. 지금은 리플렉션을 학습하는 것
보다 훨씬 더 중요한 기본기들을 학습해야 한다. 리플렉션은 이후에 별도로 다룬다.

profile
끝까지 가면 내가 다 이겨

0개의 댓글