ch6-38 변수의 초기화
<변수의 초기화>
지역변수(lv)는 수동 초기화 해야함
멤버변수(iv,cv)는 자동초기화된다
지역변수(lv)는 수동 초기화 해야함
class InitTest {
int x; // 인스턴수변수(iv)
int y = x; // 인스턴스변수(iv)
void method1() {
int i; // 지역변수
int j = i; // error : 지역변수를 초기화하지 않고 사용해서
}
}
i의 모르는 값을 j의 모르는 값에 넣을려고 하니 에러난 것
수동초기화 해야하는 이유
호출 스택 메모리
계속 쌓였다가 없어졌다 한다(재사용이 빈번한 메모리)
계속 같은 공간을 여기저기서 사용한다
메소드가 호출될 때마다 이 공간을 0으로 초기화하면 성능저하됨
이를 방지하기 위해서 항상 0으로 초기화하는게 아닌 새로운 값으로 초기화한다
지역변수는 메소드가 호출되서 작업하는 동안만 존재하기에 생명 주기가 굉장히 짧다(메소드는 빨리 실행되고 제거되는게 좋다)
옛날 다른 메소드가 쓰던 값을 새로운 값으로 초기화하는데 다른 메소드가 쓰던 값을 뭔지 모르는데 그 값을 덮어쓰는거고 그래서 수동 초기화 해야만함
인스턴스 변수는 유지기간이 비교적 길어서 초기화하고 쓴다(자동초기화)
인스턴스 변수(자동초기화)
멤버변수(iv,cv)는 자동초기화된다
class InitTest {
int x; // 인스턴수변수(iv)
int y = x; // 인스턴스변수(iv)
InitTest it = new InitTest();
데이터타입 별 초기화 값
ch6-39 멤버변수의 초기화
<멤버변수의 초기화>
1.명시적 초기화(=)
2.초기화 블럭 { }
3.생성자
1.명시적 초기화(=)
대입연산자(=) 이용
간단한 초기화 방법
1)기본형(primitive type) 변수의 초기화
int door = 4;
2)참조형(reference type) 변수의 초기화
Engine e = new Engine();
참조형 변수가 가질 수 있는 값
- null or 객체주소
- 기본값은 nul
참조형은 객체를 만들어넣어줘야한다
객체를 만들어 값을 넣어주면서 초기화해야함
2.초기화 블럭
복잡한 초기화
여러문장 넣기
(여러문장이 필요하면 대입연산자로는 불가능)
- 인스턴스 초기화 블럭 : { }
- 클래스 초기화 블럭 : static { }
3.생성자
iv초기화
복잡한 초기화에 사용
멤버변수 cv, iv 초기화의 3가지 방법
1.자동초기화 : 자동
2.간단초기화 : 대입연산자 =
3.복잡초기화 : { }, static { } , 생성자
- cv 초기화에는 static { }
- iv 초기화에는 생성자. // {}도 쓰긴하나 거의안씀
위의 이미지는 명시적 초기화로 간단하게 배열 생성 및 초기화하고 초기화블럭 static {}을 사용해서 cv 복잡초기화로 배열 안에 값을 for문 이용하여 채운 것
멤버변수 초기화 시점
1.클래스 변수 초기화 시점
클래스가 처음 로딩될 때 한번(메모리에 올라갈 때)
2.인스턴스 변수 초기화 시점
인스턴스가 생성될 때 마다
멤버변수 초기화 순서
'JAVA > 자바의 정석 기초편(2020)' 카테고리의 다른 글
[자바의 정석 - 기초편] ch6-8 객체배열 (0) | 2022.02.20 |
---|---|
[자바의 정석 - 기초편] ch6-36,37 생성자 this(), 참조변수 this (0) | 2022.02.19 |
[자바의 정석 - 기초편] ch6-32~35 생성자, 기본 생성자 (0) | 2022.02.19 |
[자바의 정석 - 기초편] ch5-8,9 배열의활용(1)~(2) (0) | 2022.02.19 |
[자바의 정석 - 기초편] ch5-4,5 배열의 길이, 배열의 초기화 (0) | 2022.02.19 |