본문 바로가기
JAVA

JDBC - Class.forName()

by Big Sun 2022. 7. 17.
728x90

JDBC란 자바에서 제공하는 데이터베이스와 연결하여 데이터를 주고 받을 수 있도록 하는 인터페이스이다.

 

 

아래의 코드에서 forName()메소드와 getConnection()메소드가 어떤 의미를 지닌 건 지 알아보도록 하겠다.

public static Connection getConnection() {
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			// Driver 클래스 로드
			return DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521/XEPDB1","mytest","mytest");
		}catch(Exception e) {
			e.printStackTrace();
		}
		return null;
	}

Class.forName()에서 알 수 있는 것은 Class라는 class가 있고 이 class는 forName()이라는 static 메소드를 가지고 있다는 것을 유추할 수 있습니다.  어떤 원리로 동작하는 걸까요?

 

 

 

 

자바11 api 문서이다. 

public static Class<?> forName​(String className) throws ClassNotFoundException
Returns the Class object associated with the class or interface with the given string name. Invoking this method is equivalent to:
Class.forName(className, true, currentLoader)
where currentLoader denotes the defining class loader of the current class.

For example, the following code fragment returns the runtime Class descriptor for the class named java.lang.Thread:

Class t = Class.forName("java.lang.Thread")

A call to forName("X") causes the class named X to be initialized.

Class (Java SE 11 & JDK 11 ) (oracle.com)

 

 

 

[Java] JDBC에서 Class.forName과 클래스 로딩에 대해 알아보기 (tistory.com)

 

[Java] JDBC에서 Class.forName과 클래스 로딩에 대해 알아보기

지난 포스팅에서 Java Reflection에 대해 다뤘습니다. JDBC를 사용할 때 쓰이는 Class.forName 역시 Java Reflection에서 제공하는 기능 중에 하나입니다. JDBC 를 사용하여 DB에 접근하기 위해서는 제일 먼저 드

limdevbasic.tistory.com

 

위 블로그와 문서를 참고한 결과

 

 

forName()메소드는 class 객체를 반환하고

Oracle DMMS에 접근할 수 있는 JDBC Driver 클래스가 클래스 로더에 의해 JVM에 로드된다는 것을 알 수 있습니다.

하지만, 여기서 또 한가지 의문이 듭니다.

 

Class.forName()은 인스턴스를 리턴한다. 하지만 인스턴스를 참조하는 참조변수가 없다.

그렇다면, 참조 카운트가 0이되어 가비지 컬렉션의 대상이 될 텐데 어떻게 사용할 수 있을까?

 

이는 forName()메소드가 static이라는 것이 이유이다.

static 블럭은 클래스가 로딩된 직후 어떤 생성자보다도 먼저 실행되는 코드이다.

따라서, 가비지 콜렉터의 대상이 되기 전에 먼저 인스턴스 생성과 초기화가 이루어져 우리가 사용할 수 있는 것이다.

 

 

참고) 클래스를 인스턴스화하는 과정

Bird bird = new Bird();

위의 코드가 호출되면 JVM은 Bird라는 클래스가 JVM에 로드되어 있는 지를 찾는다.

로드 되어있지 않다면, ClassLoader 클래스(이를 상속받은 클래스등)을 이용하여 Bird 클래스를 로드하려고 한다.

만약, 로드에 실패한다면, ClassNotFoundExeption이 발생한다.

 

로드 될경우에 Bird 클래스는 인스턴스를 하나 만들고 생성자를 호출한다.

생성자는 인스턴스를 초기화한다.

그리고, 참조변수 bird가 생성된 인스턴스를 가리킨다. 이때 해당 인스턴스의 참조 카운트가 1이된다.

(참조 카운트가 0이라면 가비지 컬렉터의 대상이 된다.)

 

 

 

 

 

728x90