[Java] 객체지향 프로그래밍 - 클래스 내 변수 초기화
변수의 초기화
변수를 선언하고 처음으로 값을 저장하는 것을 변수의 초기화
라고 해요. 변수의 초기화는 경우에 따라 필수 또는 선택적이기도 하지만, 가능하면 선언과 동시에 적절한 값으로 초기화하는 것이 좋아요.
클래스에선 인스턴스 변수는 따로 초기화하지 않고 사용해도 되요. 자료형에 따라 적절한 값으로 초기화를 해주기 때문이에요. 하지만 지역 변수는 반드시 사용하기 전에 초기화해야 해요.
class App {
int x;
int y = x;
void method(){
int i;
int j = i; // 런타임 에러! 지역 변수 초기화 없이 사용
}
}
참고로 각 타입의 기본 값은 다음과 같아요
자료형 | 기본값 |
---|---|
boolean | false |
char | '\u0000' |
byte, short, ing | 0 |
long | 0L |
float | 0.0f |
double | 0.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");
}
}
멤버변수의 초기화 시기와 순서
클래스 변수 : 클래스가 처음 로딩될 때 단 한번 초기화
인스턴스 변수 : 인스턴스가 생성될 때마다 각 인스턴스 별로 초기화
클래스 변수 초기화 순서 : 기본 값 명시적 초기화 클래스 초기화 블럭
인스턴스 변수 초기화 순서 : 기본 값 명시적 초기화 인스턴스 초기화 블럭 생성자
예제를 보면 아래와 같아요.
// 초기화 순서
// 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;
}
}
Author And Source
이 문제에 관하여([Java] 객체지향 프로그래밍 - 클래스 내 변수 초기화), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@redgem92/Java-객체지향-프로그래밍-클래스-내-변수-초기화저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)