1. 생성자(Constructor)란?
생성자는 인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메서드'이다.
생성자의 특징은 아래와 같다.
1. 생성자의 이름은 클래스의 이름과 같아야 한다.
2. 생성자는 리턴 값이 없다.
* 모든 생성자가 리턴값이 없으므로 void를 생략할 수 있다.
생성자는 다음과 같이 정의한다.
클래스이름(타입 변수명, 타입 변수명, ...) {
// 인스턴스 생성 시 수행될 코드,
// 주로 인스턴스 변수의 초기화 코드를 적는다.
}
생성자도 오버로딩이 가능하므로 하나의 클래스에 여러 개의 생성자가 존재할 수 있다.
class Card {
Card() { // 매개변수가 없는 생성자 >> 기본 생성자
...
}
Card(String k, int num) { // 매개변수가 있는 생성자
...
}
}
여기서 포인트는 인스턴스 생성은 생성자가 아닌, 연산자 new라는 것이다.
→ 생성자는 단순히 인스턴스 변수들의 초기화에 사용되는 조금 특별한 메서드일 뿐이다.
2. 기본 생성자(default constructor)
모든 클래스에는 반드시 하나 이상의 생성자가 정의되어 있어야 한다. 지금까지 클래스에 생성자를 정의하지 않고도 인스턴스를 생성할 수 있었던 이유는 컴파일러가 제공하는 '기본 생성자(default constructor)' 덕분이였다.
기본 생성자는 매개변수도 없고 아무런 내용도 없는 생성자이다. 컴파일 할 때, 소스파일(*.java)의 클래스에 생성자가 하나도 정의되지 않은 경우 컴파일러가 기본 생성자를 자동으로 추가한다.
Card() {} // 기본 생성자
* 클래스가 public인 경우에는 기본 생성자로 'public 클래스이름() {}'이 추가된다.
- ConstructorTest.java
class ConstructorTest {
public static void main(String[] args) {
Data1 d1 = new Data1();
// Data2 d2 = new Data2(); 컴파일 에러 발생
}
}
class Data1 {
int value;
}
class Data2 {
int value
Data2 (int x) { // 매개변수가 있는 생성자
value = x;
}
}
기본 생성자가 컴파일러에 의해서 추가되는 경우
→ 클래스에 정의된 생성자가 하나도 없을 때 뿐이다.
3. 매개변수가 있는 생성자
생성자도 메서드처럼 매개변수를 선언하여 호출 시 값을 넘겨받아 인스턴스의 초기화 작업에 사용할 수 있다. 인스턴스마다 각기 다른 값으로 초기화되어야 하는 경우가 많기에 매개변수를 사용한 초기화는 매우 유용하다.
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";
c.gearType = "auto";
c.door = 4;
// 매개변수가 있는 생성자를 사용한 인스턴스 생성
Car c = new Car("white", "auto", 4);
클래스를 작성할 때 다양한 생성자를 제공함으로써, 인스턴스 생성 후에 별도로 초기화를 하지 않게 하는 것이 바람직하다.
- CarTest.java
public class CarTest {
public static void main(String[] args) {
Car c1 = new Car();
c1.color = "white";
c1.gearType = "auto";
c1.door = 4;
System.out.printf(
"c1의 color : %s, gearType : %s, door : %s%n"
, c1.color, c1.gearType, c1.door);
Car c2 = new Car ("black", "manual", 6);
System.out.printf(
"c2의 color : %s, gearType : %s, door : %s%n"
, c2.color, c2.gearType, c2.door);
}
}
참고문헌 : 남궁성(2016), Java의 정석, 도우출판