변수의 타입에 따른 기본값
자료형 | 기본값 |
boolean | false |
char | ‘\u0000’ |
byte, short, int | 0 |
long | 0L 또는 0 |
float | 0.0f 또는 0.0 |
double | 0.0d 또는 0.0 |
참조형 | null |
멤버변수는 초기화 하지 않아도 자동적으로 변수의 자료형에 맞는 기본값으로 초기화가 이루어지므로 초기화하지 않고 사용해도 되지만, 지역변수는 사용하기 전에 반드시 초기화해야 한다. (선언과 동시에 초기화 해주기 컴파일시 에러 발생)
멤버변수(클래스 변수와 인스턴스 변수)와 배열의 초기화는 선택이지만, 지역변수의 초기화는 필수이다.
지역변수와 달리 멤버변수는 각 타입의 기본값으로 자동 초기화 된다. 그 다음 명시적 초기화, 초기화 블럭, 생성자 순서로 초기화된다. 추가적으로 클래스 변수(cv)가 인스턴스 변수(jv)보다 먼저 초기화 된다.
💡 1. 클래스 변수(cv)초기화 → 인스턴스 변수(iv) 초기화 2. 자동 초기화 → 명시적 초기화(간단) → 초기화 블럭, 생성자(복잡)
명시적 초기화(explicit initialization)
변수를 선언과 동시에 초기화하는 것을 명시적 초기화라고 한다.
int value = 4; //기본형 변수의 초기화
Card c1 = new Card(); //참조형 변수의 초기화
명시적 초기화가 간단하고 명료하긴 하지만, 보다 복잡한 초기화 작업이 필요할 때는 ‘초기화 블럭(initialization block)’ 또는 ‘생성자’를 사용해야 한다.
초기화 블럭(initialization block)
초기화 블럭 종류
- 클래스 초기화 블럭: 클래스 변수의 복잡한 초기화에 사용한다. (인스턴스 초기화 블럭 앞에 static 붙이기)
- 인스턴스 초기화 블럭: 인스턴스변수의 복잡한 초기화에 사용한다. (class 내에 블럭({})만들기)
public class Study {
public static void main(String[] args) {
Card c1 = new Card();
Card c2 = new Card();
}
}
class Card {
{
System.out.println("instance initialization block"); //인스턴스 초기화 블럭
}
static {
System.out.println("class initialization block"); //클래스 초기화 블럭
}
}
/*
출력
class initialization block -> 클래스 초기화 블럭이 인스턴스 초기화 블럭보다 먼저 초기화
instance initialization block
instance initialization block
인스턴스가 생성되면서 초기화 블럭이 먼저 수행되고 끝으로 생성자가 수행된다.
클래스 초기화 블럭은 처음 메모리에 로딩될 때 한번만 수행되었지만, 인스턴스 초기화 블럭은
인스턴스가 생성될 때 마다 수행되었다.
*/
class Card {
static int[] arr = new int[10];
static {
for (int i = 0; i < arr.length; i++) {
arr[i] = (int) (Math.random() * 10) + 1;
}
}
public static void main(String[] args) {
for (int i = 0; i < arr.length; i++) {
System.out.println("arr[i] = " + arr[i]);
}
}
}
- 명시적 초기화를 통해 배열을 생성하고, 클래스 초기화 블럭을 이용해서 배열의 각 요소들을 임의의 값으로 채웠다.
- 배열이나 예외처리가 필요한 초기화에서는 명시적 초기화만으로는 복잡한 초기화 작업을 할 수 없다. 이런 경우에 추가적으로 클래스 초기화 블럭을 사용하면 된다.
객체도 변수와 동일하게 많은 수의 객체를 다뤄야 한다면 배열을 통해서 사용가능하다.
hyunwoo[] hw = new hyunwoo[5]; //객체 배열을 생성하는 것은 객체를 다루기 위한 참조변수들만 만들어짐
hw[0] = new hyunwoo(); //객체 배열의 각 요소에 메모리에 올라간 객체 주소를 저장해야함
hw[1] = new hyunwoo();
hw[2] = new hyunwoo();
hw[3] = new hyunwoo();
hw[4] = new hyunwoo();
for(int i = 0; i < hw.length; i++){ // 반복문을 통해서도 생성 가능하다.
hw[i] = new hyunwoo();
}
각 요소는 선언만 하게 되면 참조변수의 기본값은 null로 자동 초기화된다.(참조형)
hw[객체 배열 수] = new hyunwoo(); 이 객체 배열은 생성한 수 만큼 메모리에 올라간 객체의 주소를 저장 할 수 있다.
배열을 선언하는 것은 단지 생성된 배열을 다루기 위한 참조변수를 위한 공간만 만들어진다.
배열을 생성해야만 비로소 값을 저장할 수 있는 공간이 만들어진다.
new 연산자로 메모리에 공간을 확보하고 = 메서드로 주소를 참조변수한테 전달 해줘야 된다.
(primitive 배열은 생성과 동시에 자동적으로 기본값(0)으로 초기화)
String[] test = new String[3]; → (reference 배열은 생성과 동시에 자동적으로 기본값(null)으로 초기화)
'책 > Java의 정석' 카테고리의 다른 글
[java] 상속 (extends) (0) | 2023.02.04 |
---|---|
[java] 생성자(constructor)와 this, this() (2) | 2023.02.03 |
[java] static (0) | 2023.02.03 |
[java] 선언위치에 따른 변수의 종류 (0) | 2023.02.03 |
[java] Data type (0) | 2023.02.03 |