Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

Goru

[Java] 변수의 초기화 본문

Java

[Java] 변수의 초기화

gorusair 2022. 1. 19. 13:12

변수의 초기화

변수를 선언하고 처음으로 값 저장하는 것을 '변수의 초기화'라고 한다. 변수의 초기화는 경우에 따라서 필수적이기도 하고 선택적이기도 하지만, 가능하면 선언과 동시에 적절한 값으로 초기화 하는 것이 바람직합니다.

class InitTest{
	int x;
    int y;
    
    void method1() {
    	int i ;			//지역변수
        int j = i;		// 에러. 지역변수를 초기화하지 않고 사용
      }
    }

※ 맴버변수(클래스변수와 인스턴스변수)와 배열의 초기화는 선택적이지만, 지역변수 초기화는 필수적이다.

 

▶멤버변수의 초기화 방법

  1. 명시적 초기화
  2. 생성자
  3. 초기화 블럭
    - 인스턴스 초기화 블럭 : 인스턴스 변수를 초기화 하는데 사용
    - 클래스 초기화 블럭 : 클래스 변수를 초기화 하는데 사용

명시적 초기화

// 변수를 선언과 동시에 초기화 하는 것을 명시적 초기화라고 한다.

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