반응형
초기화 블럭 종류
- 클레스 초기화 블럭
- 인스턴스 초기화 블럭
클레스 초기화
- 클레스가 처음 로딩될때 한번만 수행되는 블럭
- 인스턴스 변수 및 메서드에 접근 불가 (static 으로 선언된 곳은 접근 가능)
인스턴스 초기화
- 인스턴스가 생성될때마다 수행되는 블럭
- super 생성자 이후에 실행됨
- 생성자 보다 먼저 생성됨
모든 생성자의 콩통 코드를 인스턴스 초기화 블럭에 넣으면 코드가독성이 좋다.
for example)
package primitive;
/**
* 클레스 초기화 테스트
* - 클레스 초기화
* - 인스턴스 초기화
*/
public class InitializationClass {
static {
System.out.println("1.클레스 초기화");
}
{
System.out.println("2.인스턴스 초기화 블럭");
}
public InitializationClass() {
System.out.println("3. 인스턴스 초기화");
}
}
class InitializationClassTest {
public static void main(String[] args) {
InitializationClass initializationClass = new InitializationClass();
InitializationClass initializationClass1 = new InitializationClass();
InitializationClass initializationClass2 = new InitializationClass();
}
}
결과
클레스 초기화 부분은 한번만 수행되고, 인스턴스들은 생성될때마다 초기화 불럭이 실행된다.
"C:\Program Files\Java\jdk-15.0.1\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2020.2.3\lib\idea_rt.jar=58088:C:\Program Files\JetBrains\IntelliJ IDEA 2020.2.3\bin" -Dfile.encoding=UTF-8 -classpath C:\Users\Mezzomedia\git\skan.study\target\classes;C:\Users\Mezzomedia\.m2\repository\org\tmatesoft\svnkit\svnkit\1.8.7\svnkit-1.8.7.jar;C:\Users\Mezzomedia\.m2\repository\com\jcraft\jsch.agentproxy.svnkit-trilead-ssh2\0.0.7\jsch.agentproxy.svnkit-trilead-ssh2-0.0.7.jar;C:\Users\Mezzomedia\.m2\repository\com\jcraft\jsch.agentproxy.core\0.0.7\jsch.agentproxy.core-0.0.7.jar;C:\Users\Mezzomedia\.m2\repository\net\java\dev\jna\jna-platform\4.1.0\jna-platform-4.1.0.jar;C:\Users\Mezzomedia\.m2\repository\net\java\dev\jna\jna\4.1.0\jna-4.1.0.jar;C:\Users\Mezzomedia\.m2\repository\com\trilead\trilead-ssh2\1.0.0-build217\trilead-ssh2-1.0.0-build217.jar;C:\Users\Mezzomedia\.m2\repository\com\jcraft\jsch.agentproxy.connector-factory\0.0.7\jsch.agentproxy.connector-factory-0.0.7.jar;C:\Users\Mezzomedia\.m2\repository\com\jcraft\jsch.agentproxy.usocket-jna\0.0.7\jsch.agentproxy.usocket-jna-0.0.7.jar;C:\Users\Mezzomedia\.m2\repository\net\java\dev\jna\platform\3.4.0\platform-3.4.0.jar;C:\Users\Mezzomedia\.m2\repository\com\jcraft\jsch.agentproxy.usocket-nc\0.0.7\jsch.agentproxy.usocket-nc-0.0.7.jar;C:\Users\Mezzomedia\.m2\repository\com\jcraft\jsch.agentproxy.sshagent\0.0.7\jsch.agentproxy.sshagent-0.0.7.jar;C:\Users\Mezzomedia\.m2\repository\com\jcraft\jsch.agentproxy.pageant\0.0.7\jsch.agentproxy.pageant-0.0.7.jar;C:\Users\Mezzomedia\.m2\repository\de\regnis\q\sequence\sequence-library\1.0.3\sequence-library-1.0.3.jar;C:\Users\Mezzomedia\.m2\repository\org\tmatesoft\sqljet\sqljet\1.1.10\sqljet-1.1.10.jar;C:\Users\Mezzomedia\.m2\repository\org\antlr\antlr-runtime\3.4\antlr-runtime-3.4.jar;C:\Users\Mezzomedia\.m2\repository\org\quartz-scheduler\quartz\2.3.2\quartz-2.3.2.jar;C:\Users\Mezzomedia\.m2\repository\com\mchange\c3p0\0.9.5.4\c3p0-0.9.5.4.jar;C:\Users\Mezzomedia\.m2\repository\com\mchange\mchange-commons-java\0.2.15\mchange-commons-java-0.2.15.jar;C:\Users\Mezzomedia\.m2\repository\com\zaxxer\HikariCP-java7\2.4.13\HikariCP-java7-2.4.13.jar;C:\Users\Mezzomedia\.m2\repository\org\slf4j\slf4j-api\1.7.7\slf4j-api-1.7.7.jar primitive.InitializationClassTest
1.클레스 초기화
2.인스턴스 초기화 블럭
3. 인스턴스 초기화
2.인스턴스 초기화 블럭
3. 인스턴스 초기화
2.인스턴스 초기화 블럭
3. 인스턴스 초기화
언제 사용할까 ?
개발하면서 , 단한번만 초기화 되어야 하는 경우와. 중복된 코드 수행등 모든 생성자에 공통으로 수행해야 하는 문장이 있어야할때 초기화 블럭을 이용하면 중복코드를 줄이고 가독성을 높일 수 있다.
이전에 서버의 성능이 좋치 않았을때는 메모리 효율관리 관점으로도 바라보지 않았을까 생각한다.
the below example
package primitive;
public class InitializationClass {
String DATA;
static String class_data;
static {
class_data = "1.클레스 초기화 - 1";
String class_data_2 = "1.클레스 초기화-2";
System.out.println(class_data);
System.out.println(class_data_2);
}
{
DATA = "2.인스턴스 데이터 최기화";
System.out.println(DATA);
this.methodTest();
}
public InitializationClass() {
System.out.println("3. 인스턴스 초기화");
}
public void methodTest() {
System.out.println("call methodTest");
}
}
class InitializationClassTest {
public static void main(String[] args) {
InitializationClass initializationClass = new InitializationClass();
InitializationClass initializationClass1 = new InitializationClass();
InitializationClass initializationClass2 = new InitializationClass();
System.out.println("-----------------------------------------------------");
System.out.println(InitializationClass.class_data); // 멤버필드 값 참조 가능.
//System.out.println(InitializationClass.class_data_2); // 접근불가
}
}
결과
1.클레스 초기화 - 1
1.클레스 초기화-2
2.인스턴스 데이터 최기화
call methodTest
3. 인스턴스 초기화
2.인스턴스 데이터 최기화
call methodTest
3. 인스턴스 초기화
2.인스턴스 데이터 최기화
call methodTest
3. 인스턴스 초기화
-----------------------------------------------------
맴버 필드값 참조 가능 = 1.클레스 초기화(상수값) - 1
반응형
'JAVA' 카테고리의 다른 글
async/sync & blocking/ non-blocking (동기/비동기 & 블로킹/논블로킹) (1) | 2022.11.28 |
---|---|
java final 의 의미, 언제 사용할까? (0) | 2021.06.09 |
java URL stream meta data 추출 (0) | 2021.06.09 |
java generic 사용법 (0) | 2021.06.01 |
java Byte[] 문자열 변환 및 복원 (0) | 2021.06.01 |