본문 바로가기

Java

Class.forName()의 동작 원리

자바는 JVM을 기반으로 동작합니다. main 메소드를 갖는 간단한 클래스를 만들어서 실행시키든, WAS에서 JSP나 서블릿을 실행시키든 결국 JVM위에서 동작하게 됩니다. JSP의 경우에는 먼저 WAS가 파일을 해석한 다음 자바 소스코드를 만들어 냅니다. 이것은 서블릿과 동일한 방식으로 동작하는 클래스가 됩니다.

Class 클래스는 JVM에서 동작할 클래스의 정보를 묘사하기 위한 일종의 메타 클래스입니다. 즉 JVM에 로드될 각 클래스이 정보를 담고 있는 클래스 입니다. 클래스의 이름, 멤버 필드들과 멤버 메소드, 클래스의 종류(자바의 interface는 내부적으로 클래스와 동일하게 취급합니다.)등등 많습니다.

A a = new A();라는 코드가 있다고 가정하면,


JVM은 우선 A라는 클래스가 JVM에 로드되어 있는지 알아봅니다. 로드가 안됐다면 사용가능한 클래스 로더(ClassLoader 클래스를 확장하는 클래스의 인스턴스들입니다.)를 이용하여 A 클래스를 로드하려고 할겁니다. 만약 A클래스를 찾지 못하면 ClassNotFoundException 이 발생합니다.


A 클래스가 로드되어 있다면 이제 A클래스의 인스턴스를 하나 만들고, 생성자를 호출합니다. 생성자는 내부적으로 &It;init>라고 명명된 특수한 메소드입니다. 생성자가 호출되면 인스턴스가 초기화 됩니다.


그런 다음 대입식에 의해 a라는 참조 변수가 생성된 새로운 인스턴스를 가리키게 됩니다. 이때 참조 변수 a에 의해 생성된 인스턴스의 참조 카운트가 1이 됩니다. (참조 카운트가 0이 되면 해당 인스턴스는 더이상 가리키는 참조 변수가 없는 것으로 가비지 컬렉션의 대상이 됩니다.)


위에서 봤듯, 새로운 인스턴스를 생성해 내기 위해서는 클래스의 정보가 필요합니다. 이 정보는 JVM에서 관리되고 있습니다. 위의 경우에서 보이는 것처럼 클래스 정보들도 각각을 살펴보면 모두 Class 클래스이 인스턴스들입니다. 즉 A 클래스의 정보를 가지고 있는 Class 클래스의 인스턴스가 있다는 말입니다. 결국 JVM에서 관리하고 있는 클래스 정보는 모두 Class 클래스의 인스턴스라는 말이 됩니다.


그러면 Class.forName("패키지.클래스명").newInstance();는 어떻게 동작할까요?


우선 Class 클래스이 정적 메소드 forName()에 의해 클래스의 정보를 담은 Class 클래스의 인스턴스를 얻어옵니다. 

forName() 메소드에 의해 반환된 Class 클래스의 인스턴스에는 클래스이 정보가 담겨있습니다. 이제 newInstance() 메소드를 호출하면 클래스의 인스턴스를 생성한 다음 기본 생성자를 호출해 인스턴스를 초기화하고, 생성된 인스턴스를 리턴합니다.


이 과정은 결국 패키지.클래스명 obj = new 패키지.클래스명(); 을 실행한 것과 똑같습니다. 단지 표현 방법의 차이입니다.


클래스에서 static 키워드가 사용되면 '정적'이라는 말로 표현됩니다. static키워드가 사용된 정적 멤버들은 개별적인 인스턴스 범위가 아닌 클래스 범위에서 사용됩니다. 정적 멤버는 내부적으로 클래스 정보들과 함께 관리됩니다. 개별적인 인스턴스의 상태와는 별개로 취급됩니다. 이 말은 가비지 컬렉션의 대상이 아니라는 말입니다. 


출처 : https://heavyfive.tistory.com/entry/Class-%ED%81%B4%EB%9E%98%EC%8A%A4%EC%9D%98-%EC%9A%A9%EB%8F%84



'Java' 카테고리의 다른 글

TechStudy - 01.OOP란 ?  (0) 2019.03.06
제네릭  (0) 2019.02.10
Thread란?  (0) 2019.01.04
Day 10~11. 친구관리 프로그램  (0) 2018.12.23
Day 10. 예외처리  (0) 2018.12.19