[Java] 객체지향 프로그래밍 - 클래스 내 변수 초기화

최지수·2022년 4월 15일
0

Java

목록 보기
8/27
post-thumbnail

변수의 초기화

변수를 선언하고 처음으로 값을 저장하는 것을 변수의 초기화라고 해요. 변수의 초기화는 경우에 따라 필수 또는 선택적이기도 하지만, 가능하면 선언과 동시에 적절한 값으로 초기화하는 것이 좋아요.

클래스에선 인스턴스 변수는 따로 초기화하지 않고 사용해도 되요. 자료형에 따라 적절한 값으로 초기화를 해주기 때문이에요. 하지만 지역 변수는 반드시 사용하기 전에 초기화해야 해요.

class App {
	int x;
    int y = x;
    
    void method(){
    	int i;
        int j = i;	// 런타임 에러! 지역 변수 초기화 없이 사용
    }
}

참고로 각 타입의 기본 값은 다음과 같아요

자료형기본값
booleanfalse
char'\u0000'
byte, short, ing0
long0L
float0.0f
double0.0d 또는 0.0
참조형 변수null

멤버변수 초기화 방식

멤버변수 초기화는 지역변수와 달리 여러 방법이 존재해요. 이에 대해 비교하고 설명할게요.

1. 명시적 초기화(Explicit Initialization)

변수를 선언과 동시에 초기화하는 것을 말해요.

class App{
	int a = 1, b = 2;
}

가장 간단하고 많이 쓰이지만 복잡한 초기화 작업을 위해선 '초기화 블럭'이나 생성자를 사용해야 해요.

2. 초기화 블럭(Initialization Block)

'클래스 초기화 블럭'과 '인스턴스 초기화 블럭' 두 종류가 있어요. 전자는 클래스 변수 초기화, 후자는 인스턴스 변수 초기화에 사용되요.

class App{
	static int A = 1;
    static{
    	A = 2;
        // a = 1;	// Error : 인스턴스 변수 초기화 불가
    }
    int a = 0;
    {
    	
    }
}

참고로 초기화 블럭은 여러개 만들 수 있어요. 그리고 무엇보다 제일 좋은게, 처음 클래스를 할당하고 초기화할 때 다양한 로직을 수행해서 초기화 수행도 가능해요. 심지어 final형 변수도요!


class App {
	// 이렇게 final형도 초기화가 가능하고, 블럭도 여럿 나눌 수 있어요!
   final static StringBuilder sb;
   static{
       sb = new StringBuilder();
       sb.append("a");
   }
   int i = 0;
   int a = 2;
   {
       i = 1;
       a = 2;
   }
   final static StringBuilder sb2;
   static{
       sb2 = new StringBuilder();
       sb.append("a");
   }
}

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

클래스 변수 : 클래스가 처음 로딩될 때 단 한번 초기화
인스턴스 변수 : 인스턴스가 생성될 때마다 각 인스턴스 별로 초기화
클래스 변수 초기화 순서 : 기본 값 \to 명시적 초기화 \to 클래스 초기화 블럭
인스턴스 변수 초기화 순서 : 기본 값 \to 명시적 초기화 \to 인스턴스 초기화 블럭 \to 생성자

예제를 보면 아래와 같아요.

// 초기화 순서 
// 1. 기본 값 : cv = 0
// 2. 명시적 초기화 : cv = 1
// 3. 클래스 초기화 블럭 : cv = 2
// 4. 기본값 : iv = 0, cv = 2
// 5. 명시적 초기화 : iv = 1, cv = 2
// 6. 인스턴스 초기화 블럭 : iv = 2, cv = 2
// 7. 생성자 : iv = 3, cv = 3
class App{
	static int cv = 1;
    int iv = 1;
    static{
    	cv = 2;
    }
    {
    	iv = 2;
	}
    App(){
		iv = 3;
    }
}
profile
#행복 #도전 #지속성

0개의 댓글