JAVA [JAVA] 리플렉션(Reflection) 이란? 미로그 2024. 8. 24. 22:39 리플렉션(Reflection) 이란? 리플렉션은 힙 영역에 로드된 Class 타입의 객체를 통해, 원하는 클래스의 인스턴스를 생성할 수 있도록 지원하고, 인스턴스의 필드와 메소드를 접근 제어자와 상관 없이 사용할 수 있도록 지원하는 API이다. 여기서 로드된 클래스라고 함은, JVM의 클래스 로더에서 클래스 파일에 대한 로딩을 완료한 후, 해당 클래스의 정보를 담은 Class 타입의 객체를 생성하여 메모리의 힙 영역에 저장해 둔 것을 의미한다. 리플렉션의 장점? 런타임 시점에서 클래스의 인스턴스를 생성하고, 접근 제어자와 관계 없이 필드와 메소드에 접근하여 필요한 작업을 수행할 수 있는 유연성을 가지고 있다. 리플렉션의 단점? 캡슐화를 저해한다. 런타임 시점에서 인스턴스를 생성하므로 컴파일 시점에서 해당 타입을 체크할 수 없다. 런타임 시점에서 인스턴스를 생성하므로 구체적인 동작 흐름을 파악하기 어렵다. 단순히 필드 및 메소드를 접근할 때보다 리플렉션을 사용하여 접근할 때 성능이 느리다. (모든 상황에서 성능이 느리지는 않음.) 리플렉션은 언제 사용하는가? 리플렉션 API를 통해 런타임 중, 클래스 정보에 접근하여 클래스를 원하는 대로 조작할 수 있다. (심지어 private 접근 제어자로 선언한 필드나 메소드까지 조작이 가능하다. 객체 지향 설계에서 중요한 캡슐화가 깨지므로 사용하면 안 될 기술처럼 보인다.) 프레임워크와 같이 큰 규모의 개발 단계에서는 수많은 객체와 의존 관계를 파악하기 어렵다. 이때 리플렉션을 사용하면 동적으로 클래스를 만들어서 의존 관계를 맺어줄 수 있다. 가령, Spring의 Bean Factory를 보면, @Controller, @Service, @Repository 등의 어노테이션만 붙이면 Bean Factory에서 알아서 해당 어노테이션이 붙은 클래스를 생성하고 관리해 주는 것을 알 수 있다. 개발자는 Bean Factory에 해당 클래스를 알려준 적이 없는데, 이것이 가능한 이유는 바로 리플렉션 덕분이다. 런타임에 해당 어노테이션이 붙은 클래스를 탐색하고 발견한다면, 리플렉션을 통해 해당 클래스의 인스턴스를 생성하고 필요한 필드를 주입하여 Bean Factory에 저장하는 식으로 사용이 된다. 물론, 위에서 말했듯 캡슐화를 저해하므로 꼭 필요한 상황에서만 사용하는 것이 좋다. Reference https://jeongkyun-it.tistory.com/225 https://steady-coding.tistory.com/609 공유하기 게시글 관리 MI_Log 'JAVA' 카테고리의 다른 글 [JAVA] 제너릭이란? (0) 2024.08.24 [JAVA] Inner Class 란?(내부 클래스) (0) 2024.07.30 [JAVA] Spring 어노테이션 @SuppressWarnings 이란? (0) 2024.07.30 [JAVA] Map을 구현하는 클래스 종류 (0) 2024.05.19 [JAVA] MAP과 HASH MAP의 차이? (0) 2024.05.19 'JAVA' Related Articles [JAVA] 제너릭이란? [JAVA] Inner Class 란?(내부 클래스) [JAVA] Spring 어노테이션 @SuppressWarnings 이란? [JAVA] Map을 구현하는 클래스 종류