리플렉션
- 클래스, 필드, 메서드, 생성자 등의 정보를 런타임에 동적으로 조회하거나 조작할 수 있게 해주는 기능 즉, Java에서 클래스나 메서드 등의 정보를 코드로 다루는 기능
- 이 모든 건 Class 객체를 통해 시작됨
정적(static) 인스턴스 생성 방식(리플렉션아님)
컴파일 타임에 타입이 명확히 정해져 있어 생성자도 명확해야 하며, 컴파일러가 타입 체크, 생성자 유효성 체크 모두 수행
HolidayResponse res = new HolidayResponse();
런타임 인스턴스 생성방식
아래와 같이 클래스 타입을 변수로 다루고, newInstance()로 객체도 만들 수 있음
- 타입 정보가 Object로 추상화돼 있어 캐스팅 필요
Class<?> clazz = HolidayResponse.class;
Object obj = clazz.getDeclaredConstructor().newInstance();
제네릭 타입
제네릭 타입(Generic Type)이란, 타입을 파라미터화(parameterized) 해서 다양한 타입에 대해 재사용 가능한 클래스, 인터페이스, 메서드를 말합니다. 즉, “타입을 코드 안에 직접 쓰지 않고, 나중에 코드를 호출하는 쪽에서 타입인자를 넘겨줄때 결정하도록 만든 타입 구조”입니다.
- <T> 타입 매개변수 (Type Parameter) : 클래스나 메서드 정의 시 사용하며 타입 파라미터를 선언. 즉, “사용자가 나중에 어떤 타입을 지정할지 모르니 T 라는 변수를 미리 선언”.
- T가 type의 대표 키워드로 관례상 쓰이지만 E, K, V, N도 쓰이기도함.
- <T>라도 T에서 정의되지 않은 행동을 하려고 하면 컴파일 에러가 납니다.
- <String> 은 T라는 변수에 고정적인 객체를 정한것
List<String> list = new ArrayList<>();
// 여기서 외부(사용자)가 <String>을 지정
- <?> 비한정 와일드카드 (Unbounded Wildcard) : 이미 정의된 제네릭 타입을 호출/참조할때 사용하며 “타입을 명확히 모르겠거나,
여러 타입을 한 번에 받을 수 있게 해주자”.
public void printFirst(List<?> list) {
System.out.println(list.get(0)); // ✅ OK
}
public void invalid(List<?> list) {
? item = list.get(0); // ❌ 컴파일 에러
}
- ? 와일드 카드이지만 bounded 제약이 있는경우 : 무조건 제
- <? extends T> 상한 와일드카드 (Upper Bounded Wildcard) : T 또는 그 하위의 자식타입이면 허용
- <? super T> : 하한 와일드카드 (Lower Bounded Wildcard) T 또는 그 상위 타입이면 허용
Class<T>
- Class<T> :
- 클래스 자체도 객체로 표현한 것으로, 특정 타입(T)의 Class 객체를 의미해요.
- 자바 리플렉션 시스템에서 클래스 정보를 표현하는 클래스. 어떤 클래스의 메타정보를 담는 객체임
- 해당 클래스의 정의(필드, 메서드 등)에 대한 정보를 담은 객체를 반환합니다.
- Class<String> : String.class
- Class<Integer> : Integer.class
- Class<HolidayResponse> : HolidayResponse.class
Class<?> clazz = String.class;
System.out.println(clazz.getName()); // java.lang.String
System.out.println(clazz.getDeclaredFields()); // 필드 정보들
Class 객체의 메서드를 통해 리플렉션을 수행함
메서드 | 기능 |
getName() | 클래스 이름 반환 |
getDeclaredFields() | 모든 필드 조회 |
getDeclaredMethods() | 모든 메서드 조회 |
getDeclaredConstructors() | 생성자 조회 |
getSuperclass() | 상위 클래스 조회 |
getAnnotations() | 어노테이션 조회 |
newInstance() 또는 getDeclaredConstructor().newInstance() | 객체 생성 |
getField(name) / getMethod(name, ...) | 필드/메서드 단일 조회 |
'개발기술 > Java' 카테고리의 다른 글
Java Blocking I/O vs non-Blocking I/O (0) | 2025.04.06 |
---|---|
Java 코딩구현 - Java NIO, Spring Multipart (0) | 2025.04.04 |
예외처리 & Logging (1) | 2025.03.10 |
Java의 메모리 영역과 static의 의미 (0) | 2025.01.15 |
Java 코딩구현 심화 : 스트림,람다식 (1) | 2024.09.20 |