[Java] Java Reflection | Class 클래스

Jeini·2025년 9월 8일
0

☕️  Java

목록 보기
61/70
post-thumbnail

자바의 Class 클래스는 자바 리플렉션(reflection) 기능의 핵심이다.
이것을 이해하면 "자바 프로그램이 자기 자신을 들여다보는 방법"을 알 수 있다.


📌 Reflection 이란?

실행 중에 클래스의 메타데이터(클래스명, 필드, 메서드, 생성자 등)를 조사하고 다룰 수 있는 기능

  • 자바의 리플렉션 API는 java.lang.reflect 패키지에 있다.
  • 평소에는 우리가 . 연산자로 직접 메서드 호출하거나 필드에 접근한다.
    그런데 리플렉션을 쓰면 클래스 이름, 메서드 이름, 필드 이름을 문자열로만 가지고도 실행 중에 그 클래스 구조를 분석하고 메서드를 실행할 수 있다.

📌 왜 필요한가?

리플렉션은 일반 코드로는 할 수 없는 "동적 동작"이 가능해서 프레임워크나 라이브러리에서 많이 사용한다. 예를 들어:

  • 스프링(Spring) → 빈(bean) 생성할 때 new 대신 리플렉션으로 객체를 만듦
  • JUnit → @Test 가 붙은 메서드를 자동으로 찾아 실행
  • Hibernate → DB 테이블과 매핑된 클래스의 필드에 자동으로 값 주입
  • JSON Parsor → JSON 데이터를 DTO 객체로 자동 변환

📌 Class 클래스란?

JVM 안에서 로드된 클래스나 인터페이스를 표현하는 객체

  • java.lang.Class<T> 로 정의되어 있음.
  • 즉, Circle이라는 클래스를 만들면, 실행 중에 JVM 안에서는 Circle.class라는 Class 객체가 하나 생긴다. 이 객체를 이용하면 클래스의 이름, 필드, 메서드, 생성자 정보 등을 가져올 수 있고, 심지어 실행 중에 객체도 만들 수 있다.

📌 Class 객체 얻는 방법

자바에서는 Class 객체를 얻는 여러 가지 방법이 있다:

1. 클래스 리터럴 사용

Class<?> clazz = String.class;

👉 컴파일 시점에 바로 가져오는 방법

2. 객체에서 가져오기

String s = "hello";
Class<?> clazz = s.getClass();

👉 이미 만들어진 객체가 어떤 클래스인지 확인할 때 사용

3. 클래스 이름으로 로드

Class<?> clazz = Class.forName("java.lang.String");

👉 문자열로 클래스 이름을 넣어서 동적으로 로드. (예외 처리 필요)


📌 Class 클래스의 주요 기능

Class 객체를 얻으면 다음과 같은 것들을 할 수 있다:

✨ 클래스 정보 확인

Class<?> clazz = String.class;
System.out.println(clazz.getName());        // java.lang.String
System.out.println(clazz.getSimpleName());  // String
System.out.println(clazz.getPackageName()); // java.lang

✨ 필드/메서드/생성자 정보 가져오기

Method[] methods = clazz.getDeclaredMethods();
for (Method m : methods) {
    System.out.println(m.getName());
}

✨ 객체 생성하기 (리플렉션)

Class<?> clazz = Class.forName("java.lang.String");
Object obj = clazz.getConstructor(String.class).newInstance("hi");
System.out.println(obj);  // hi

📌 사용하는 이유

  • 라이브러리나 프레임워크 개발 시 (스프링, 하이버네이트 같은 것들)
  • 컴파일 타임에 알 수 없는 클래스를 실행 중에 다뤄야 할 때
  • JSON 파싱 라이브러리 → DTO 클래스에 자동 매핑할 때
  • ORM → DB 테이블과 클래스 필드를 자동 연결할 때

📌 정리 ✨

  • Reflection = 실행 중 클래스의 구조를 분석하고 다룰 수 있는 기술
  • Class, Method, Field, Constructor 같은 API를 통해 사용
  • 동적 객체 생성, 메서드 호출, 필드 값 접근 가능
  • 프레임워크의 핵심 기술 (스프링, JUnit, 하이버네이트 등)
  • 단점: 느리고, 위험할 수 있어서 신중히 사용해야 함
  • Class 클래스 = 자바에서 클래스 자체를 표현하는 메타 데이터 객체
  • 리플렉션 기능을 제공해서 클래스 이름, 필드, 메서드, 생성자, 상속 관계 등 다양한 정보를 알 수 있음.
  • 실행 중에 객체를 생성하거나, 메서드를 호출하는 것도 가능
profile
Fill in my own colorful colors🎨

0개의 댓글