5. 생성자

  1. 생성자의 이름은 클래스의 이름과 같아야 한다.
  2. 생성자는 리턴 값이 존재하지 않는다.

: 생성자는 인스턴스변수들의 초기화에 사용되는 특별한 메서드이다.

5-2. Default constructor

: java 컴파일러는 소스파일의 클래스에 생성자가 하나도 정의되지 않은 경우, 컴파일러는 자동적으로 default 생성자를 추가하여 컴파일 한다.
Default constructor가 컴파일러에 의해서 추가되는 경우는 클래스에 정의된 생성자가 하나도 없을 때 자동적으로 추가되며, 하나 이상의 constructor가 있는 경우에는 생성이 되지 않는다.

5-3. 매개변수가 있는 constructor

: 생성자도 메서드처럼 매개 변수를 선언하여 호출 시, 매개변수를 넘겨받아 인스턴스의 초기화 작업에 사용할 수 있다.

EX code

class Car {
	String color;
    String gearType;
    ind door;
    
    Car() {}
    Car(String c, String g, int d){
    	color = c;
        gearType = g;
        door = d;
   }
}

다음과 같이 매개변수가 있는 생성자를 사용하면, 인스턴스를 생성하는 동시에 원하는 값으로 초기화가 가능하다.

// 매개변수 없는 생성자 사용
Car c = new Car();
c.color = "white";
c.gearType = "auto";
c.door = 4;

// 매개변수 있는 생성자 사용
Car c = new Car("white", "auto", 4);

5-4. 생성자에서 다른 생성자 호출하기 - this(), this

  • 생성자의 이름으로 클래스이름 대신 this를 사용한다.
  • 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다.
    EX code
class Car {
	String color;
    String gearType;
    ind door;
    
    Car() {
    	this("white", "auto", 4);
    }
    Car(String color) {
    	this(color, "auto", 4);
    }
    Car(String color, String gearType, int door){
    	this.color = color;				// 여기서 사용된 this는 이 클래스 내부의 인스턴스 변수를 뜻한다. 
        this.gearType = gearType;
        this.door = door;
   }
}

6. 변수의 초기화

: 변수를 선언하고 처음으로 값을 저장하는 것을 변수의 초기화라고 한다.

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

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

member variable의 초기화 방법에는 3가지의 방법이 있다.
1. 명시적 초기화 (explicit initialization)
2. 생성자 (constructor)
3. 초기화 블럭 (initialization block)

6-1. 명시적 초기화 (explicit initialization)

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

EX code

class Car {
	String color = "white";
    String gearType = "auto";
    ind door = 4;
    
    // ...
  }

6-2. 초기화 블럭 (initialization block)

: 초기화 블럭에는 "클래스 초기화 블럭"과 "인스턴스 초기화 블럭" 두 가지 종류가 존재한다.
클래스 초기화 블럭 : 클래스 변수의 초기화에 사용됨
인스턴스 초기화 블럭 : 인스턴스 변수의 초기화에 사용됨

초기화 블럭 내에서는 메서드 내에서와 같이 조건문, 반복문, 예외처리구문 등을 자유롭게 사용가능하다.
따라서 명시적 초기화만으로는 하지 못하는 복잡한 초기화 작업을 할 때, 주로 사용한다.

클래스 초기화 블럭은 클래스가 메모리에 처음 로딩될 때 한번만 수행된다.
인스턴스 초기화 블럭은 생성자와 같이 인스턴스를 생성할 때 마다 수행된다.
그리고 생성자 보다, 인스턴스 초기화 블럭이 먼저 수행된다.

EX CODE

class Car {
	static {
    	// class initialization block
    }
    
    {
    	// instance initialization block
    }
}

인스턴스 초기화 블럭은 모든 생성자애서 공통적으로 수행돼야 하는 코드를 넣는데 사용된다.

6-3. 초기화 시기와 순서

클래스 변수의 초기화 시점 : 클래스가 처음 로딩될 때 단 한번 초기화 된다.
인스턴스 변수의 초기화 시점 : 인스턴스가 생성될 때마다 각 인스턴스별로 초기화가 이루어진다.

클래스 변수의 초기화 순서 : 기본값 -> 명시적초기화 -> 클래스 초기화 블럭
인스턴스변수의 초기화 순서 : 기본값 -> 명시적초기화 -> 인스턴스 초기화 블럭 -> 생성자

profile
심은대로 거둔다

0개의 댓글