Class.forName() 의 동작원리

이정연·2023년 8월 8일

자바기초

목록 보기
22/25

예외처리에 대한 예제를 공부하다가 Class.forName() 메서드를 보게되었는데, 이것이 어떻게 동작하는 지에 대해 찾아보게 되었다.

다음 예제는 main메서드에서 throws 키워드를 이용하여 예외를 넘기는 것이다.

public class ThrowExceptionTest {

    public static void main(String[] args) {
        try {
            throwException();
        } catch (ClassNotFoundException e) {
            System.out.println(e.getMessage()); <----------e.tostring()
        }
    }

    static void throwException() throws ClassNotFoundException, NullPointerException {
        Class.forName("j");
    }
}

//출력값
j

이경우 자바 JVM이 최종적으로 예외의 내용을 콘솔에 출력하여 예외처리를 수행한다.
출력값의 경우 e.getMessage() 말고 e.tostring() 을 이용하면 왜 그 에러가 발생했는지에 대한 이유도 같이 출력되는 것을 볼 수 있다.

위 코드의 경우 throws 키워드를 사용하여 해당 예외를 발생한 메서드 내에서 처리하지 않고 메서드를 호출한 곳으로 떠넘기고있다.
따라서 catch 로ClassNotFoundException을 호출한 main메서드가 이 책임을 가진다.

여기서 Class.forName()은 어떤 역할을 하는 것인가?

Class.forName()은 JVM에게 해당 클래스의 정보를 로드한다.

  • forName()메서드는 Class 클래스의 메서드로 써 x라는 이름의 클래스를 초기화해준다. 그리고 Class 클래스의 오브젝트를 리턴해준다.

  • 이 말이 조금헷갈릴 수 있어서 부가설명을 하자면, 우리가 생성하는 모든 클래스 들은 Class 클래스에서 관리된다. 따라서 Class.forName("클래스 이름")을 하게되면 해당되는 이름을 가진 클래스를 Class 클래스에서 찾아서 리턴해주는것이다.

  • 만약 해당 이름의 클래스가 존재하지 않는다면 다음 오류를 리턴하게된다 ClassNotFoundException

  • 따라서 위의 예제를 조금 고쳐서 실행해보면

try {
            throwException();
        } catch (ClassNotFoundException e) {
            System.out.println(e.getMessage()); <----------e.tostring()
        }
  • 위에서 e.getMessage()e.tostring() 으로 바꿔 실행해보면 다음과 같은 메세지가 나온다. java.lang.ClassNotFoundException: j
  • 이 말의 뜻은 j라는 이름을 가진 클래스를 찾지못했다 라는 뜻이다.
  • e.getMessage()를 하면 문제가 되는 원인만 출력된다.

“j” 라는 이름을 가진 메서드는 만들지 않았기에 ClassNotFoundException이 일어난다 -> throws로 넘겨줌

profile
반갑습니다.

0개의 댓글