Nellie's Blog

[TIL-221212월] 항해99 29일차 (리플렉션) 본문

회고록

[TIL-221212월] 항해99 29일차 (리플렉션)

Nellie Kim 2022. 12. 12. 23:43
728x90

배운점

리플렉션

리플렉션은 구체적인 클래스 타입을 알지 못해도, 그 클래스의 메소드, 타입, 변수들에 접근할 수 있도록 해주는 자바 API

자바는 정적인 언어라 부족한 부분이 많은데 이 동적인 문제를 해결하기 위해서 리플렉션을 사용한다.

  • 정적 언어: 컴파일 시점에 타입을 결정 ex) Java, C, C++ 등..
  • 동적 언어: 런타임 시점에 타입을 결정 ex) Javascript, Python, Ruby 등..

리플렉션은 애플리케이션 개발에서보다는 프레임워크, 라이브러리에서 많이 사용된다.
프레임워크, 라이브러리는 사용하는 사람이 어떤 클래스를 만들지 모른다.

이럴 때 동적으로 해결해주기 위해서 리플렉션을 사용한다.


대표적인 사용 예로는 스프링의 DI(dpendency injection), Proxy, ModelMapper 등

 

리플렉션 API를 통해 런타임 중, 클래스 정보에 접근하여 클래스를 원하는 대로 조작할 수 있다.

심지어 private 접근 제어자로 선언한 필드나 메소드까지 조작이 가능하다.

객체 지향 설계에서 중요한 캡슐화가 깨지므로 사용하면 안 될 기술처럼 보인다.

규모가 작은 콘솔 단계에서는 개발자가 충분히 컴파일 시점에 프로그램에서 사용될 객체와 의존 관계를 모두 파악할 수 있다.

하지만 프레임워크와 같이 큰 규모의 개발 단계에서는 수많은 객체와 의존 관계를 파악하기 어렵다.

이때 리플렉션을 사용하면 동적으로 클래스를 만들어서 의존 관계를 맺어줄 수 있다.

 

가령, Spring의 Bean Factory를 보면, @Controller, @Service, @Repository 등의 어노테이션만 붙이면 Bean Factory에서 알아서 해당 어노테이션이 붙은 클래스를 생성하고 관리해 주는 것을 알 수 있다.

 

개발자는 Bean Factory에 해당 클래스를 알려준 적이 없는데, 이것이 가능한 이유는 바로 리플렉션 덕분이다!!

 

런타임에 해당 어노테이션이 붙은 클래스를 탐색하고 발견한다면, 리플렉션을 통해 해당 클래스의 인스턴스를 생성하고 필요한 필드를 주입하여 Bean Factory에 저장하는 식으로 사용이 된다.

물론, 캡슐화를 저해하므로 꼭 필요한 상황에서만 사용하는 것이 좋다.

 

 

 

느낀점

며칠 슬럼프가 왔었다. 며칠 공부 안하다가 하니까 또 재밌는 것 같다.

스프링 부트 심화주차에 들어왔다. 나는 팀원 5명 중에 스프링 시큐리티 부분을 맡았다. 공부를 하는데 백기선님 왈 스프링보다 훨씬 어렵다고 한다. ㅜㅜ 

정말 보니까 낯설고 어려운 것 같다. 그래도 화이팅하자!

 

 

 

 

https://steady-coding.tistory.com/609

https://dublin-java.tistory.com/53