본문 바로가기
back-end/JAVA

19) 객체지향-변수의 초기화, 멤버변수의 초기화

by 모두의 향연 2021. 5. 26.
728x90
반응형

19) 객체지향-변수의 초기화, 멤버변수의 초기화

 

19-1) 변수의 초기화

-지역변수(lv)는 수동 초기화해야 함(꼭!!!)

지역변수 수동초기화 오류

method메서드에서 지역변수 i의 값을 모른 상태로 j에 대입하니 오류가 발생합니다.

인스턴스 변수는 직접 초기화하지 않아도 0으로 초기화됐었잖아요? 

지역변수는 꼭 직접 초기화해야 합니다.

왜 그럴까요?

호출 스택은 쌓였다가 없어졌다가 메모리가 재사용이 빈번합니다.

그럼 메서드가 호출될 때마다 0으로 호출하면 성능이 떨어져요.

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

지역변수의 경우, 메서드를 호출하는 경우에만 사용하기 때문에 짧게 쓰여요.

생명주기가 짧아요. 그런 변수를 0으로 자동 초기화시킨다? 메모리 낭비가 너무 심하죠.

그래서 덮여 쓰는 방식으로 처리하는데 i의 값을 모른 상태에서 j에 대입하니 오류가 생긴 거였죠.

 

 

-멤버 변수(iv, cv)는 자동 초기화된다

int x=0;이라고 안 써도 자동으로 0으로 초기화되죠?

멤버 변수는 자동으로 초기화됩니다.

x는 int자료형이기 때문에 0으로 초기화된 것이고, 자료형마다 초기화되는 기본값이 다릅니다.

자료형마다 다른 기본값

참조형만 null이고, 대부분 0이죠. 

 

 

19-2) 멤버변수의 초기화

1. 명시적 초기화(=)

대입 연산자를 쓰는 방식입니다. 가장 간단한 초기화 방법입니다.

class Car {

      int door = 4; //기본형 변수의 초기화
      Engine e = new Engine(); //참조형 변수의 초기화

}

참조형 변수의 초기화에는 null(기본값), 객체 주소

참조형 변수는 객체를 만들어야 초기화가 됩니다.

만약 Engine e; 이렇게만 되어있다면,

이건 참조 변수만 있는 거라 엔진만 있고 엔진 안에는 비어있는 격이 돼서 초기화가 아닙니다. 

참조형 변수 초기화는 null 넣는 것도 초기화가 맞지만, 객체를 생성해서 넣어줘야 합니다.

 

2. 초기화블럭

-(iv) 인스턴스 초기화 블럭: {}

-(cv) 클래스 초기화 블럭: static {}

복잡한 초기화 방식에서 쓰입니다. 괄호 안에 여러 문장을 넣을 수 있습니다.

static{}블럭 초기화

 

int배열에 난수를 채우고 싶은데, 배열을 생성할 땐 명시적 초기화밖에 할 수 없죠?

그래서 난수의 값으로 채우기 위해서 static{}블럭 초기화를 사용하는 것입니다.

근데 초기화할 때 무조건 블럭 초기화를 사용하면 안 되고,

일단 명시적 초기화를 사용하고 도저히 안될 때 블럭 초기화를 사용하셔야 합니다.

 

3. 생성자

iv초기화에 사용됩니다. 복잡한 초기화에 사용됩니다.

생성자 초기화

 

4. 정리

멤버변수의 초기화에는 3가지가 있어요.

(1) 자동 초기화(자동으로 0으로 초기화되는 것)
(2) 간단 초기화(명시적 초기화)
(3) 복잡 초기화(블록, static블록(cv), 생성자(iv))

 

대부분 자동으로 0으로 초기화되지만, 

값을 바꾸고 싶어서 대입 연산자를 이용하여 값을 바꾸고,

그것보다 여러 문장으로 초기화시키기 위해 복잡초기화를 사용합니다.

 

 

19-3) 멤버변수 초기화 시점

-클래스 변수 초기화 시점: 클래스가 처음 로딩될 때 단 한번(클래스가 메모리에 올라갈 때)
-인스턴스 변수 초기화 시점: 객체가 생성될 때마다

멤버변수 초기화 예제
InitTest객체생성

위 식에서 멤버변수들이 초기화되는 순서를 표로 볼게요.

멤버변수 초기화 순서

1. 클래스초기화->인스턴스 초기화

2. 자동->간단>복잡 순으로 합니다.

 

 

<정리 퀴즈>

1. 지역변수는 멤버변수와 다르게 초기화를 어떻게 해야 합니까?

수동 초기화해야 합니다.

2. 왜 수동 초기화해야 합니까?

메모리의 성능을 높이기 위해서(지역변수의 경우 메서드를 호출할 때만 사용되므로)

3. 멤버변수의 초기화 방법 크게 세 가지

자동 초기화, 간단 초기화, 복잡 초기화

4. 멤버변수 초기화 순서

클래스변수->인스턴스변수

자동초기화->간단초기화->복잡초기화

5. 복잡 초기화에는 어떤 것이 있나요?

블럭, static블럭, 생성자

 

 

 

*유튜브 남궁성 선생님의 `자바의 정석`을 참고하여 만들었습니다*
*자세히 보고 싶은 분들은 유튜브 가서 보시면 됩니다*

728x90
반응형