지금까지
에 대해서 알아봤죠.
- 초기화 : 변수를 선언하고 처음으로 값을 저장하는 것
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() {}
}
여기 변수들은 클래스 바로 아래에서 선언되었으므로 전역변수 입니다. 일단은 지역변수가 아니죠.
그리고 이런 전역변수들은 인스턴스가 생성될 때 초기화 되지 않았더라도 기본값이 저장됩니다.
ex) 사진 예
Console 창에 출력된 것을 보면,
String 타입의 color는 null로
int 타입의 door는 0으로 출력되었죠?
- 지역변수 는 사용 전에 꼭 초기화를 해주어야 한다!!
- 전역변수 (멤버변수 or 인스턴스변수 or 클래스변수)는
각 타입의 기본값으로 자동 초기화 되므로 초기화를 생략할 수 있다.
근데 여기서 초기화가 끝난 것이 아닙니다.
명시적 초기화
// 지금까지 봐왔던 기본적인 방식이에요
int n = 10; // 기본형 변수의 초기화
Car car = new Car(); // 참조형 변수의 초기화
변수에 값을 저장하는 코드
생성자를 통한 초기화
// 지난 시간에 배운 내용이죠
Car(String color, String gearType, int door) {
this.color = color;
this.gearType = gearType;
this.door = door;
}
인스턴스 생성과 동시에 생성자를 통해 초기화한다.
초기화 블럭을 통한 초기화
- 인스턴스 초기화 블럭 : { }
- 클래스 초기화 블럭 : 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;
}
}
static이 붙은 클래스변수, 클래스 메소드, 클래스 초기화 블럭은
클래스가 로딩될 때 실행되므로 가장 먼저 실행돼요.
기본값 저장(= static 변수 선언):
static 키워드가 붙은
자료형(Data Type)과 변수명이 선언되는 순간,
해당 자료형의 기본값이 저절로 저장됩니다.
명시적 초기화:
그리고 우변의 값이 변수에 저장되는 명시적 초기화가 진행되는 것이죠.
우변의 값이 기본값을 덮는 겁니다.
클래스 초기화 블럭:
그 후에 클래스 초기화 블럭이 실행됩니다.
인스턴스는 코드가 실행되고,
new로 인스턴스가 생성될 때 실행돼요.
기본값 저장(= 변수 선언):
마찬가지로 자료형(Data Type)과 변수명이 선언되는 순간,
해당 자료형의 기본값이 저절로 저장됩니다.
명시적 초기화:
그리고 우변의 값이 변수에 저장되는 명시적 초기화가 진행되는 것이죠.
우변의 값이 기본값을 덮는 겁니다.
인스턴스 초기화 블럭:
그 후에 클래스 초기화 블럭이 실행됩니다.
생성자보다 먼저 실행됩니다!!
생성자:
일단 생성자는 new로 인스턴스를 생성할 때 호출되므로 static 키워드가 붙을 수 없어요.
저는 지금까지 생성자가 가장 먼저 실행되는 줄 알았는데,
생성자가 가장 나중에 실행됩니다.
오늘도 한 걸음 더 나아갔군요!!
축하드려요. 화이팅입니다!