리플렉션과 정리

실행 중인 프로그램이 자기 클래스에 어떤 메서드가 있는지 물어볼 수 있을까?

리플렉션

프로그램이 자기 구조를 들여다봅니다

리플렉션(reflection)은 프로그램이 실행 중에 자신의 타입과 구조에 접근하고 동작을 바꿀 수도 있게 하는 기능입니다. 그 타입과 구조에 대한 정보가 메타데이터(metadata)입니다.

메서드 목록을 살펴보는 것이 인트로스펙션(introspection), 실행 중에 동작을 고치는 것이 인터세션(intercession)입니다.

자바의 리플렉션

객체에게 네 클래스를 묻습니다

자바는 클래스의 정보를 담은 Class 객체를 만들어 둡니다. 객체에 getClass를 부르면 그 객체의 Class 객체를 받고, Class 객체에 getMethods를 부르면 public 메서드 목록을 받습니다.

c1은 예시입니다. 교재의 예는 "hello".getClass()와 String.class입니다.

이름으로 호출하기

찾아낸 메서드를 실행까지

Class 객체의 getMethod는 이름으로 메서드를 찾아 Method 객체를 돌려줍니다. Method 객체의 invoke는 그 메서드를 실제로 실행합니다. 첫 인자가 메서드를 부를 대상 객체입니다.

C#은 Class 대신 System.Type, getClass 대신 getType, .class 대신 typeof를 씁니다. 실행 중에 코드를 만들어 내는 기능도 있고, 자바에는 없습니다.

리플렉션의 단점

들여다보는 데에도 값이 듭니다

리플렉션에는 단점이 넷 있습니다. 느리고, private으로 감춘 것까지 드러나고, 실행 전에 하는 타입 검사의 이점이 사라지고, 다른 환경으로 옮기면 실행되지 않을 수 있습니다.

타입 검사는 값의 종류가 맞는지 확인하는 일입니다. 보안 관리자(security manager)가 있는 환경에서는 리플렉션 코드가 막힐 수 있습니다.

11강을 돌아보면 ①

셋이 모여 객체지향

객체지향 프로그래밍은 추상 자료형, 상속, 동적 바인딩 셋으로 이루어집니다. 상속이 재사용과 계층을 주고, 동적 바인딩이 같은 호출을 객체마다 다르게 움직이게 합니다.

CIR은 객체의 변수 값을 줄지어 담은 칸, vtable은 메서드 코드의 위치를 모은 표입니다.

11강을 돌아보면 ②

언어마다 고른 답이 다릅니다

설계 이슈마다 언어가 고른 답이 다릅니다. 스몰토크와 루비는 순수 객체지향 언어, C++는 두 타입 체계를 가진 혼합 언어이고, 자바와 C#은 그 사이에 있습니다.

자바는 부모가 하나인 대신 인터페이스를 여럿 받을 수 있습니다.

다음 강의

12강은 여러 일을 한꺼번에 진행하는 동시성입니다

11강 끝목록으로 돌아가기