java classpath 의 정의를 통해 알게 된 것들

ClassPath 의 정의를 통해 알게 된 부분

ClassPath 는 JVM 이 런타임에 필요한 클래스와 패키지를 찾기 위한 경로를 의미한다.

자바 파일은 Compile 과정을 거쳐

(tmp.java -> Compiled -> tmp.class)

위와 같이 .class 확장자의 바이트 코드 파일로 변환된다.

이 파일에는 클래스명, 인터페이스, 필드, 메소드, 어노테이션 등 매우 많은 종류의 메타데이터들이 포함되어 있고 이는 JVM 이 해당 파일의 클래스들을 로드하고 초기화하는 것 뿐만아니라 ‘reflection’, ‘serialization’, ‘dynamic class loading’ 과 같은 런타임 동작을 수행하기 위해 필요하다.

이 개념을 보고 .class 를 코드에서 사용하는 예제를 예전에 본 기억이 있어 찾다보니 아래와 같이 발견하였는데 reflection 개념이라는 것을 알게 되었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class MyClass {
    private int myField;
    public MyClass() {
        myField = 42;
    }
    public void myMethod() {
        // Do something...
    }
}
 public class Main {
     public static void main(String[] args) {
        Class<?> clazz = MyClass.class;
        System.out.println("Class name: " + clazz.getName());
        System.out.println("Constructors: " + Arrays.toString(clazz.getConstructors()));
        System.out.println("Methods: " + Arrays.toString(clazz.getMethods()));
        System.out.println("Fields: " + Arrays.toString(clazz.getFields()));
     }
}

reflection 은 객체지향의 관점에서 그 설계 철학을 깰 수 있는 위험이 존재하므로 사용하는 데에 굉장히 주의를 해야하고 장,단점을 명확히 알고 있어야 한다고 한다. 솔직히 말해서 내가 reflection 을 적극적으로 코드에 사용할 일이 있을까 하는 생각은 들지만 (아직 자바를 잘 몰라서 그런것 일 수도)

ORM 과 같은 framework 레벨의 개발을 하는 사람들에게 이 reflection 이 어떤 의미를 가지는지는 한 번쯤 조사하고 공부해볼 만한 주제로 보인다.

comments powered by Disqus