Java

[Java] 인스턴스 초기화 블럭이 무엇이고 어떨 때에 사용될까?

joheamin 2025. 3. 25. 00:24

❓ 초기화 블럭이란

 객체가 생성될 때 실행 되는 코드 블럭으로 클래스 내부에 {}로만 감싸져있는 실행문이 
객체 생성 시 마다 실행된다.

 

 

🔍 사용 예시

◾ 클래스 내부에 인스턴스 초기화 블럭 생성
class Student{
	public String name; 
    
	//초기화 블럭
	{
    		this.name = "홍길동";
    		System.out.println("Student 객체가 생성되었습니다!"); 
    	}
}

◾ 인스턴스 생성

Student s1 = new Student();
System.out.println(s1.name);


👉 Student 객체가 생성되었습니다!       
      홍길동     출력 

 

 

 


🔷 인스턴스 초기화 블럭을 사용하는 경우

 

 

 

1️⃣ 여러 생성자들 중에서 공통된 초기화 변수가 존재할 때

 

 

🤔 초기화 블럭과 생성자 변수와 무엇이 다를까? 

우선 생성자를 통해서도 인스턴스 생성과 동시에 값을 초기화하는 것은 가능하다. 

class Student{
	public String name; 
    
    //생성자
	public Student(String name){
    	this.name = name;
    }
}

 

 

❓ 만약 이때 다양한 인자의 갯수를 통해 생성하는 생성자를 여러개 만들 경우?

 

그렇다면 우리가 사는 곳은 대한 민국이라는 공통점이 있기때문에

address는 항상 대한민국으로 초기화를 해보도록 한다.

 

◾ 여러개의 생성자 생성
class Person{
	public String name;
	public String gender;
	public String addr;
	
    //2개의 인자를 받는 생성자
	public Person(String name, String gender) {
		super();
		this.name = name;
		this.gender = gender;
		this.addr = "대한민국";
	}
	
    //1개의 인자를 받는 생성자
	public Person(String name) {
		super();
		this.name = name;
		this.addr = "대한민국";
	}
	
    //기본 생성자
	public Person() {
		super();
		this.addr= "대한민국";
	}
	
}

👉 총 3개의 생성자에는 addr의 속성값이 공통적으로 "대한민국" 으로 초기화된다.

 

 

문제점

공통적인으로 들어가는 초기화 코드가 여러 생성자에 중복으로 계속 들어가게된다.

이렇게 될 경우 기능상에는 문제가 없지만 불필요한 중복 코드가 생기므로 하나로 통합 시켜주는 것이 좋다. 

 

💡 해결

초기화 블럭 사용
class Person{
	public String name;
	public String gender;
	public String addr;
	
	//초기화 블럭
	{
		this.addr="대한민국";
		System.out.println("객체 생성 완료");
	}
	
	public Person(String name, String gender) {
		super();
		this.name = name;
		this.gender = gender;
	}

	public Person(String name) {
		super();
		this.name = name;
	}

	public Person() {
		super();
	}
	
}


👉 초기화 블럭을 통해 addr의 값을 초기화 해준다.
      초기화 블럭은 객체가 생성될 때마다 실행 되므로 공통적인 값을 각각 초기화하게 될 경우 적합하다.


호출

Student s1 = new Student();
System.out.println(s1.addr);

 


 

2️⃣ 인스턴스 생성 시 초기화 과정이 복잡할 때

 

학생 인스턴스를 생성 시 행운의 숫자를 하나 랜덤으로 뽑아 저장해 주는 클래스를 생성

 

클래스 생성
class Student{
	public String name;
	public int luckyNum;  //행운의 숫자
   	
    //생성자
    public Student(String name){
    	this.name = name;
    }
}


초기화 블럭 생성

class Student{
	public String name;
	public int luckyNum;  //행운의 숫자
   	
    //생성자
    public Student(String name){
    	this.name = name;
    }
    
    //초기화 블럭 랜덤 생성
	{
		Random rand = new Random();
		this.luckyNum = rand.nextInt(10) + 1;
		System.out.println("객체 생성 완료");
	}
}

👉 랜덤으로 생성하여 초기화


◾ 호출

Person p1 = new Person("홍길동");
System.out.printf("%s님의 행운의 숫자는 %d번!",p1.name,p1.luckyNum);

숫자는 랜덤으로 계속 달라진다.