05. [자바] 변수의 초기화
변수의 초기화
변수를 선언하고 처음으로 값을 저장하는 것을 '변수의 초기화'라고 하는데
변수의 초기화는 경우에 따라서 필수적이기도 하고 선택적이기도 하지만
선언과 동시에 적절한 값으로 초기화하는 것이 바람직하다.
멤버변수는 초기화는 하지 않아도 자동적으로 변수타입의 기본값으로 초기화되지만
지역변수는 사용 전 반드시 초기화해야 한다
class InitTest{
int x; // 인스턴스 변수
int y = x; // 인스턴스 변수
void method1(){
int i; // 지역변수
int j = i // 에러. 지역변수를 초기화하지 않고 사용
}
}
멤버변수인 인스턴스 변수는 초기화를 해주지 않아도 알아서 기본값으로 초기화가 이루어져 사용이 가능했지만
메서드 안에 생성된 변수인 지역변수는 초기화해주지 않고 사용하자 에러가 발생했다.🤢
멤버변수(클래스변수와 인스턴스변수)와 배열의 초기화는 선택적이지만
지역변수의 초기화는 필수적이다.
각 타입의 기본값에 대한 표이다.
자료형 | 기본값 |
boolean | false |
char | '\u0000' (공백1칸) |
byte, short, int | 0 |
long | 0L |
float | 0.0f |
double | 0.0d 또는 0.0 |
참조형 변수 | null |
멤버변수의 초기화는 지역변수와 다르게 여러 방법이 있다.
👉멤버변수 초기화 방법
1. 명시적 초기화(explicit initialization)
2. 생성자(constructor)
3. 초기화 블럭(initialization block)
- 인스턴스 초기화 블럭 : 인스턴스변수를 초기화 하는데 사용.
- 클래스 초기화 블럭 : 클래스변수를 초기화 하는데 사용.
명시적 초기화(ecplicit initialization)
변수를 선언과 동시에 초기화하는 것을 명시적 초기화라고 한다.
가장 기본적이면서도 간단한 초기화 방법으로 여러 초기화 방법 충에서
가장 우선적으로 고려되어야 한다.
class Car {
int door = 4; // 기본형(primitive type) 변수의 초기화
Engine e = new Engine(); // 참조형(reference type) 변수의 초기화
}
명시적 초기화가 간단하고 명료하지만 복잡한 초기화 작업이 필요할 때는
'초기화블록(initialization block)' 또는 '생성자(constructor)'를 사용해야 한다.
초기화 블럭(initialization block)
초기화 블록에는 '클래스 초기화 블록'과 '인스턴스 초기화 블럭' 두 가지 종류가 있다.
클래스 초기화 블록은 클래스변수(static변수)의 초기화에 사용되고
인스턴스 초기화블록은 인스턴스변수의 초기화에 사용된다.
클래스 초기화 블럭 : 클래스변수(static변수)의 복잡한 초기화에 사용된다.
인스턴스 초기화 블럭 : 인스턴스변수의 복잡한 초기화에 사용된다.
인스턴스 초기화 블록은 클래스 내에 블럭{}을 만들고 그 안에 코드를 작성하기만 하면 된다.
클래스 초기화 블럭은 인스턴스 초기화 블럭 앞에 static을 붙이기만 하면 된다.
class InitBlock {
static{ /* 클래스 초기화 블럭 */ }
{/* 인스턴스 초기화 블럭 */}
}
초기화 블록 내에는 메서드와 같이 조건문, 반복문, 예외처리 구문 등을 자유롭게
사용 가능하니 초기화 작업이 복잡하여 명시적 초기화만으로는 부족한 경우에
초기화 블록을 사용하면 된다.
클래스 초기화 블록은 클래스가 메모리에 처음 로딩될 때 한번만 수행되고
인스턴스 초기화 블럭은 생성자와 같이 인스턴스를 생성할 때마다 수행된다.
생성자 보다 인스턴스 초기화 블록이 먼저 수행된다.
인스턴스 변수의 초기화는 주로 생성자를 사용하고, 인스턴스 초기화 블록은
모든 생성자에서 공통으로 수행돼야 하는 코드를 넣는 데 사용된다.
Car() {
count++ // 같은 코드 중복
sNO = count; // 같은 코드 중복
color = "white";
gearType = "auto";
}
Car(String color, String gearType) {
count++ // 같은 코드 중복
sNO = count; // 같은 코드 중복
color = "white";
gearType = "auto";
}
-----------------------------------------------
{ // 인스턴스 초기화 블럭
count++
sNO = count;
}
Car() {
color = "white";
gearType = "auto";
}
Car(String color, String gearType) {
color = "white";
gearType = "auto";
}
위와 같이 모든 생성자에서 공통으로 수행되어야 하는 코드를
인스턴스 초기화 블록에 넣어주면 코드가 보다 간결해진다.
코드의 중복 제거는 뭐다? 신뢰성을 높여 주고 오류의 발생율을 줄여준다!🙌
생성자에 대한 내용은 이미 앞선 글에 다루어 두었다.
내용이 궁금하다면 아래의 링크로 가자.
2020/12/11 - [JAVA BASE/05. OOP(객체지향 프로그래밍)] - 04. [JAVA] 생성자(constructor)
멤버변수의 초기화 시기와 순서
클래스변수의 초기화시점 : 클래스가 처음 로딩될 때 단 한번 초기화 된다.
인스턴스변수의 초기화시점 : 인스턴스가 생성될 때마다 각 인스턴스별로 초기화가 이루어진다.
클래스변수의 초기화순서 : 기본값 → 명시적초기화 → 클래스 초기화 블럭
인스턴스변수의 초기화순서 : 기본값 → 명시적초기화 → 인스턴스 초기화 블럭 → 생성자
프로그램 실행중 클래스에 대한 정보가 요구될 때, 클래스는 메모리에 로딩된다.
예를 들어 클래스 멤버를 사용했을 때, 인스턴스를 생성할 때 등이 이에 해당된다.
하지만 한번 로딩되면 또다시 로딩하지 않는다. 물론 초기화도 마찬가지 이다.
변수의 초기화가 명시적 초기화, 생성자만 있는줄 알았다🤷♂️
초기화 블럭을 처음 봤는데.
이 기능을 사용해서 여러가지 복잡한 로직을
클래스를 시작함과 동시에 사용할수 있게 되었고
생성자에 들어갔었던 공통되는 코드를
하나로 묶어 이용할수 있게 되었다🤔