변수의 초기화
- 지역변수(lv)는 수동 초기화해야 함(사용 전 꼭!!!)
- 메모리는 재사용이 빈번하기 때문에(특히 메서드 안의 지역변수들) 효율적으로 메모리를 사용하기 위해서 지역변수는 0으로 초기화 하지 않고 값 위에 새로운 값을 덮어쓴다 -> 초기화
- 인스턴스 변수는 지역변수보다는 유지기간이 그나마 길기 때문에 0으로 초기화 해도 됨
class InitTest {
int x; // 인스턴스 변수(iv)
int y = x; // 인스턴스 변수(iv)
void method1() {
int i; // 지역변수
int j = i; // 에러. 지역변수를 초기화하지 않고 사용
}
}
-> 멤버변수(iv,cv)는 자동 초기화가되고 method1의지역변수(lv)은 수동 초기화해야 함
- 자동 초기화되는 것은 자료형의 기본 타입으로 초기화됨!
* 각 타입의 기본값(default value)
자료형 | 기본값 |
Boolean | false |
char | ‘\u0000’ |
byte, short, int | 0 |
long | 0L |
float | 0.0f |
double | 0.0d 또는 0.0 |
참조형 변수 | null |
멤버 변수(iv, cv)의 초기화
1) 명시적 초기화(간단 초기화)
- 대입연산자를 이용하여 초기화(선언 시)
- 변수를 선언하고 간단하고 쉬운 초기화 방법
class Car {
int door = 4; // 기본형(primitive type) 변수의 초기화
Engine e = new Engine; // 참조형(reference type) 변수의 초기화
-> 참조형 변수가 가질 수 있는 값은 null 아니면 객체주소
2) 블록 초기화 (복잡 초기화)
- 인스턴스 초기화 블록 : { 여러문장 } (iv초기화) -> 잘 사용 안 함
- 클래스 초기화 블록 : static { }(static 메서드) (cv초기화)
- 복잡한 초기화에 사용함
3) 생성자(static) (복잡 초기화)
- iv초기화, 복잡한 초기화에 사용함
멤버 변수의 초기화 순서
-> 1) 자동 초기화 2) 간단 초기화(=) 3) 복잡 초기화( { }, static { }, 생성자)
- 보통 자동 초기화(기본값으로) -> 대입연산자를 사용해서 간단 초기화!
class StaticBlockTest {
// cv 간단초기화
static int[] arr = new int[10]; // 명시적 초기화(arr->cv) 간단한 초기화라서 배열 생성만 가능
// cv 복잡초기화
static { // 클래스 초기화 블럭 - 배열 arr을 난수로 채운다.
for(int i=0; i<arr.length; i++) {
arr[i] = (int)(Math.random()*10)+1;
}
}
}
클래스 변수 초기화 시점: 클래스가 처음 로딩될 때 한 번(메모리에 올라갈 때)
인스턴스 변수 초기화 시점: 인스턴스가 생성될 때마다
-> 초기화 순서는 cv(클래스 변수) 다음에 iv(인스턴스 변수)
-> 자동 초기화(1번, 4번) -> 간단 초기화(2번, 3번) -> 복잡 초기화(5번, 6번, 7번)
class InitTest {
static int cv = 1; // 명시적 초기화(간단) -> 2번
int iv = 1; // 명시적 초기화(간단) -> 5번
static { cv = 2; } // 클래스 초기화 블럭(복잡) -> 3번
{ iv = 2; } // 인스턴스 초기화 블럭(복잡) -> 6번
InitTest() { // 생성자(복잡) -> 7번
iv = 3;
}
}
'멀티캠퍼스 풀스택 과정 > Java의 정석' 카테고리의 다른 글
자바의 정석3-2 오버라이딩, super 참조변수, super( ) 생성자 (0) | 2022.01.01 |
---|---|
자바의 정석3-1 상속(Inheritance)과 포함(composite) (0) | 2022.01.01 |
자바의 정석2-7 생성자 (생성자 this( ), 참조변수this) (0) | 2021.12.31 |
자바의 정석2-6 오버로딩(overloading) (0) | 2021.12.31 |
자바의 정석2-5 static 메서드와 instance 메서드 (0) | 2021.12.31 |