본문 바로가기

개발 관련 지식/자바(Java)

[자바] 생성자(Constructor)

* 생성자

: 인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메서드'이다. 따라서 인스턴스 변수의 초기화 작업에 주로 사용되며, 인스턴스 생성 시에 실행되어야 할 작업을 위해서도 사용된다.

 

 

* 생성자의 조건

1. 생성자의 이름은 클래스의 이름과 같아야 한다.

2. 생성자는 리턴 값이 없다.

 

 

* 생성자의 사용 방법

클래스 이름(타입 변수명, 타입 변수명, ...) {

//인스턴스 생성 시 수행될 코드,

// 주로 인스턴스 변수의 초기화 코드를 적는다.

}

 

class Card{

Card(){ //매개변수가 없는 생성자

// ...

}

Card(String k, int num){ //매개변수가 있는 생성자

// ...

}

// ...

}

 

* 인스턴스 생성 수행 과정

Card c = new Card();

1. 연산자 new 에 의해서 메모리(heap)에 Card클래스의 인스턴스가 생성된다.

2. 생성자 Card()가 호출되어 수행된다.

3. 연산자 new 의 결과로, 생성된 Card 인스턴스의 주소가 반환되어 참조변수 c에 저장된다.

 

* 기본 생성자(default constructor)

: 사실 모든 클래스에는 반드시 하나 이상의 생성자가 정의되어 있어야 한다. 그러나 클래스에 생성자를 정의하지 않고도 인스턴스를 생성할 수 있었던 이유는 컴파일러가 제공하는 '기본 생성자(defualt constructor)' 덕분이었다.

cf) 기본 생성자가 컴파일러에 의해서 추가되는 경우는 클래스에 정의된 생성자가 하나도 없을 때 뿐이다.

 

* 매개변수가 있는 생성자

: 인스턴스마다 각기 다른 값으로 초기화되어야 하는 경우가 많기 때문에 매개변수를 사용한 초기화는 매우 유용하다.

 

<예문>

public class Car {

 String color;  //색상
 String gearType; //변속기 종류 - auto(자동), manual(수동)
 int door;   //문의 개수
 
 Car() {} //생성자
 Car(String c, String g, int d){ //생성자
  color = c;
  gearType = g;
  door = d;
 }
}


Car c = new Car();

c.color = "white";        --------->   Car c = new Car("white", "auto", 4);

c.gearType = "auto";

c.door = 4; 

 

 

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

: 같은 클래스의 멤버들 간에 서로 호출할 수 있는 것처럼 생성자 간에도 서로 호출이 가능하다. 단 두 조건을 만족시켜야 한다.

1. 생성자의 이름으로 클래스이름 대신 this를 사용한다.

2. 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다.

 

- this : 인스턴스 자신을 가리키는 참조변수, 인스턴스의 주소가 저장되어 있다. 모든 인스턴스메서드에 지역변수로 숨겨진 채로 존재한다.

- this(), this(매개변수) : 생성자, 같은 클래스의 다른 생성자를 호출할 때 사용한다.

 

<예문>

package Exercise;

class Car2 {

 String color;  //색상
 String gearType; //변속기 종류 - auto(자동), manual(수동)
 int door;   //문의 개수
 
 Car2() { //생성자
  this("white", "auto", 4);
 }
 
 Car2(String color){
  this(color, "auto", 4);
 }
 
 Car2(String color, String gearType, int door){ //생성자
  this.color = color;
  this.gearType = gearType;
  this.door = door;
 }
}

public class CarTest2 {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  Car2 c1 = new Car2();
  Car2 c2 = new Car2("blue");
  
  System.out.println("c1의 color="+c1.color+", gearType="+c1.gearType
    +", door="+c1.door);
  System.out.println("c2의 color="+c2.color+", gearType="+c2.gearType
    +", door="+c2.door);
 }

} 

 

 

 

* 생성자를 이용한 인스턴스의 복사

<예문>

Car (Car c) { // 인스턴스의 복사를 위한 생성자.

color = c.color;

gearType = c.gearType;

door = c.door;

}