* JAVA - 변수의 초기화, 멤버변수의 초기화

jodbsgh·2022년 3월 19일
0

💡"JAVA"

목록 보기
17/67

변수의 초기화

  • 변수를 선언하고 처음으로 값을 저장하는 것을 '변수의 초기화'라고 한다.
  • 멤버변수는 초기화를 하지 않아도 자동적으로 변수의 자료형에 맞는 기본값으로 초기화가 이루어지므로 초기화하지 않고 사용해도 된다.
  • 단, 지역변수는 사용하기 전에 반드시 초기화해야 한다.
class InitTest{
	int x;		//인스턴스 변수
    int y = x;	//인스턴스 변수
    
    void method()
    {
    	int i;		//지역변수
        int j = i;	//에러, 지역변수를 초기화하지 않고 사용
    }
}
  • 인스턴스 변수 x는 초기화를 해주지 않아도 자동적으로 int형의 기본값인 0 으로 초기화 되므로 'int y = x;' 같이 할 수 이다.
  • 하지만, method()의 지역변수 i는 자동적으로 초기화되지 않으므로, 초기화 되지 않은 상태에서 변수 j를 초기화 하는데 사용될 수 없다.

    멤버변수(클래스변수와 인스턴스변수)와 배열의 초기화는 선택적이지만, 지역변수의 초기화는 필수적이다.

명시적 초기화(explicit initialization)

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

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

복잡한 초기화 작업이 필요할 경우 '초기화 블럭(initialization block)' 또는 생성자를 사용해야 한다.

초기화 블럭(initialization block)

클래스 초기화 블럭 : 클래스변수의 복잡한 초기화에 사용된다.
인스턴스 초기화 블럭: 인스턴스변수의 복잡한 초기화에 사용된다.

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;
}
  • 중복을 제거하는 것은 코드의 신뢰성을 높여 줌
  • 오류의 발생가능성을 줄여 줌
예제)
class BlockTest{
	static{	//클래스 초기화 블럭
    	System.out.println("static { }");
    }
    {	//인스턴스 초기화 블럭
    	System.out.println( "{}");
    }
	public BlockTest()
    {
    	System.out.println("생성자");
    }
    public static void main(String args[])
    {
    	System.out.println("BlockTest bt = new BlockTest(); ");
        BlockTest bt = new BlockTest();
        
        System.out.println("BlockTest bt2 = new BlockTest();");
        BlockTest bt2 = new BlockTest();
    }
}

실행결과
static{}
BlocktTest bt = new BlockTest();
{ }
생성자
BlockTest bt2 = new BlockTest();
{ }
생성자

BlockTest가 메모리에 로딩될 때,

  • 클래스 초기화 블럭이 가장 먼저 수행되어 'static{}'이 화면에 출력
  • 그 다음 main 메서드가 수행되어 BlockTest 인스턴스가 생성되면서 인스턴스 초기화 블럭이 먼저 수행
  • 끝으로 생성자가 수행

클래스 초기화 블럭은 처음 메모리에 로딩될 때 한번만 수행되었지만, 인스턴스 초기화 블럭은 인스턴스가 생서오딜 때 마다 수행되었다.

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

  • 클래스변수의 초기화 시점 : 클래스가 처음 로딩될 때 단 한번 초기화된다.
  • 인스턴스변수의 초기화 시점 : 인스턴스가 생성될 때 마다 각 인스턴스별로 초기화가 이루어진다.
  • 클래스변수의 초기화 순서: 기본값 - 명시적초기화 - 클래스 초기화 블럭
  • 인스턴스변수의 초기화 순서: 기본값 - 명시적초기화 - 인스턴스 초기화 블럭 - 생성자
profile
어제 보다는 내일을, 내일 보다는 오늘을 🚀

0개의 댓글