자바의 정석 -변수의 초기화

jadive study·2022년 11월 29일
0

6 변수의 초기화

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

class InitTest {
int x; //인스턴스 변수
int y = x; //인스턴스 변수
void method(){
int i; //지역변수
int j =i;에러,지역변수를 초기화하지 않고 사용
}}

x, y는 인스턴스 변수이고,i,j는 지역변수이다. 그 중 x와 i는 선언만 하고
초기화를 하지 않았다. 그리고 y를 초기화 하는데 x를 사용하였고,j를 초기화 하는데 i를 사용하였다.
인스턴스 변수x는 초기화를 해주지 않아도 자동적으로 int형의 기본값인 0으로 초기화 되므로, 'int y = x;’와 같이 할 수 있다. x의 값이 0이므로 역시 0이 저장된다.

하지만,methodl()의 지역변수 i는 자동적으로 초기화되지 않으므로,초기화 되지 않은 상태에서 변수 j를 초기화 하는데 사용될 수 없다. 컴파일하면,에러가 발생한다.

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

► 멤버변수의 초기화 방법
1. 명시적 초기화(explicit initialization)
2. 생성자(constructor)
3. 초기화 블럭 (initialization block)

  • 인스턴스 초기화 블럭 : 인스턴스변수를 초기화 하는데 사용.
  • 클래스 초기화 블럭 : 클래스변수를 초기화 하는데 사용.

6.2 명시적 초기화(explicit initialization)

변수를 선언과 동시에 초기화하는 것을 명시적 초기화라고 한다. 가장 기본적이면서도 간
단한 초기화 방법이므로 여러 초기화 방법 중에서 가장 우선적으로 고려되어야 한다.

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

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

6.3 초기화 블럭(initialization block)

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

class InitBlock (
static { /★ 클래스 초기화블럭입니다. ★/
( /* 인스턴스 초기화블럭입니다. ★/
II ...

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


1. cv가 메모리 (method area)에 생성되고. cv에는 int형의 기본값인 0이 cv에 저장된다.
2. 그 다음에는 명시적 초기화(int cv=1)에 의해서 cv에 1이 저장된다.
3. 마지막으로 클래스 초기화 블럭 (cv=2)이 수행되어cv에는 2가 저장된다.
4. InitTest클래스의 인스턴스가 생성되면서 iv가 메모리 (heap)에 존재하게 된다.
iv 역시 ini형 변수이므로 기본값 0이 저장된다.
5. 명시적 초기화에 의해서 iv에 1이 저장되고
6. 인스턴스 초기화 블럭이 수행되어 iv에 2가 저장된다.
7. 마지막으로 생성자가 수행되어 iv에는 3이 저장된다.

profile
개발 메모창고

0개의 댓글