[Java] 6. 객체지향 프로그래밍 1 #5 변수의 초기화
2022. 4. 29. 02:35ㆍJAVA/Language
1. 변수의 초기화
- 변수를 선언과 동시에 값을 저장하는 것을 변수의 초기화라고 함
- 인스턴스의 멤버변수는 초기화하지 않고 사용해도 됨(자료형에 맞게 기본값으로 초기화가 이루어짐)
- 하지만 지역변수는 사용하기 전에 반드시 초기화해야함
class Car{
int door; // 인스턴스 변수
void method(){
int i; // 지역변수
int j = i; // error, 지역변수를 초기화하지 않고 사용
}
}
멤버변수의 초기화 방법
- 명시적 초기화(explicit initialization)
- 생성자(constructor)
- 초기화 블럭(initialization block)
- 인스턴스 초기화 블럭 : 인스턴스 변수를 초기화 하는데 사용
- 클래스 초기화 블럭 : 클래스 변수(static 변수)를 초기화 하는데 사용
2. 명시적 초기화(explicit initialization)
명시적 초기화는 변수를 선언과 동시에 초기화 하는 것을 명시적 초기화라고 합니다.
class Car{
int door = 4; // 기본형 변수의 초기화
Engine e = new Engine(); // 참조형 변수의 초기화
}
3. 초기화 블럭(initialization block)
초기화 블럭의 종류
- 인스턴스 초기화 블럭 : 인스턴스 변수의 복잡한 초기화에 사용됨
- 클래스 초기화 블럭 : 클래스 변수의 복잡한 초기화에 사용됨
class InitBlock{
static {
/* 클래스 초기화 블럭 */
}
{
/* 인스턴스 초기화 블럭 */
}
public InitBlock(){
}
}
초기화 블럭 예제
public class BlockTest {
static
{
System.out.println("static { }");
}
{
System.out.println("{ }");
}
public BlockTest() {
System.out.println("생성자");
}
public static void main(String[] args)
{
System.out.println("BlockTest bt = new BlockTest();");
BlockTest bt = new BlockTest();
System.out.println("BlockTest bt2 = new BlockTest();");
BlockTest bt2 = new BlockTest();
}
}
static { }
BlockTest bt = new BlockTest();
{ }
생성자
BlockTest bt2 = new BlockTest();
{ }
생성자
- 수행 결과 BlockTest 클래스가 메모리에 로딩될때 클래스 초기화 블럭이 가장 먼저 수행하게 되어 "static { }"를 출력하게 됨
- 그 다음 인스턴스 블럭이 수행하게 되고 생성자가 수행됨
- 수행 순서 : 클래스 초기화 블럭 -> 인스턴스 초기화 블럭 -> 생성자
4. 멤버변수의 초기화 시기와 순서
클래스 변수의 초기화 시점 : 클래스가 처음 메모리에 올라갈 때 단 한번만 초기화됨
인스턴스 변수의 초기화시점 : 인스턴스가 생성될 때마다 각 인스턴스별로 초기화가 이루어짐
클래스 변수의 초기화순서 : 기본값 -> 명시적 초기화 -> 클래스 초기화 블럭
인스턴스 변수의 초기화 순서 : 기본값 -> 명시적 초기화 -> 인스턴스 초기화 블럭 -> 생성자
인스턴스 변수 초기화를 활용한 예제
public class Product {
static int count = 0; // 생성된 인스턴의 수를 저장하기 위한 변수
int serialNo; // 인스턴스 고유 번호
{
count++;
serialNo = count;
}
public Product() {
}
public static void main(String[] args)
{
Product p1 = new Product();
Product p2 = new Product();
Product p3 = new Product();
System.out.printf("p1의 제품번호(serialNo) = %d\n", p1.serialNo);
System.out.printf("p2의 제품번호(serialNo) = %d\n", p2.serialNo);
System.out.printf("p3의 제품번호(serialNo) = %d\n", p3.serialNo);
System.out.printf("현재 생상한 제품 수 = %d\n", Product.count);
}
}
p1의 제품번호(serialNo) = 1
p2의 제품번호(serialNo) = 2
p3의 제품번호(serialNo) = 3
현재 생상한 제품 수 = 3
- Product 객체가 생성 될 때마다 인스턴스 초기화 블럭이 수행됨
- Product 객체를 생산할때마다 객체 필드 멤버(serialNo)에 고유한 번호(count)를 할당함
References
source code : https://github.com/yonghwankim-dev/java_study
Java의 정석, 남궁 성 지음
'JAVA > Language' 카테고리의 다른 글
[Java] 7. 객체지향 프로그래밍 2 #2 오버라이딩(overriding) (0) | 2022.05.03 |
---|---|
[Java] 7. 객체지향 프로그래밍 2 #1 상속(inheritance) (0) | 2022.04.29 |
[Java] 6. 객체지향 프로그래밍 1 #4 생성자(Constructor) (0) | 2022.04.28 |
[Java] 6. 객체지향 프로그래밍 1 #3 오버로딩(overloading) (0) | 2022.04.27 |
[Java] 6. 객체지향 프로그래밍 1 #2 변수와 메서드 (0) | 2022.04.26 |