[Java] Java의 정석 정리 (초기화)

송병훈·2022년 9월 24일
0

자바의 정석

목록 보기
4/15
post-thumbnail

지금까지

에 대해서 알아봤죠.


초기화 (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();	// 참조형 변수의 초기화

    변수에 값을 저장하는 코드

  2. 생성자를 통한 초기화

    // 지난 시간에 배운 내용이죠
    Car(String color, String gearType, int door) {
        this.color    = color;
        this.gearType = gearType;
        this.door     = door;
    }

    인스턴스 생성과 동시에 생성자를 통해 초기화한다.

  3. 초기화 블럭을 통한 초기화
    - 인스턴스 초기화 블럭 : { }
    - 클래스 초기화 블럭 : static { }

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

차근차근 알아가보자고.

초기화 순서

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 키워드가 붙을 수 없어요.
    저는 지금까지 생성자가 가장 먼저 실행되는 줄 알았는데,
    생성자가 가장 나중에 실행됩니다.


오늘도 한 걸음 더 나아갔군요!!
축하드려요. 화이팅입니다!

profile
성실하고 꼼꼼하게

0개의 댓글