728x90
변수의 초기화란?
변수를 선언하고 처음으로 값을 저장하는 것
초기화 꼭 해야돼?
NO(선택적) | 멤버변수(클래스변수와 인스턴스변수)와 배열의 초기화 |
YES(필수) | 지역변수의 초기화 |
각 Type의 기본값(default value)
자료형 | 기본값 |
boolean | false |
char | '\u0000' |
byte, short, int | 0 |
long | 0L |
float | 0.0f |
double | 0.0d 또는 0.0 |
참조형 변수 | null |
멤버변수의 초기화 방법
1. 명시적 초기화(explicit intialization) 2. 생성자(constructor) 3. 초기화 블럭(initialization block) - 인스턴스 초기화 블럭 - 클래스 초기화 블럭 |
1. 명시적 초기화
- 변수 선언과 동시에 초기화하는 방법
- 가장 간단, 명료..
2. 생성자를 이용한 초기화
- 보다 복잡한 초기화 작업이 필요할 때(초기화 블럭 또는 생성자 사용)
- 이전 글들 참고
3. 초기화 블럭
생성자보다 먼저 초기화 블럭이 수행된다
1) 클래스 초기화 블럭 : 클래스변수의 복잡한 초기화에 사용됨 static { }
- 클래스가 메모리에 처음 로딩될 때 한번만 수행
2) 인스턴스 초기화 블럭 : 인스턴스 변수의 복잡한 초기화에 사용 { }
- 인스턴스를 생성할 때 마다 수행됨
- 인스턴스 변수의 초기화는 주로 생성자를 사용하는데,
인스턴스초기화블럭은 모든 생성자에서 공통으로 수행돼야 하는 코드를 넣는데 사용된다.
(즉, 생성자 내의 중복된 초기화 코드를 간결하게 만들 수 있음)
(객체지향 프로그래밍의 추구목표 : 재사용성 UP, 중복제거)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
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();
}
}
|
cs |
실행결과 화면을 보면
실행 순서를 파악할 수 있다.
1. 클래스 초기화 블럭이 제일 먼저 실행(한번 실행) 2. 인스턴스 생성(bt)되면서 3. 인스턴스 초기화 블럭이 실행 4. (인스턴스가 생성되었기 때문에) 생성자도 실행 5. 인스턴스 생성(bt2) 6. 인스턴스 초기화 블럭 7. 생성자 |
멤버변수의 초기화 시기와 순서
클래스 변수의 초기화 시점 | 클래스가 처음 로딩될 때 단 한번 초기화 |
인스턴스변수의 초기화 시점 | 인스턴스가 생성될 때마다 각 인스턴스별로 초기화 |
클래스변수의 초기화 순서 | 기본값 → 명시적 초기화 → 클래스 초기화 블럭 |
인스턴스변수의 초기화 순서 | 기본값 → 명시적 초기화 → 인스턴스 초기화 블럭 → 생성자 |
1
2
3
4
5
6
7
8
9
10
|
public class InitTest {
static int cv = 1; //명시적 초기화
int iv = 1; //명시적 초기화
static { cv = 2; } //클래스 초기화 블럭
{ iv = 2; } //인스턴스 초기화 블럭
InitTest() { //생성자
iv = 3;
}
}
|
cs |
1. 기본값 | 메모리(method area)에 클래스 변수 cv : 0 |
2. 명시적 초기화 | 클래스 변수 cv : 1 |
3. 클래스 초기화블럭 | 클래스 변수 cv : 2 |
4. 기본값 | 메모리(heap 영역)에 인스턴스 iv : 0 |
5. 명시적 초기화 | iv : 1 |
6. 인스턴스 초기화블럭 | iv : 2 |
7. 생성자 | iv : 3 |
초기화 예제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
class Product {
static int count = 0; // 생성된 인스턴스의 수를 저장하기 위한 변수
int serialNo; // 인스턴스 고유의 번호
// public Product()
{
++count;
serialNo = count;
}
// public Product() {} // 기본생성자, 생략가능
}
class ProductTest {
public static void main(String args[]) {
Product p1 = new Product();
Product p2 = new Product();
Product p3 = new Product();
System.out.println("p1의 제품번호(serial no)는 " + p1.serialNo);
System.out.println("p2의 제품번호(serial no)는 " + p2.serialNo);
System.out.println("p3의 제품번호(serial no)는 " + p3.serialNo);
System.out.println("생산된 제품의 수는 모두 "+Product.count+"개 입니다.");
}
}
|
cs |
생성자를 사용해도 결과는 똑같지만(주석처리 해제해서 확인하면 결과 같음),
코드 의미상 모든 생성자에서 공통으로 수행되어야 하는 내용이기 때문에
인스턴스 블럭 사용..
만약 count를 인스턴스 변수로 선언하면
인스턴스 생성시마다 0으로 초기화되어서
모든 제품 번호가 1이 된다.
(static변수를 사용하는 이유)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
class Document {
static int count = 0;
String name; // 문서명(Document name)
Document() { // 문서 생성 시 문서명을 지정하지 않았을 때
this("제목없음" + ++count);
}
Document(String name) {
this.name = name;
System.out.println("문서 " + this.name + "가 생성되었습니다.");
}
}
class DocumentTest {
public static void main(String args[]) {
Document d1 = new Document();
Document d2 = new Document("자바.txt");
Document d3 = new Document();
Document d4 = new Document();
}
}
|
cs |
문서를 생성할 때 문서의 이름이 겹치지 않도록
일정한 규칙 적용해서 생성
매개변수가 없는 생성자 즉, 제목을 붙이지 않은 문서를 생성시에는 static변수로 초기화된 값을 적용
매개변수가 있는 생성자 즉, 제목을 붙인 문서는 입력한대로 문서 생성
728x90
'코딩 > JAVA' 카테고리의 다른 글
MultipartConfig와 Part인터페이스(링크) (0) | 2021.08.05 |
---|---|
File 클래스_자바의정석 (0) | 2021.08.03 |
생성자를 이용한 인스턴스의 복사_자바의정석 (0) | 2021.08.02 |
Eclipse (설정 가져오기/내보내기)Preferences Export/Import (0) | 2021.07.30 |
생성자에서 다른 생성자 호출_this()/this?_자바의정석 (0) | 2021.07.22 |