AVA - 변수의 초기화, 멤버변수의 초기화
변수의 초기화
- 변수를 선언하고 처음으로 값을 저장하는 것을 '변수의 초기화'라고 한다.
- 멤버변수는 초기화를 하지 않아도 자동적으로 변수의 자료형에 맞는 기본값으로 초기화가 이루어지므로 초기화하지 않고 사용해도 된다.
- 단, 지역변수는 사용하기 전에 반드시 초기화해야 한다.
class InitTest{
int x; //인스턴스 변수
int y = x; //인스턴스 변수
void method()
{
int i; //지역변수
int j = i; //에러, 지역변수를 초기화하지 않고 사용
}
}
- 인스턴스 변수 x는 초기화를 해주지 않아도 자동적으로 int형의 기본값인 0 으로 초기화 되므로 'int y = x;' 같이 할 수 이다.
- 하지만, method()의 지역변수 i는 자동적으로 초기화되지 않으므로, 초기화 되지 않은 상태에서 변수 j를 초기화 하는데 사용될 수 없다.
멤버변수(클래스변수와 인스턴스변수)와 배열의 초기화는 선택적이지만, 지역변수의 초기화는 필수적이다.
명시적 초기화(explicit initialization)
변수 선언과 동시에 초기화하는 것을 명시적 초기화라고 한다.
class Car{
int door = 4; //기본형(primitive type) 변수의 초기화
Engine e = new Engine(); //참조형(reference type) 변수의 초기화
}
복잡한 초기화 작업이 필요할 경우 '초기화 블럭(initialization block)' 또는 생성자를 사용해야 한다.
초기화 블럭(initialization block)
클래스 초기화 블럭 : 클래스변수의 복잡한 초기화에 사용된다.
인스턴스 초기화 블럭: 인스턴스변수의 복잡한 초기화에 사용된다.
class 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{}
BlocktTest bt = new BlockTest();
{ }
생성자
BlockTest bt2 = new BlockTest();
{ }
생성자
BlockTest가 메모리에 로딩될 때,
- 클래스 초기화 블럭이 가장 먼저 수행되어 'static{}'이 화면에 출력
- 그 다음 main 메서드가 수행되어 BlockTest 인스턴스가 생성되면서 인스턴스 초기화 블럭이 먼저 수행
- 끝으로 생성자가 수행
클래스 초기화 블럭은 처음 메모리에 로딩될 때 한번만 수행되었지만, 인스턴스 초기화 블럭은 인스턴스가 생서오딜 때 마다 수행되었다.
멤버변수의 초기화 시기와 순서
- 클래스변수의 초기화 시점 : 클래스가 처음 로딩될 때 단 한번 초기화된다.
- 인스턴스변수의 초기화 시점 : 인스턴스가 생성될 때 마다 각 인스턴스별로 초기화가 이루어진다.
- 클래스변수의 초기화 순서: 기본값 - 명시적초기화 - 클래스 초기화 블럭
- 인스턴스변수의 초기화 순서: 기본값 - 명시적초기화 - 인스턴스 초기화 블럭 - 생성자
Author And Source
이 문제에 관하여(AVA - 변수의 초기화, 멤버변수의 초기화), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@jo_dbsgh95/JAVA-변수의-초기화-멤버변수의-초기화저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)