도찐개찐

[JAVA] 생성자(Constructor) 본문

JAVA

[JAVA] 생성자(Constructor)

도개진 2022. 7. 6. 14:38

생성자란?

  • 인스턴스가 생성될 때마다 자동으로 호출되는 ‘인스턴스 초기화 메서드’
  • 인스턴스 변수의 초기화 또는 인스턴스 생성시 수행할 작업에 사용.
  • 몇 가지 조건을 제외하고는 메서드와 같다.
  • 메서드와 다른 점
    1. 생성자의 이름은 반드시 클래스명과 동일해야한다
    2. 리턴타입을 기술하지 않는다 (void 도 사용하지 않음)
  • 모든 클래스에는 반드시 하나 이상의 생성자가 있어야 한다.

* 인스턴스 초기화 인스턴스 변수에 적절한 값을 저장하는 것.

클래스이름(타입 변수명, 타입 변수명, ... ) {
    // 인스턴스 생성시 수행될 코드
    // 주로 인스턴스 변수의 초기화 코드를 적는다.
}
class Card {
    Card() { // 매개변수가 없는 생성자. // 인스턴스 초기화 작업
    }
    Card(String kind, int number) { // 매개변수가 있는 생성자 // 인스턴스 초기화 작업
    }
}

 

기본 생성자(Default Constructor)

클래스 정의 시 생성자를 하나도 정의하지 않을 경우 컴파일러에 의해 기본 생성자가 자동으로 생성됨

(매개변수가 없고, 중괄호 블록 내에 코드가 없는 빈 생성자)

class Card {
    /* 
    // 모든 클래스는 생성자를 가지고 있어야 함.
    // 생성자를 생성하지 않는 경우 컴파일러 하단 메소드 자동 생성
    Card() { }
    */
}

매개변수가 있는 생성자

인스턴스를 생성할 때 매개변수가 있는 생성자를 사용한다면 인스턴스를 생성함과 동시에 원하는 값으로 초기화를 할 수 있어 보다 간결하고 직관적이다.

class Car {
	String color;		
	String gearType;	
	int door;			

	Car() {}
	Car(String c, String g, int d) { // 매개변수가 있는 생성자
		color = c;
		gearType = g;
		door = d;
	}
}

class CarTest {
	public static void main(String[] args) {
		Car c1 = new Car();
		c1.color = "white";
		c1.gearType = "auto";
		c1.door = 4;

		Car c2 = new Car("white", "auto", 4);

		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 클래스에서 기본 생성자를 포함해서 매개변수가 있는 생성자도 만들어주었다.

main 클래스 CarTest를 보면 Car c2 = new Car("white", "auto", 4); 이 부분이 매개변수가 있는 생성자를 이용한 인스턴스 생성이다.

Car c1은 기본 생성자에서 값을 초기화해주는 과정이 있어서 간결하지 못하고 직관적이지 못하다.

 

this()와 this

오버라이딩된 생성자간에 서로 호출이 가능한데, 아래의 조건을 따라야 한다.

this() 생성자, 같은 클래스의 다른 생성자를 호출할 때 사용 다른 생성자 호출은 생성자의 첫 문장에서만 가능

  • 생성자의 이름으로 클래스 이름 대신 this를 사용해야 하고
  • 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다.
class Car {
	String color;		
	String gearType;	
	int door;			

	Car() {
		this("white", "auto", 4);	// Car(String color, String gearType, int door) 생성자 호출
	}

	Car(String color) {
		this(color, "auto", 4);
	}
	Car(String color, String gearType, int door) {
		this.color    = color;			// this.color 선언 된 인스턴스 color 변수 
		this.gearType = gearType;
		this.door     = door;
	}
}

class CarTest2 {
	public static void main(String[] args) {
		Car c1 = new Car();	
		Car c2 = new Car("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);
	}
}
728x90
Comments