자바에서 객체를 생성할 때 반드시 거치게 되는 것이 바로 생성자(Constructor)입니다. 생성자는 크게 기본 생성자(Default Constructor)와 매개변수가 있는 생성자(Parameterized Constructor)로 나눌 수 있으며, 두 생성자는 정의 방식과 역할에서 뚜렷한 차이를 보입니다. 이 글에서는 두 생성자의 개념과 동작 원리를 예제 코드와 함께 자세히 살펴보겠습니다.
기본 생성자(Default Constructor)란?
- 기본 생성자는 인수(매개변수)가 0개인 생성자로, 내부적으로 슈퍼 클래스(super class)의 생성자를 인수 없이 호출하는 코드를 포함합니다.
- 새롭게 생성된 객체에 기본값(default value)을 할당하는 것이 기본 생성자의 가장 중요한 역할입니다.
- 컴파일러는 프로그래머가 클래스에 어떤 생성자도 작성하지 않은 경우에만 기본 생성자를 코드에 자동으로 추가합니다.
- 기본 생성자의 접근 제한자(access modifier)는 항상 클래스의 접근 제한자와 동일하지만, 이 규칙은 "public"과 "default" 접근 제한자에만 적용됩니다.
컴파일러는 언제 기본 생성자를 추가할까?
- 컴파일러는 프로그래머가 코드에 생성자를 하나도 작성하지 않았을 때만 기본 생성자를 자동으로 추가합니다.
- 반대로 프로그래머가 생성자를 하나라도 직접 작성했다면, 컴파일러는 더 이상 어떤 생성자도 추가하지 않습니다.
- 모든 기본 생성자는 인수가 없는 생성자이지만, 모든 인수 없는 생성자가 기본 생성자인 것은 아니다라는 점을 기억해야 합니다. 즉, 프로그래머가 직접 작성한 인수 없는 생성자는 기본 생성자가 아니라 '명시적 무인수 생성자'입니다.
매개변수가 있는 생성자(Parameterized Constructor)란?
- 매개변수가 있는 생성자는 호출 시 특정 개수의 인수를 전달받도록 정의된 생성자입니다.
- 그 목적은 서로 다른 객체들의 인스턴스 변수에 사용자가 원하는 구체적인 값을 할당하는 것입니다.
- 매개변수가 있는 생성자는 컴파일러가 자동으로 만들어 주지 않으며, 프로그래머가 명시적으로 작성해야 합니다.
- 접근 제한자는 클래스의 접근 제한자와 동일하게 설정되며, 이 규칙 역시 "public"과 "default" 접근 제한자에만 적용됩니다.
예제 코드
public class Student {
int roll_no;
String stu_name;
Student(int i, String n) { // 매개변수가 있는 생성자
roll_no = i;
stu_name = n;
}
void display() {
System.out.println(roll_no + " " + stu_name);
}
public static void main(String args[]) {
Student s1 = new Student(1, "Adithya");
Student s2 = new Student(2, "Jai");
s1.display();
s2.display();
}
}
위 프로그램에서 프로그래머는 매개변수 2개(int형 roll 번호와 String형 이름)를 받는 매개변수가 있는 생성자를 하나 정의했습니다. 따라서 컴파일러는 더 이상 기본 생성자를 코드에 추가하지 않으며, 프로그래머 역시 인수 없는 생성자를 작성하지 않았습니다. 그 결과 new Student()처럼 인수 없이 객체를 생성하려 하면 컴파일 오류가 발생하게 됩니다.
실행 결과
1 Adithya 2 Jai
정리
기본 생성자는 컴파일러가 필요할 때 자동으로 만들어 주어 객체에 기본값을 부여하는 역할을 하고, 매개변수가 있는 생성자는 프로그래머가 직접 작성하여 객체마다 원하는 값을 초기화하는 데 사용됩니다. 단, 생성자를 하나라도 직접 정의하는 순간 컴파일러는 기본 생성자를 더 이상 제공하지 않으므로, 필요하다면 인수 없는 생성자를 직접 작성해 주는 것이 좋습니다.