Object와 Reflection

유수민·2022년 7월 10일
0

지식창고

목록 보기
6/64
post-thumbnail
post-custom-banner

📌자바는 왜 모든 클래스가 Object를 상속 받는가?

  1. 클래스가 가져야 할 공통적인 특성을 정의하기 위해 .
  2. 다형성을 이용하여 어떤 타입의 객체든 다룰 수 있게 하기 위해
  3. 클래스가 공통적으로 필요로 하는 기능들을 얻기 위해

📌자바의 어노테이션은, 자바의 어떤 기능을 통해서 동작할까?

📖리플렉션

리플렉션은 구체적인 클래스 타입을 알지 못해도, 그 클래스의 메소드, 타입, 변수들에 접근할 수 있도록 해주는 자바 API이다. 프로그램이 동적으로 소스 코드를 해석하여 클래스의 정보를 분석해 내는 기술이다.

📚첫번째 의문점 : 리플렉션은 언제 어디에 쓰이는가?

1) 자동완성 기능
이클립스(Eclipse)나 인텔리제이(Intellij) 같은 IDE(Integrated development environment)로 개발을 할 때, 자동완성기능 → 클래스의 메소드를 자동으로 불러와준다.

2) JDBC를 이용한 데이터베이스 연결시

자바 가상머신이 동작을 시작하고, 코드가 실행되기 전까지는 어떠한 JDBC의 드라이버가 사용이 될지 알 수 없기 때문에, 우선적으로 데이터베이스에 연결하기 위해서는 알맞은 드라이버를 로드해야한다.

Class.forName()을 통해 드라이버가 로드되면 그 후 getConnection()이라는 메서드를 이용하여 연결할 수 있게 된다.

3) 스프링 어노테이션

Spring에서 개발할 때, 개발자가 Bean Factory에 해당 클래스들을 알려준 적이 없어도 @Controller, @Service, @Repository 등의 어노테이션만 붙이면, Bean Factory에서 알아서 해당 어노테이션이 붙은 클래스를 생성하고 관리해준다.
→ 컴파일 이후 런타임에 해당 어노테이션이 붙은 클래스들을 탐색하고 발견한다면, 리플렉션을 통해 해당 클래스의 인스턴스를 생성하고 필요한 필드를 주입하여 Bean Factory에 저장해둔다.

또한, 의존성 주입 (Dependency Injection)을 위해 @Autowired 을 사용하는 것과 URL을 매핑하기 위한 @RequestMapping 어노테이션을 사용하는 것도 리플렉션의 사용 예시이다.

4) 자바 코드를 동적 언어처럼 사용하려 하는 경우
5) 코드 작성 시점 이후에 작성될 함수나, 타입에 대한 코드를 작성해야 할 경우

📚두번째 의문점 : 내부에서 어떻게 작동하지?

컴파일러에 의해 '.java' 소스 파일은 '.class' 바이트 코드로 변환이 되고, 클래스 로더에 의해 Runtime Data Area에 메모리를 할당해주고 있다. Runtime Data Area에는 Method Area(Class data존재), 힙, 스택, PC 레지스터, Native Method Stack이 존재한다.
Method Area에는 Static으로 선언된 변수들을 포함하여 Class 레벨의 모든 데이터가 저장된다. Reflection API는 이 정보를 활용한다. 그래서 클래스 이름만 알고 있다면 언제든 static 영역을 뒤져서 정보를 가져올 수 있는 것이다.

📖리플렉션의 특징

메소드를 일반적으로 호출하는 경우엔 컴파일 시점에서 올바른 메소드를 호출하는지 확인이 가능한데 리플렉션으로는 런타임 시점에나 확인할 수 있다. 즉, 코딩하면서 바로바로 에러를 확인 할 수 없다. 리플렉션으로 호출할 경우, 동적으로 클래스를 로드하는 등의 선행절차가 따르고 일반 메소드와 달리 JVM이 미리 최적화하지 못하는 등의 이유로 성능에서 조금 뒤쳐진다.

profile
배우는 것이 즐겁다!
post-custom-banner

0개의 댓글