"클래스();"는 생성자를 호출하는 의미이다.
public class PersonTest {
public static void main(String[] args) {
Person personLee = new Person();
}
위 예제에서, 자바에서 클래스를 생성할 때 사용하는 Person() 같은 함수를 생성자라고 한다.
//자바 컴파일러가 자동으로 제공하는 디폴트 생성자.
public Person() {}
인스턴스가 생성됨과 동시에 멤버 변수의 값을 지정하고 인스턴스를 초기화하기 위해 직접 생성자를 구현할 수도 있다.
// 이름, 키, 몸무게를 매개변수로 입력받아 Person 클래스를 생성하는 생성자
public Person(String pname, int pheight,int pweight) {
name = pname;
height = pheight;
weight = pweight;
}
▶ 이렇게 프로그래머가 직접 생성자를 구현하면 디폴트 생성자를 이용한 코드에 오류가 나게 된다.
생성자를 직접 구현하여 디폴트 생성자가 없기 때문이다. 디폴트 생성자는 생성자가 하나도 없는 경우에만 제공된다. 디폴트 생성자를 이용한 코드에 오류를 없애려면 매개변수가 있는 생성자로 호출하거나 프로그래머가 직접 디폴트 생성자를 추가로 구현하면 된다.
필요에 따라 매개변수가 다른 생성자를 여러 개 만들 수 있다. 클래스에 생성자를 여러 개 제공하면 이 클래스를 사용하는 코드에서는 원하는 생성자를 선택해 사용할 수 있다.
경우에 따라서는 일부러 디폴트 생성자를 제공하지 않기도 한다.
public class Person {
int studentID;
}
학생이 생성될 때 반드시 학번이 있어야 한다면 다음처럼 생성자를 제공할 수 있다.
public class Student {
int studentID;
//학번을 매개변수로 입력받아 Student 클래스를 생성하는 생성자
public Student(int studentID) {
this.studentID = studentID;
}
}
▶ 이런 경우 디폴트 생성자를 구현하지 않는다. 즉 매개변수가 있는 생성자를 구현한다고 해서 프로그래머가 꼭 디폴트 생성자를 추가로 작성해야 하는 것은 아니다.
public Person() {} //디폴트 생성자
public Person(String pname, int pheight,int pweight) {
name = pname;
height = pheight;
weight = pweight;
}
public class PersonTest {
public static void main(String[] args) {
Person personKim = new Person();
personKim.name = "김유신";
personKim.height = 180;
personKim.weight = 85; // 디폴트 생성자로 클래스를 생성한 후 인스턴스 변수 값을 따로 초기화
Person personLee3 = new Person("이하린", 167,10); // 인스턴스 변수 초기화와 동시에 클래스 생성
}
}
위 예제는 디폴트 생성자를 사용하는 경우와 매개변수가 있는 생성자를 사용하는 두 가지 경우를 보여준다.
매개변수가 있는 생성자를 사용하면 생성자 내부에서 변수를 초기화할 수 있어 코드가 간결하고 사용하기도 편리해지는 것을 알 수 있습니다.
어떤 멤버 변수들은 외부 클래스에서 값을 지정하지 못하는 경우도 있기 때문에 매개변수가 있는 생성자를 구현하고 이를 사용하는 것이 편리한 경우가 많다.