티스토리 뷰

반응형

# 생성자(constructor)

생성자란 인스턴스가 생성될 때마다 호출되는 '인스턴스 초기화 메서드'이다.

* 인스턴스 초기화 : 인스턴스 변수들을 초기화하는 것

생성자는 인스턴스 변수(iv) 초기화를 편리하게 하기 위해 만든다.

따라서 인스턴스 생성 시 수행할 인스턴스 변수(iv) 초기화 작업에 주로 사용된다. 

 

생성자의 조건

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

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

→ 초기화는 대부분이 대입문이라 대입만 하면 되기에 결괏값을 반환할 게 없어서 리턴 값이 없다. 

③ 모든 클래스는 반드시 1개 이상의 생성자를 가져야 한다. 

 

생성자의 오버로딩

생성자도 오버로딩이 가능하므로 하나의 클래스에 여러 개의 생성자가 존재할 수 있다. 

생성자의 오버로딩

- 생성자 오버로딩은 클래스 이름과 생성자의 이름이 같아야 한다. 

- 매개변수의 수와 타입이 다르다면 여러 개의 생성자를 선언할 수 있다. 

 

# 기본 생성자(default constructor)

기본 생성자는 매개변수가 없는 생성자로 원래는 직접 작성해야 하지만, 생성자가 하나도 없을 경우에 컴파일러가 자동으로 추가하여 컴파일한다. 

단, 생성자가 하나라도 있을 때는 기본 생성자를 직접 추가해야 한다. 

 

예제 1-1) 기본 생성자(컴파일 에러)

class Data_1{
	int value; 
}

class Data_2{
	int value;
	
	Data_2(int x){  //매개변수가 있는 생성자
		value = x;
	}
}

public class Ex6_11 {

	public static void main(String[] args) {
		Data_1 d1 =  new Data_1();
		Data_2 d2 =  new Data_2();		
	}
}

위의 예제를 컴파일하게 되면 다음과 같은 컴파일 에러가 발생한다. 

error : The constructor Data_2() is undefined

에러 해석 :  Data_2클래스에서 Data_2()라는 생성자를 찾을 수 없다. 

해결 방법 :  Data_2 class에 기본 생성자를 추가한다. 

 

예제 1-2) 기본 생성자(컴파일 에러 해결)

class Data_1{
	int value; //셍성자가 하나도 없어서 컴파일러가 생성자를 자동 추가함
}

class Data_2{
	int value;
	
	 Data_2() {}; //기본 생성자 추가
	
	Data_2(int x){  //매개변수가 있는 생성자
		value = x;
	}
}

public class Ex6_11 {

	public static void main(String[] args) {
		Data_1 d1 =  new Data_1(); 
		Data_2 d2 =  new Data_2();
	}
}

'예제 1-1)'에서 발생한 컴파일 에러를  Data_2클래스에 직접 기본 생성자인 'Data_2() {}'를 추가함으로써 에러가 해결된 것을 알 수 있다. 이처럼 매개변수가 있는 생성자는 기본 생성자를 직접 추가해야 컴파일 에러가 발생하지 않는다.   

 

# 매개변수가 있는 생성자

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

 

인스턴스를 생성할 때 기본생성자인스턴스 생성후, 인스턴스 변수들을 따로 초기화 해주어야하지만,

매개변수가 있는 생성자를 사용하면 인스턴스를 생성하는 동시에 원하는 값으로 초기화 할 수있게된다. 

이처럼 매개변수를 갖는 생성자를 사용하는 것이 코드를 보다 간결하고 직관적으로 만든다.

 

예제) 매개변수가 있는 생성자

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

class Ex6_12 {

	public static void main(String[] args) {
		Car c1 =  new Car("white","auto",4);
//		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);
	}

}

* 출력 결과

c1의 color = white, gearType = auto, door = 4
c2의 color = white, gearType = auto, door = 4

반응형