# 15. Java의 생성자에 대해 알아보자!
안녕하세요! 하프입니다😋
오랜만에 돌아왔습니다. 즐거운 Java 시간! 이 글에서는 생성자에 대해 알아보도록 할게요! 클래스를 생성하면 생성자라는 것을 호출해야 하는데, 이 생성자라는 게 도대체 무슨 역할인지 알아보겠습니다!
이 글은 <Do it! 자바 프로그래밍 입문> 책을 읽고 이해한 내용을 바탕으로 작성되었습니다😉
1. 생성자는 뭔가요?
생성자는 클래스를 처음 만들 때 멤버 변수나 상수를 초기화하는 함수입니다. 처음 클래스를 생성할 때 멤버 변수의 값을 정해야 하는 경우가 있을 텐데, 그 때 생성자를 사용하여 멤버 변수를 초기화하는 것이죠! 생성자는 클래스를 만들 때만 호출합니다. 생성자의 이름은 클래스와 같고, 반환 값이 없습니다!
2. 디폴트 생성자
하프는 생각했습니다... '전에 클래스를 알아보면서 만든 Student 클래스에는 생성자가 없었는데??! 그럼 new Student()로 객체를 만든 건?' 뭐지... 생성자가 없어도 되는 거 아닌가요?
사실 우리가 생성자를 따로 만들지 않으면 자바 컴파일러에서 클래스를 컴파일할 때 자동으로 디폴트 생성자를 만들어주고 있는 것이었습니다! 디폴트 생성자는 매개변수가 없고, 구현 코드도 없습니다. 하지만 프로그래머가 디폴트 생성자를 직접 코드로 구현할 수도 있습니다!
public class Person {
String name;
float height;
float weight;
public Person() { } // 생성자
}
public Person() { } 이 자동으로 만들어지는 디폴트 생성자입니다.
3. 생성자 만들기
프로그래머가 생성자를 직접 구현할 때는 언제일까요? 생성자는 주로 멤버 변수에 대한 값들을 매개변수로 받고, 인스턴스가 새로 생성될 때 멤버 변수의 값을 초기화하는 역할을 합니다. 즉, 인스턴스가 생성됨과 동시에 멤버 변수의 값을 지정하고, 인스턴스를 초기화하기 위해서 생성자를 직접 구현합니다!
public class Person {
String name;
float height;
float weight;
public Person(String pname) { // 생성자!
name = pname;
}
}
책에 있는 예제를 함께 살펴봅시다! Person 생성자는 사람 이름을 매개변수로 입력받고 Person 클래스를 생성하는 친구인데요, String형 매개변수인 pname을 입력받은 후 멤버 변수인 name에 값을 저장하는 역할이겠죠?
public class PersonTest {
public static void main(String[] args) {
Person half = new Person();
}
}
이건 Person 클래스를 사용하는 PersonTest 입니다. 그런데, 위에서 Person 생성자를 만들었더니 여기서 오류가 나는데요?!!? 😵
그 이유는 생성자를 직접 구현했기 때문에 디폴트 생성자가 없어서입니다. 자바 컴파일러는 생성자가 하나도 없는 경우에만 디폴트 생성자를 제공하기 때문에, Person 생성자를 직접 구현한 지금 상황에서는 디폴트 생성자가 없습니다. 오류를 없애기 위해서는 디폴트 생성자를 추가로 직접 구현하거나, 매개변수가 있는 생성자를 호출하면 됩니다.
public class Person {
String name;
float height;
float weight;
public Person() { }
public Person(String pname) { // 생성자!
name = pname;
}
}
디폴트 생성자를 직접 만들었습니다! 이제 Person 클래스를 생성할 때 두 개의 생성자 중 하나를 선택해서 사용할 수 있습니다. 디폴트 생성자를 이용해 클래스를 생성하면 그냥 Person 객체 하나가 생성되고, 이름을 매개변수로 받아 클래스를 생성하면 이름을 가진 Person 객체가 생성됩니다!
이렇게 클래스에 생성자가 두 개 이상 제공되는 경우를 생성자 오버로드라고 합니다. 클래스에 생성자를 여러 개 제공하면 이 클래스를 사용할 때 원하는 생성자를 선택해 사용할 수 있습니다. 클래스에서 일부러 디폴트 생성자를 제공하지 않는 경우도 있다고 하네요!
4. 생성자 오버로드
일부러 디폴트 생성자를 제공하지 않는 경우는 구체적으로 어떤 경우가 있을까요?
public class Student {
int studentID;
public Student(int studentID) {
this.studentID = studentID;
}
}
학생이 생성될 때, 반드시 학번이 있어야만 한다면 이렇게 생성자를 제공할 수 있습니다. 이렇게 생성자를 제공한다면 학생을 생성할 때 학번을 꼭 사용해야 하겠죠! 이런 경우에는 디폴트 생성자를 추가할 필요가 없습니다.
그리고, 디폴트 생성자로 클래스를 생성한 후에 인스턴스 변수 값을 따로 초기화할 수도 있습니다! 하지만 매개변수가 있는 생성자를 사용하는 편이 코드가 간결하고 사용하기도 편리합니다. 생성자 내부에서 따로 변수를 초기화할 수 있도록 구현해놨기 때문이죠!
즐거운... 생성자에 대해서 알아보았습니다. 저도 처음에는 생성자가 왜 있는지, 무슨 역할인지 제대로 알지 못했는데 이번 글을 작성하면서 생성자에 대해 알게 된 것 같네요! 다음 글에서는 참조 자료형에 대해 알아보도록 할게요😊