변수의 초기화

1 분 소요

  • 인스턴스 변수는 초기화를 하지 않아도 자동으로 변수의 자료형에 맞는 기본값으로 초기화가 이루어지지만 지역변수는 사용 전 반드시 초기화해야한다.
  • 인스턴스 변수의 초기화는 선택적이지만, 지역변수의 초기화는 필수적이다.
  • 초기화 방식
    • 명시적 초기화(explicit initialization)
    • 생성자(constructor)
    • 초기화 블럭(initialization block)
      • 인스턴스 초기화 블럭 : 인스턴스 변수를 초기화 하는데 사용
      • 클래스 초기화 블럭 : 클래스 변수를 초기화 하는데 사용

명시적 초기화(explicit initialization)

  • 변수를 생성함과 동시에 초기화 하는 방법
  • 여러 초기화 방법 중 우선적으로 고려되어야 한다.
  • 명시적 초기화가 간단 명료하지만, 보다 복잡한 초기화 작업이 필요할 때는 초기화 블럭 또는 생성자를 사용해야 한다.

초기화 블럭(initialization block)

  • 초기화 블럭에는 인스턴스 초기화 블럭과 클래스 초기화 블럭이 있다.
 1. 인스턴스 초기화 블럭은 인스턴스 변수의 복잡한 초기화에 사용된다.
 2. 클래스 초기화 블럭은 클래스 변수의 복잡한 초기화에 사용된다.
  • 인스턴스 초기화 블럭은 단순히 클래스 내에 블럭{}을 만들고 그 안에 코드를 작성하면 된다.
  • 클래스 초기화 블럭은 블럭{} 앞에 static을 붙여주면 된다.
  • 초기화 블럭 내에는 메서드와 같이 조건문, 반복문, 예외 처리 구문을 자유롭게 기술할 수 있으므로 복잡하여 명시적 초기화만으로는 부족한 경우 초기화 블럭을 사용한다.
class initClass {
  static { ... } // 클래스 초기화 블럭
  { ... }        // 인스턴스 초기화 블럭
}
  • 클래스 초기화 블럭은 클래스가 메모리에 처음 로딩될 때 한번만 수행되며, 인스턴스 초기화 블럭은 생성자와 같이 인스턴스를 생성할 때마다 수행된다.
  • 생성자보다 인스턴스 초기화 블럭이 먼저 실행된다.
  • 클래스가 처음 로드될 때 클래스 변수들이 자동적으로 메모리에 만들어지고, 곧바로 클래스 초기화 블럭이 실행되어 클래스 변수들을 초기화한다.
  • 인스턴스 변수의 초기화는 주로 생성자를 사용하고, 인스턴스 초기화 블럭은 모든 생성자에서 공통으로 수행되어야 하는 코드를 기술한다.
  • 코드의 중복을 줄이는 것은 코드의 신뢰성을 높여 주고, 오류의 발생가능성을 줄여 준다는 장점이 있다.
  • 코드의 재사용성을 높이고 중복을 제거하는 것이 객체지향프로그래밍이 추구하는 궁극적 목표이다.

1 1 1

  • BlockTest가 메모리에 로딩될 때, 클래스 초기화 블럭이 가장 먼저 수행된다.
  • 그 다음 main 메서드가 수행되어 BlockTest 인스턴스를 생성한다.
  • 인스턴스가 생성되며 인스턴스 초기화 블럭이 수행되며 그 후 생성자가 수행된다.

멤버변수의 초기화 시기와 순서

  • 클래스 변수의 초기화 시점 : 클래스가 처음 로딩될 때 단 한번 초기화
  • 인스턴스 변수의 초기화 시점 : 인스턴스가 생성될 때마다 각 인스턴스 별로 초기화
  • 클래스 변수의 초기화 순서 : 기본값 -> 명시적 초기화 -> 클래스 초기화 블럭
  • 인스턴스 변수의 초기화 순서 : 기본값 -> 명시적초기화 -> 인스턴스 초기화 블럭 -> 생성자
  • 프로그램 실행도중 클래스에 대한 정보가 요구될 때, 클래스는 메모리에 로딩된다. 예를 들면 클래스 멤버를 사용할 때, 혹은 인스턴스를 생성할 때 등이 해당한다.;
  • 하지만 이미 클래스가 메모리에 로딩되어 있다면, 또다시 로딩하지 않는다. 물론 초기화 또한 다시 수행되지 않는다.

댓글남기기