Goru
[Java] 변수의 초기화 본문
변수의 초기화
변수를 선언하고 처음으로 값 저장하는 것을 '변수의 초기화'라고 한다. 변수의 초기화는 경우에 따라서 필수적이기도 하고 선택적이기도 하지만, 가능하면 선언과 동시에 적절한 값으로 초기화 하는 것이 바람직합니다.
class InitTest{
int x;
int y;
void method1() {
int i ; //지역변수
int j = i; // 에러. 지역변수를 초기화하지 않고 사용
}
}
※ 맴버변수(클래스변수와 인스턴스변수)와 배열의 초기화는 선택적이지만, 지역변수 초기화는 필수적이다.
▶멤버변수의 초기화 방법
- 명시적 초기화
- 생성자
- 초기화 블럭
- 인스턴스 초기화 블럭 : 인스턴스 변수를 초기화 하는데 사용
- 클래스 초기화 블럭 : 클래스 변수를 초기화 하는데 사용
명시적 초기화
// 변수를 선언과 동시에 초기화 하는 것을 명시적 초기화라고 한다.
class Car{
int door = 4; // 기본형 변수의 초기화
Engine e = new Engine(); // 참조형 변수의 초기화
// ..
}
초기화 블럭
클래스 초기화 블럭 : 클래스 변수의 복잡한 초기화에 사용된다. 인스턴스 초기화 블럭 : 인스턴스 변수의 복잡한 초기화에 사용된다. |
초기화 블럭을 작성하려면, 인스턴스 초기화 블럭은 단순히 클래스 내에 블럭{ }을 만들고 그 안에 코드를 작성하기만 하면 된다. 그리고 클래스 초기화 블럭은 인스턴스 초기화 블럭 앞에 단순히 static을 덧붙이기만 하면된다.
초기화 블럭 내에는 메서드 내에서와 같이 조건문, 반복문, 예외처리구문 등을 자유롭게 사용할 수 있으므로. 초기화 작업이 복잡하여 명시적 초기화만으로는 부족한 경우 초기화 블럭을 사용한다.
classs InitBlock{
static {/* 클래스 초기화 블럭입니다.*/}
{/* 인스턴스 초기화 블럭입니다. */}
// ..
}
클래스 초기화 블럭은 클래스가 메모리에 처음 로딩될 떄 한번만 수행되며, 인스턴스 초기화 블럭은 생성자와 같이 인스턴스를 생성할 떄 마다 수행된다.
그리고 생성자보다 인스턴스 초기화 블럭이 먼저 수행된다는 사실을 기억해 둘것.
Car(){
count++;
serialNo = count;
color = "White";
gearType = "Auto";
}
Car(String color, String gearType){
count++;
serialNo = count;
this.color = color;
this.gearType = gearType;
// 같은 코드가 중복되었다.
{
count++;
serialNo = count; // 인스턴스 초기화 블럭
}
Car(){
color = "White";
gearType = "Auto";
}
Car(String color, String gearType){
this.color = color;
this.gearType = gearType;
◈ 코드 중복을 제거하는 것은 코드의 신뢰성을 높여주고, 오류의 발생가능성을 줄여 준다는 장점이 있다.
즉, 재사용성을 높이고 중복을 제거하는 것
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()
{}
생성자
class StaticBlockTest{
static int[] arr = new int[10];
static {
for(int i=0; i<arr.length;i++) {
// 1과 10사이의 임의의 값을 배열 arr에 저장한다.
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]);
}
}
arr[0] :5
arr[1] :8
arr[2] :3
arr[3] :6
arr[4] :5
arr[5] :3
arr[6] :3
arr[7] :5
arr[8] :3
arr[9] :8
멤버변수의 초기화 시기와 순서
클래스변수의 초기화 시점: 클래스가 처음 로딩될 떄 단 한번 초기화 된다.
인스턴스변수의 초기화 시점: 인스턴스가 생성될 떄마다 각 인스턴스별로 초기화가 이루어진다.
클래스변수의 초기화 순서: 기본값-> 명시적 초기화 -> 클래스 초기화 블럭
인스턴스변수의 초기화 순서: 기본값 -> 명시적 초기화-> 인스턴스 초기화 블럭-> 생성자
class InitTest{
static int cv = 1;
int iv =1;
static { cv =2} //클래스 초기화 블럭
{ iv=2; } //인스턴스 초과화 블럭
InitTest(){ //생성자
iv =3;
}
}
class Product {
static int count =0; //생성된 인스턴스의 수를 저장하기 위한 변수
int serialNo; //인스턴스 고유의 번호
{
++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+"개입니다.");
}
}
p1 의 제품번호(serial no)는 1
p2 의 제품번호(serial no)는 2
p3 의 제품번호(serial no)는 3
생성된 제품의 수는 모두3개입니다.
'Java' 카테고리의 다른 글
[Java] 클래스간의 관계- 포함관계 (0) | 2022.01.19 |
---|---|
[Java] 상속 (0) | 2022.01.19 |
생성자 (0) | 2022.01.19 |
[Java] 오버로딩 (0) | 2022.01.18 |
[Java] 클래스 메서드와 인스턴스 메서드 (0) | 2022.01.18 |