본문 바로가기
공부/자바

변수의 초기화

by xladmt 2024. 5. 29.

변수의 초기화

멤버변수는 초기화를 하지 않아도 자동적으로 변수의 자료형에 맞는 기본값으로 초기화가 이루어지므로 초기화하지 않고 사용해도 되지만, 지역변수는 사용하지 전에 반드시 초기화해야 한다.

 

*각 타입의 기본값

자료형 기본값
boolean false
char '\u000'
byte, short, int 0
long 0L
float 0.0f
double 0.0d 또는 0.0
참조형 변수 null
String null

 

멤버변수의 초기화 방법

1. 명시적 초기화

변수를 선언과 동시에 초기화하는 것을 명시적 초기화라고 한다. 

class Car {
    int door = 4; 			 // 기본형(primitive type) 변수의 초기화
    Engine e = new Engine(); // 참조형(reference type) 변수의 초기화
}

명시적 초기화가 간단하고 명료하긴 하지만, 보다 복잡한 초기화 작업이 필요할 때는 '초기화 블럭(initialization block)' 또는 '생성자'를 사용해야 한다.

 

2. 초기화 블럭

  • 클래스 초기화 블럭 : 클래스가 메모리에 처음 로딩될 때 한 번만 수행
  • 인스턴스 초기화 블럭 : 생성자와 같이 인스턴스를 생성할 때 마다 수행
    • 생성자보다 인스턴스 초기화 블럭이 먼저 수행된다는 사실!
class InitBlock {
    static {  /* 클래스 초기화 블럭 입니다.*/   }
    { /* 인스턴스 초기화 블럭 입니다.*/  } 
}

 

코드로 이해하기

Car(){
    count++;             //
    serialNo = count;    //
    color = "White";
    gearType = "Auto";
}

Car(String color, String gearType){
    count++;             //
    serialNo = count;    //
    this.color = color;
    this.gearType = gearType;
}

 

위에 생성자에 공통으로 수행되어야 하는 문장 두 줄이 중복되는 것을 알 수 있다. 이것을 인터턴스 초기화 블럭으로 빼주면 다음과 같이 작성할 수 있다.

{
    count++;             // 인스턴스 초기화 블럭
    serialNo = count;    //
}	
Car(){
    color = "White";
    gearType = "Auto";
}

Car(String color, String gearType){
    this.color = color;
    this.gearType = gearType;
}

 

 

멤버변수의 초기화 시기와 순서

  • 클래스 변수의 초기화 시점 : 클래스가 처음 로딩될 때 단 한 번 초기화 된다.
  • 인스턴스 변수의 초기화 시점 : 인스턴스가 생성될 때마다 각 인스턴스 별로 초기화가 이루어진다.
  • 클래스 변수의 초기화 순서  기본값 -> 명시적 초기화 -> 클래스 초기화 블럭
  • 인스턴스 변수의 초기화 순서  기본값 -> 명시적 초기화 -> 인스턴스 초기화 블럭 -> 생성자

 

아래 코드에서 클래스(cv)초기화와 인스턴스(iv) 초기화가 어떤 순서로 되는지 생각해보자!

class InitTest{
    static int cv = 1;
    int iv = 1;
    static { cv=2; }    // 클래스 초기화 블럭
    { iv = 2; }         // 인스턴스 초기화 블럭
    InitTest() {        // 생성자
    	iv = 3;
    }
}

 

 

[참고]

Java의 정석 3판 (남궁성 저)

'공부 > 자바' 카테고리의 다른 글

오버라이딩(overriding)  (0) 2024.05.31
상속 & 클래스 간의 관계  (0) 2024.05.30
생성자(Constructor)  (0) 2024.05.29
오버로딩(overloading)  (0) 2024.05.29
객체 지향 프로그래밍(OOP)  (0) 2024.05.28