Class.forName는 클래스를 메모리에 로드할 뿐인데, 왜 뭔가가 실행되나? Basic Languages/Java2016. 12. 20. 15:16
오라클 드라이버 등록시 의문이 하나 생겼다.
일반적으로 오라클 드라이버를 프레임워크를 사용하지 않고 등록하려면 다음과 같이 한다.
Class.forName("oracle.jdbc.driver.OracleDriver");
Connectiion con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE", "id", "pw");
위 두 문구는 두가지 일을 한다.
1) OracleDriver를 DriverManager가 인식하도록 함.
2) Oracle의 IP주소 및 id, pw를 이용해 접속.
근데 여기서 Class.forName은 일반적인 형태가 아니라서 좀 헷갈렸다.
가만 생각해 보면 뭔가 내가 하지도 않은 일이 자동으로 되어버린 것 같다는 느낌이 들었다.
Class.forName은 클래스 이름을 이용해서 동적으로 클래스를 메모리에 올리는 것 뿐인데, 그러면 OracleDriver라는 클래스를 이용할 수 있게 된 것까지는 이해가 간다. 근데 DriverManager랑 OracleDriver가 왜 바인딩이 된 거지???
===============
DriverManager에서 OracleDriver를 바인딩할 수 있었던 이유는 OracleDriver클래스가 static영역을 가지고 있기 때문이다.
그 static영역에서 자동으로 다음 문구를 실행한다.
java.sql.DriverManager.registerDriver(new Driver());
그렇기 때문에 메모리에 클래스를 최초로 로드할 때 드라이버매니저가 오라클드라이버를 인식 가능하게 된 것이다.
실제로 저 문구(Class.forName(...))를 빼먹으면
뒤에서 con.createStatement()를 실행할 때 에러가 난다.
'Basic Languages > Java' 카테고리의 다른 글
Collection을 Iterator로 순회하는 간단 예제 (0) | 2016.12.30 |
---|---|
Java의 Byte Stream (0) | 2016.12.19 |
Java의 인자 전달 방법 (0) | 2016.12.18 |
Java 토큰 단위로 파일 읽기(Scanner 사용) (0) | 2016.12.12 |
Java 파일 바이트 단위로 복사하기 (0) | 2016.12.12 |