Skip to main content

Command Palette

Search for a command to run...

리플렉션 (Reflection) 이란?

Published
2 min read

리플렉션(Reflection)런타임에 클래스, 메서드, 필드 등의 메타데이터를 조회하거나 조작할 수 있는 기능을 말합니다.

자바, C#, 파이썬 등 다양한 언어에서 제공하며, 특히 자바 리플렉션 API는 스프링, 하이버네이트 같은 프레임워크의 핵심 기술로 사용됩니다.


리플렉션의 특징

  • 컴파일 타임이 아닌 런타임에 동작

  • 클래스의 구조(필드, 메서드, 생성자)에 접근 가능

  • private 멤버도 강제로 접근 가능 (setAccessible(true))


리플렉션 예시

1. 클래스 정보 조회


Class<?> clazz = Class.forName("com.example.User");

System.out.println(clazz.getName());  // 클래스 이름 출력

for (Method method : clazz.getDeclaredMethods()) {
    System.out.println(method.getName()); // 메서드 목록 출력
}

2 . 객체 생성 및 메서드 호출

java
복사편집
Class<?> clazz = Class.forName("com.example.User");

// 생성자 호출로 인스턴스 생성
Constructor<?> constructor = clazz.getConstructor(String.class);
Object user = constructor.newInstance("홍길동");

// setName 메서드를 런타임에 호출
Method setName = clazz.getMethod("setName", String.class);
setName.invoke(user, "김철수");

3. private 필드 접근


Field field = clazz.getDeclaredField("name");
field.setAccessible(true);  // private 접근 허용
field.set(user, "이몽룡");

getMethod() vs getDeclaredMethod()

리플렉션에서 메서드를 조회할 때 두 가지 메서드가 자주 혼동됩니다.

  • getMethod()

    • public 메서드만 조회 가능

    • 부모 클래스에서 상속받은 public 메서드도 포함

    • private/protected/default 메서드는 조회 불가

  • getDeclaredMethod()

    • 해당 클래스에 선언된 모든 메서드 조회 (접근 제어자 무관)

    • 상속받은 메서드는 포함되지 않음

예시 코드


class Parent {
    public void hello() {}
}

class Child extends Parent {
    private void secret() {}
}

Class<?> clazz = Child.class;

// getMethod()
Method m1 = clazz.getMethod("hello");         // 부모의 public 메서드도 가져옴
// clazz.getMethod("secret");                 // private이라 에러

// getDeclaredMethod()
Method m3 = clazz.getDeclaredMethod("secret"); // Child에 선언된 private 메서드 조회 가능
// clazz.getDeclaredMethod("hello");          // Child에 직접 선언돼야만 가능

리플렉션의 장점

  • 유연성: 코드 작성 시점에 타입을 몰라도 런타임에 동적으로 처리 가능

  • 프레임워크의 기반: 스프링 DI, AOP, 하이버네이트 ORM 매핑 등 핵심 기술에 활용

리플렉션의 단점

  • 성능 저하: 런타임 탐색/호출은 일반 메서드 호출보다 느림

  • 안전성 낮음: 컴파일 시점 타입 체크 불가 → 런타임 에러 가능성 ↑

  • 캡슐화 침해: private 멤버 접근 가능 → 잘못 사용하면 유지보수성 저하


스프링에서 리플렉션의 활용

  • @Autowired 의존성 주입

  • @Transactional AOP 프록시 생성

  • Bean 생성 시 클래스 메타데이터 스캔 및 동적 객체 생성

👉 스프링의 많은 기능이 리플렉션 기반으로 동작합니다. 런타임에 클래스 정보를 읽고 객체를 조작할 수 있는 이 기능 덕분에, 애너테이션 기반 DI와 AOP 같은 유연한 구조가 가능해집니다.


정리

  • 리플렉션은 런타임에 클래스 구조를 조회하고 객체를 조작할 수 있는 기능

  • 강력한 유연성을 제공하지만 성능 저하와 캡슐화 침해를 주의해야 함

  • 스프링, 하이버네이트 등 다양한 프레임워크의 기반 기술

More from this blog

낙관적 락(Optimistic Lock)과 비관적 락(Pessimistic Lock)

락(Lock)의 필요성 현대 애플리케이션은 대부분 동시성(Concurrency) 문제에 직면합니다. 여러 사용자나 프로세스가 동시에 같은 데이터를 수정하거나, 은행 계좌 이체와 같은 중요한 트랙잭션을 동시에 실행하는 경우가 있습니다. 이때 동시 접근을 적절히 제어하지 않으면, 데이터 불일치, 중복 처리, 시스템 오류까지 발생할 수 있습니다. 이를 방지하기 위해 락(Lock) 개념이 도입되었습니다. 락은 여러 프로세스나 스레드가 동시에 동일한 자...

Aug 22, 20253 min read

Java 프로그램이 실행되는 흐름

자바 프로그램은 단순히 .java 파일을 실행하는 것이 아니라, 컴파일 → 로드 → 실행 이라는 여러 단계를 거쳐 최종적으로 CPU 가 이해할 수 있는 기계어로 변환됩니다. 이 과정에서 JDK, JVM, JRE가 각각 어떤 역할을 하는지 이해하는 것이 중요합니다. 1. 소스 코드 작성과 컴파일 개발자는 자바 소스 파일(.java)을 작성 JDK 에 포함된 javac (Java Compiler)가 소스 코드를 컴파일 하여 JVM이 이해할 수...

Aug 21, 20252 min read

Java Collection Framework

컬렉션 프레임워크(Collection Framework)란? 자바에서 컬렉션 프레임워크란 다수의 데이터를 쉽고 효과적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스와 인터페이스 집합입니다. 즉, 데이터를 저장하는 자료구조과 데이터를 처리하는 알고리즘을 구조화하여 클래스로 구현한 것입니다. 모든 컬렉션 프레임워크는 자바의 인터페이스를 기반으로 구현됩니다. JFC(Java Collection Framework)의 도입 배경 JCF 이전에는 ...

Aug 14, 20254 min read

운영체제의 발전: 단일 프로세스에서 멀티코어까지

운영체제의 발전은 ‘CPU를 얼마나 효율적으로 활용하느냐’의 역사라고 볼 수 있습니다. 초기에는 한 번에 하나의 프로그램만 실행했지만, 점차 CPU 사용률과 사용자 경험을 높이기 위해 멀티프로그래밍, 멀티태스킹, 멀티프로세스, 멀티스레딩, 그리고 멀티코어 구조가 발전했습니다. 들어가기에 앞서 프로세스와 스레드에 대해 간단히 설명하겠습니다. 프로세스(Process) 실행 중인 프로그램으로 OS로부터 독립된 주소 공간과 자원을 할당 받음 각 ...

Aug 13, 20252 min read

Keep-Alive (HTTP Keep-Alive와 TCP Keep-Alive)

Keep-Alive는 연결(Connection)을 계속 유지하기 위한 메커니즘입니다. 네트워크에서 어떤 연결을 만들고, 요청/응답을 주고받은 후 바로 끊지 않고 일정 시간 동안 유지하면, 그 시간 안에 들어오는 추가 요청은 이미 열린 연결을 재사용할 수 있습니다. 이를 통해 매번 연결을 새로 맺는데 필요한 오버헤드(3-Way Handshake)를 줄일 수 있고, 불필요한 지연(latency)를 감소시킬 수 있습니다. 하지만 연결을 너무 오래 유...

Aug 12, 20252 min read

gaeng

22 posts