728x90
생성자란? {디폴트 생성자}
- 생성자(constructor)에 대해 자세히 살펴보겠습니다.
- 다음과 같이 Person 과 PersonTest 클래스를 만들어 보겠습니다.
package constructor;
public class Person {
String name;
float height;
float weight;
}
package constructor;
public class PersonTest {
public static void main(String[] args) {
Person personLee = new Person();
}
}
- 위 예제에서 클래스를 생성할 때 사용하는 Person( ) 같은 함수를 생성자라고 합니다.
- 생성자가 하는 일은 클래스를 처음 만들 때 멤버 변수나 상수를 초기화하는 것입니다.
- 풀어서 설명하면, 생성자는 멤버 변수에 대한 값들을 매개변수로 받아서 인스턴스가 새로 생성될 때 멤버 변수 값들을 초기화하는 역할을 합니다.
디폴트 생성자
- 생성자는 클래스를 생성할 때만 호출합니다.
- 생성자 이름은 클래스 이름과 같다.
- 생성자는 반환 값이 없습니다.
- 앞에서 만든 Person 클래스에는 Person( ) 생성자가 따로 없습니다. 그럼에도 사용할 수 있는데, 어떻게 가능할까?
- 생성자가 없는 클래스는 클래스 파일을 컴파일할 때 자바 컴파일러에서 자동으로 생성자를 만들어준다.
- 이렇게 자동으로 만들어 주는 생성자를 디폴트 생성자(default constructor) 라고 합니다.
- 디폴트 생성자는 매개변수가 없고 구현 코드도 없습니다.
생성자 만들기
- 필요한 경우 프로그래머가 직접 생성자를 구현할 수도 있습니다. 어떤 경우에 생성자를 직접 구현할까요?
- 생성자는 주로 멤버 변수에 대한 값들을 매개변수로 받아서 인스턴스가 새로 생성될 때 멤버 변수 값들을 초기화하는 역할을 합니다. 즉 인스턴스가 생성됨과 동시에 멤버 변수의 값을 지정하고 인스턴스를 초기화하기 위해 생성자를 직접 구현하여 사용합니다.
- Person 클래스를 생성할 때 이름을 매개변수로 받는 생성자를 구현해 보겠습니다.
package constructor;
public class Person {
String name;
float height;
float weight;
public Person(String pname) {
name = pname;
}
}
- 새로 만든 생성자 Person(String pname) 는 문자열 String 형 매개변수 pname 을 하나 입력받아서 이름을 지정합니다.
- 그런데 이렇게 수정을 하니까, PersonTest.java 파일에서 오류가 발생했습니다.
package constructor;
public class PersonTest {
public static void main(String[] args) {
Person personLee = new Person();
[오류발생]
}
}
- 오류가 난 이유는 생성자를 직접 구현하였기 때문에 더이상 디폴트 생성자가 없기 때문입니다.
- 프로그래머가 생성자를 직접 추가하면 디폴트 생성자는 만들어지지 않습니다.
- 오류를 해결하려면 매개변수가 있는 생성자로 호출하거나 프로그래머가 직접 디폴트 생성자를 구현하면 됩니다.
package constructor;
public class Person {
String name;
float height;
float weight;
public Person() {
}
public Person(String pname) {
name = pname;
}
}
package constructor;
public class PersonTest {
public static void main(String[] args) {
Person personLee = new Person();
Person personKim = new Person("Kim GilDong");
}
}
생성자 오버로드
- 이렇게 클래스에 생성자가 두 개 이상 제공되는 경우를 생성자 오버로드(constructor overload)라고 합니다.
- 필요에 따라 매개변수가 다른 생성자를 여러 개 만들 수 있습니다.
- 클래스에 생성자를 여러 개 제공하면 이 클래스를 사용하는 코드에서는 원하는 생성자를 선택해 사용할 수 있습니다.
- 경우에 따라서는 클래스에서 일부러 디폴트 생성자를 제공하지 않기도 합니다.
- 다음 Student 클래스를 살펴봅시다.
package constructor;
public class Student {
int studentID;
}
- 해당 Student 클래스에서는 생성자를 프로그래머가 제공하지 않았으므로 디폴트 생성자가 자동으로 생길 것입니다.
- 그런데, 학생이 생성될 때 반드시 학번이 있어야 한다면 다음처럼 생성자를 프로그래머가 제공할 수 있습니다.
package constructor;
public class Student {
int studentID;
public Student(int studentID) {
this.studentID = studentID;
}
}
- 반드시 학번을 인자로 제공해야 생성자를 사용할 수 있기 때문에 인스턴스들이 학번을 반드시 가지고 생성됩니다.
- 이 경우 디폴트 생성자를 구현하지 않습니다. 왜냐하면 학생이 생성될 때 학번을 꼭 가지도록 제한해야 하기 때문입니다. 매개변수가 있는 생성자를 추가하면 디폴트 생성자가 자동으로 생성되지 않으며, 꼭 만들지 않아도 괜찮습니다.
- 생성자 오버로드에 대해 좀 더 살펴보겠습니다.
- 앞에서 생성자의 역할은 주로 인스턴스가 가지고 있는 멤버 변수의 초기화라고 했습니다.
- 다음과 같이 Person 클래스에서 여러 가지 생성자를 제공한다면 이 클래스를 사용하여 인스턴스를 만드는 경우에 필요한 생성자를 골라서 사용할 수 있습니다.
package constructor;
public class Person {
String name;
float height;
float weight;
public Person() {
}
public Person(String pname) {
name = pname;
}
public Person(String pname, float pheight, float pweight) {
name = pname;
height = pheight;
weight = pweight;
}
}
package constructor;
public class PersonTest {
public static void main(String[] args) {
Person personLee = new Person();
Person personKim = new Person("Kim GilDong");
Person personSHIN = new Person("SHIN GilDong", 178, 80);
}
}
- 위 예제는 디폴트 생성자를 사용하는 경우와 매개변수가 있는 생성자를 사용하는 두 가지 경우를 보여줍니다.
- 디폴트 생성자를 사용하는 경우에는 클래스를 생성한 후 인스턴스 변수 값을 따로 초기화합니다.
- 매개변수가 있는 생성자를 사용하면 생성자 내부에서 변수를 초기화할 수 있으므로 코드도 간결하고 사용하기도 편리합니다.
- 추후 배우는, 정보 은닉에서 배우는 것을 참고하면, 어떤 멤버 변수들은 외부 클래스에서 값을 지정하지 못하는 경우도 있습니다. 따라서 매개변수가 있는 생성자를 구현하고 이를 사용하는 것이 편리한 경우가 많습니다.