생성자는 객체가 생성될 때 자동으로 호출되는 특별한 메서드로, 객체의 인스턴스 변수 초기화를 위해 사용된다. 생성자는 인스턴스 생성 시에 필요한 초기 작업을 수행하며, 일반 메서드와는 몇 가지 중요한 차이점이 있다.
void
조차 적지 않음)생성자는 객체를 new
키워드를 통해 생성할 때 호출된다. 이때 객체는 메모리에 할당되고, 생성자가 호출되면서 초기화 작업을 수행한다. 생성자는 독립적으로 호출할 수 없으며, 반드시 객체 생성 시 함께 호출된다.
class Constructor {
Constructor() {
System.out.println("생성자 호출");
}
}
public class ConstructorMainEx01 {
public static void main(String[] args) {
Constructor c = new Constructor(); // '생성자 호출' 출력
}
}
Constructor
클래스는 매개변수가 없는 기본 생성자를 정의하고 있다. new Constructor()
를 호출하면, 해당 생성자가 자동으로 호출된다.
class Book {
String title;
int price;
Book(String title, int price) { // 매개변수가 있는 생성자
this.title = title;
this.price = price;
}
}
public class HelloWorld {
public static void main(String[] args) {
Book b1 = new Book(); // 오류 발생: 기본 생성자가 없기 때문
Book b2 = new Book("국어책", 3000);
}
}
Book
클래스는 매개변수가 있는 생성자만 정의되어 있어, new Book()
처럼 기본 생성자를 호출하려고 하면 오류가 발생한다.
class Book {
String title;
int price;
Book() {} // 기본 생성자 추가
Book(String title, int price) { // 매개변수가 있는 생성자
this.title = title;
this.price = price;
}
}
생성자도 오버로딩이 가능하다. 즉, 같은 이름의 생성자를 매개변수의 개수나 타입에 따라 여러 개 정의할 수 있다. 따라서, 객체 생성 시 다양한 방법으로 초기화가 가능하다.
class Constructor {
String name;
Constructor() { // 기본 생성자
this.name = "홍길동";
}
Constructor(String name) { // 매개변수를 받는 생성자
this.name = name;
}
}
public class ConstructorMainEx02 {
public static void main(String[] args) {
Constructor c1 = new Constructor(); // 기본 생성자 호출
System.out.println(c1.name); // 홍길동 출력
Constructor c2 = new Constructor("박문수"); // 매개변수가 있는 생성자 호출
System.out.println(c2.name); // 박문수 출력
}
}
this
와 this()
의 사용this
키워드: 객체 자신을 가리키는 참조 변수로, 인스턴스 변수와 매개변수를 구분할 때 사용된다.this()
: 다른 생성자를 호출할 때 사용한다. 생성자 내부에서 this()
를 사용하면, 같은 클래스 내의 다른 생성자를 호출하여 중복 코드를 줄이고, 생성자 간에 초기화 작업을 공유할 수 있다.this()
를 이용한 생성자 호출class Constructor {
String name;
int age;
Constructor() {
this("홍길동", 30); // 매개변수가 있는 생성자 호출
}
Constructor(String name, int age) {
this.name = name;
this.age = age;
}
}
public class ConstructorMainEx03 {
public static void main(String[] args) {
Constructor c = new Constructor();
System.out.println(c.name + " " + c.age); // 홍길동 30 출력
}
}
📌 생성자의 역할
- 객체 초기화: 생성자의 주요 목적은 인스턴스 변수들을 초기화하는 것이다.
- 자동 호출:
new
키워드와 함께 객체가 생성될 때 자동으로 호출된다.- 오버로딩 지원: 다양한 방식으로 객체를 초기화할 수 있도록 매개변수에 따라 여러 개의 생성자를 정의할 수 있다
- 기본 생성자: 생성자를 정의하지 않으면 컴파일러가 자동으로 기본 생성자를 생성하지만, 다른 생성자가 있으면 기본 생성자는 자동으로 생성되지 않으므로 명시적으로 추가해야 할 수 있다.
생성자가 메소드라고 말할 수는 없지만, 기능적으로 메소드와 비슷한 역할을 수행한다고 볼 수 있습니다.
✔️ 생성자와 메소드의 공통점
✔️ 생성자와 메소드의 차이점
void
)을 명시해야 합니다.void
로 정의합니다.new
키워드를 사용하여 객체를 생성할 때만 호출됩니다.