본문 바로가기
프로그래밍 언어/자바의 정석 기초편

자바의 정석 기초편 ch6-38~41 변수의 초기화, 멤버변수의 초기화

by life grow 2022. 8. 3.

6-38 변수의 초기화

 

i의 값이 뭔지 모르는데 이 i를 j에 넣으려고 하니까 오류가 생김

왜 i의 값을 모르냐면 호출스택은 계속 쌓이고 사라지고를 반복함

그래서 호출스택은 재사용이 빈번한 메모리다.

 

재사용이 빈번한 메모리의 뜻은 아주 짧은 시간 동안 같은 메모리 공간을

다른 메서드가 썼다가 해지했다가 이렇게  여러 메서드가 같은 공간을 쓰고 또 쓰고 하는 것이다.

메서드가 호출될 때마다 이 메모리 공간을 0으로 초기화하면 성능이 떨어진다.

성능을 높이려고 항상 0으로 초기화하지 않고 새로운 값으로 덮어쓰는 방식으로 처리한다.

다른 메서드가 쓰는 값으로 덮어쓰는데  그 값을 모른다.

그래서 수동 초기화하게 돼 있는 것이다.

 

지역변수는 메서드가 호출돼서 작업하는 동안만 존재하기 때문에 생명주기가 짧다. 

메서드는 빨리 실행하고 빨리 제거되어야 하니까

그래서 항상 새로운 값으로 덮어쓴다. < 그게 지역변수 초기화다.

 

인스턴스 변수는 지역변수에 비해 유지기간이 길다.

그래서 초기화하고 써도 괜찮다. 자동 초기화된다.

 

자동 초기화를 하는 이유는 객체는 여러 변수들을 묶어놓은 것이다.

그 변수들을 우리가 다 0으로 수동 초기화하려면 너무 많다.

그래서 자동으로 초기화해준다.

 

1. 지역변수는 수동 초기화해야 함(사용 전에 꼭)

2. 멤버변수(iv, cv)는 자동 초기화된다.(기본값으로)

(기본값 표는 오른쪽에 표로 되어 있다.)

 

지역변수 i에 뭔지 모르는 값이 들어있다.

다른 메서드가 쓰는 값.

그 값을 j에 넣을 수 없게 막은 것이다.

 

6-39 멤버변수의 초기화

 

1. 명시적 초기화(대입 연산자 사용해서 초기화) < 간단한 초기화

참조형 변수가 가질 수 있는 값은 null(기본값), 객체주소를 가질 수 있다.

 

사실 null은 초기화가 아니다.

Engine e = null이라고 한다면 엔진이 없는 셈이다.

Engine e = new Engine(); 기본적으로 이렇게 초기화해주는 게 맞다.

실제로 객체를 생성해서 넣어줘야 한다.

 

2. 초기화 블럭 < 복잡한 초기화

 

인스턴스 초기화 블럭: {}  < iv (잘 안 씀)

클래스 초기화 블럭: static {}  < cv

블럭(괄호) 안에 여러 문장을 넣을 수 있다.

 

3. 생성자 < iv 초기화. 복잡한 초기화

 

cv, iv 초기화 (3가지가 있다.)

1. 자동 초기화: 0으로 자동 초기화

2. 간단 초기화: =(대입 연산자)

3. 복잡 초기화: 

{} < 거의 안 쓴다.

static {} < cv일 때

생성자  <iv일 때

 

처음에 0으로 초기화했다가 대입 연산 있으면 그걸 처리하고

복잡한 초기화를 한다.

 

 

클래스 변수 초기화 시점: 클래스가 처음 로딩될 때 단 한번

인스턴스 변수 초기화 시점: 인스턴스가 생성될 때마다

초기화 순서: 1. 먼저 cv가 초기화되고  그다음 iv가 초기화된다. 

                     2. 자동 > 간단 > 복잡

 

여기서 객체를 또 만들면 클래스 초기화의 1,2,3은 실행되지 않는다.

처음 한 번만 초기화되니까

대신 iv는 4~7 부분을 반복한다.

 

6장의 핵심 내용들을 요약해서 적고 외우자!

그럼 6장 전체의 틀이 잡힌다.