초기화
초기화란 변수를 선언하고 처음으로 값을 저장하는것을 의미한다. 이 초기화 작업은 상황에 따라 필수적이기도 하고 필수적이지 않기도 하다. 다만, 지역변수는 사용하기 전에 꼭 초기화를 해주는것이 좋다.
멤버변수의 초기화는 지역변수와 달리 여러가지 방법이 있다.
- 명시적 초기화(explicit initialization)
- 생성자(Constructor)
- 초기화 블록(Initializtion Block)
- 인스턴스 초기화 블록 : 인스턴스 변수를 생성할 때 마다 실행되는 블록
- 클래스 초기화 블록 : 클래스 변수에 대해 초기화를 수행하는 블록
명시적 초기화
명시적 초기화는 일반적인 변수선언과 똑같은 방식이다. 다른 초기화 방법들 중 가장 우선시 고려되는 방법이다.
class test{
private int count = 0;
private static int[] arr = new int[20];
}
초기화 블록
초기화 블록에는 '클래스 초기화 블록' 과 '인스턴스 초기화 블록' 두가지가 존재한다. 클래스 초기화 블록은 클래스 변수 초기화에 사용되고, 인스턴스 초기화 블록은 인스턴스 초기화에 사용된다. 각 형태는 아래와 같다. 클래스 초기화 블록은 인스턴스 초기화 블록 앞에 static을 덧붙인 형태이다
class test{
//클래스 초기화 블록
static{}
//인스턴스 초기화 블록
{}
}
클래스 초기화 블록은 클래스가 메모리에 처음 올라갈때 최초 한번만 수행되고, 인스턴스 초기화 블록은 인스턴스를 생성할 때 마다 수행된다. 인스턴스 초기화에 있어서 알아두어야 할것은 인스턴스 초기화 블록은 생성자보다 먼저 수행된다는 것이다.
인스턴스 초기화 블록은 모든 생성자에서 공통적으로 수행해야하는 코드를 넣는다. 예를 들면, 생성된 인스턴스 개수를 추가해주는 코드를 예시로 들 수 있다.
class Product{
private static int count = 0;
int serialNumber;
//인스턴스 생성자 블록 : 인스턴스가 생성될 때마다 클래스 변수 count를 ++ 한다.
{
count++;
serialNumber = count;
}
public static int returnNumber(){
return count;
}
public Product(){
System.out.println("Constructor");
}
}
class t2{
public static void main(String[] args){
Product p1 = new Product();
System.out.println(p1.returnNumber());
Product p2 = new Product();
System.out.println(p2.returnNumber());
Product p3 = new Product();
System.out.println(p3.returnNumber());
}
}
이번에는 멤버변수 초기화 시기와 순서를 알아보자
/*
*
* 클래스 초기화 블록 : 클래스 변수의 복잡한 초기화에 사용된다
* 인스턴스 초기화 블록 : 인스턴스변수의 복잡한 초기화에 사용된다.
*
* 인스턴스 초기화 블록은 단순히 클래스 내에 블록을 만들고({}) 그 안에 코드를 작성
* 클래스 초기화 블록은 인스턴스 초기화 블록 형태 앞에 static을 붙이면 된다.
*
* 클래스 초기화 블록 : 클래스가 메모리에 처음 로딩될때 한번 수행
* 인스턴스 초기화 블록 : 생성자와 같이 인스턴스를 생성할때마다 수행
* */
class BlockTest{
static {
System.out.println("static {}");
}
{
System.out.println("{}");
}
public BlockTest(){
System.out.println("생성자");
}
}
class m{
public static void main(String[] args){
BlockTest b1 = new BlockTest();
BlockTest b2 = new BlockTest();
}
}
위 코드 실행 결과를 기반으로 보면
클래스 변수는 딱 한번 실행된다. 이 시점이 바로 클래스가 메모리에 로딩된 시점이다. 인스턴스 b1,b2가 생성될 때마다, 인스턴스 초기화 블록이 실행되는것을 알 수 있다. 그리고 추가적으로 순서는 기본값 -> 명시적 초기화 -> 인스턴스 초기화 블록 -> 생성자 순으로 초기화가 된다.
이를 활용한 코드는 아래와 같다.
class Document{
static private int docCount;
static private String defaultName;
private String name;
static {
defaultName = "No title";
docCount = 0;
}
Document(){
this(defaultName + (++docCount));
}
Document(String title){
this.name = title;
System.out.println("New Document Generated : " + this.name + ".docx");
}
}
public class t3 {
public static void main(String[] args){
Document d1 = new Document();
Document d2 = new Document("test");
}
}
'Language > Java' 카테고리의 다른 글
[Java]오버라이딩(Overriding) (0) | 2021.12.28 |
---|---|
[Java]Java toString()메소드?? (0) | 2021.12.28 |
[Java]Java 문자열 보간표현식(Formatter) (0) | 2021.12.27 |
[Java]JVM메모리 구조 (0) | 2021.12.26 |
메소드 오버로딩(Method Overloading) (0) | 2019.03.05 |