병훈's Blog

[Java] 초기화 (initialized) 본문

Java

[Java] 초기화 (initialized)

thdqudgns 2022. 9. 25. 21:38

초기화 (initialized)

초기화 : 변수를 선언하고 처음으로 값을 저장하는 것

 

java에서 맨 처음 배우는 변수의 초기화는 이렇게 간단했어요.

// 메인메소드 내부의 코드라 가정

int num;    // 선언
num = 10;    // 초기화

int num_2 = 20;    // 선언과 초기화를 동시에

int i;        // 지역변수 선언만 하고, 초기화는 안 함
System.out.println(i);    //출력 -> 에러 발생

여기서 마지막 두 줄을 실행시키면 아래 에러가 납니다.

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    The local variable i may not have been initialized

==> 그 지역변수 i 는 아마 초기화 되지 않았습니다.

지역변수는 초기화하지 않고 사용하면 안 된다는 뜻이죠.


객체 안에서 변수의 초기화는 다르다는데요. 무엇이 다를까요?

Car car;            // 참조변수 선언
car = new Car();    // 인스턴스를 생성하며 참조변수 초기화 (주소 저장)

Car car_2 = new Car();    // 선언과 초기화를 동시에
class Car {
    String color;        // 색상
    String gearType;    // 변속기 종류 - auto(자동), manual(수동)
    int door;            // 문의 개수

    Car() {}
}

여기 변수들은 클래스 바로 아래에서 선언되었으므로 전역변수 입니다. 일단은 지역변수가 아니죠.

그리고 이런 전역변수들은 인스턴스가 생성될 때 초기화 되지 않았더라도 기본값이 저장됩니다.

  • 참조형에는 null이
  • 논리형에는 false가
  • 그 외에는 0이나 0.0이 저장됩니다.

ex) 사진 예

Console 창에 출력된 것을 보면,
String 타입의 color는 null로
int 타입의 door는 0으로 출력되었죠?

  1. 지역변수 는 사용 전에 꼭 초기화를 해주어야 한다!!
  2. 전역변수 (멤버변수 or 인스턴스변수 or 클래스변수)는
    각 타입의 기본값으로 자동 초기화 되므로 초기화를 생략할 수 있다.

근데 여기서 초기화가 끝난 것이 아닙니다.


멤버변수의 초기화

  1. 명시적 초기화
    변수에 값을 저장하는 코드
// 지금까지 봐왔던 기본적인 방식이에요 
int n = 10;             // 기본형 변수의 초기화 
Car car = new Car();    // 참조형 변수의 초기화
  1. 생성자를 통한 초기화
    인스턴스 생성과 동시에 생성자를 통해 초기화한다.
// 지난 시간에 배운 내용이죠 
Car(String color, String gearType, int door) { 
this.color = color; 
this.gearType = gearType; 
this.door = door; 
}
  1. 초기화 블럭을 통한 초기화
    • 인스턴스 초기화 블럭 : { }
    • 클래스 초기화 블럭 : static { }

" 어서 와. 초기화 블럭은 처음이지? "
" 초기화 방법이 왜 이렇게 많은 거야!! 순서는 어떻게 되는 거지? "

   

차근차근 알아가보자고yo


초기화 순서

class InitTest {
    static int cv = 1;    // 1-1,2 명시적 초기화
    int iv = 1;            // 2-1,2 명시적 초기화

    static { cv = 2; }    // 1-3 클래스 초기화 블럭
    { iv = 2; }            // 2-3 인스턴스 초기화 블럭

    InitTest() {        // 2-4 생성자
        iv = 3;
    }
}

1. 클래스 초기화

static이 붙은 클래스변수, 클래스 메소드, 클래스 초기화 블럭은
클래스가 로딩될 때 실행되므로 가장 먼저 실행돼요.

  1. 기본값 저장(= static 변수 선언):
    static 키워드가 붙은
    자료형(Data Type)과 변수명이 선언되는 순간,
    해당 자료형의 기본값이 저절로 저장됩니다.
  2. 명시적 초기화:
    그리고 우변의 값이 변수에 저장되는 명시적 초기화가 진행되는 것이죠.
    우변의 값이 기본값을 덮는 겁니다.
  3. 클래스 초기화 블럭:
    그 후에 클래스 초기화 블럭이 실행됩니다.

2. 인스턴스 초기화

인스턴스는 코드가 실행되고,
new로 인스턴스가 생성될 때 실행돼요.

  1. 기본값 저장(= 변수 선언):
    마찬가지로 자료형(Data Type)과 변수명이 선언되는 순간,
    해당 자료형의 기본값이 저절로 저장됩니다.
  2. 명시적 초기화:
    그리고 우변의 값이 변수에 저장되는 명시적 초기화가 진행되는 것이죠.
    우변의 값이 기본값을 덮는 겁니다.
  3. 인스턴스 초기화 블럭:
    그 후에 클래스 초기화 블럭이 실행됩니다.
    생성자보다 먼저 실행됩니다!!
  4. 생성자:
    일단 생성자는 new로 인스턴스를 생성할 때 호출되므로 static 키워드가 붙을 수 없어요.
    저는 지금까지 생성자가 가장 먼저 실행되는 줄 알았는데,
    생성자가 가장 나중에 실행됩니다.

오늘도 한 걸음 더 나아갔군요!!
화이팅입니다!

728x90
728x90

'Java' 카테고리의 다른 글

[Java] 오버라이딩 (Overriding)  (0) 2022.09.26
[Java] 상속 (Inheritance)  (0) 2022.09.26
[Java] this  (0) 2022.09.25
[Java] 생성자 (Constructor)  (0) 2022.09.25
[Java] 메소드 오버로딩 (Method Overloading)  (0) 2022.09.25