생성자란?
자바에서 생성자(Constructor)는 객체를 초기화하고 인스턴스를 생성하는 데 사용되는 특별한 종류의 메서드입니다. 생성자는 클래스의 이름과 동일하며, 객체를 생성할 때 new 키워드와 함께 호출됩니다. 생성자는 주로 객체의 초기 상태를 설정하거나 필드를 초기화하는 데 사용됩니다.
생성자의 목적
생성자의 주요 목적은 객체를 초기화하고 필요한 초기 상태로 설정하는 것입니다. 이것은 객체가 생성될 때 한 번 호출되며, 클래스의 인스턴스가 생성될 때 필요한 초기화 작업을 수행합니다. 여러 가지 목적이 있지만 주로 다음과 같은 이유로 사용됩니다.
- 인스턴스 변수 초기화: 생성자는 주로 클래스의 인스턴스 변수를 초기화하는 데 사용됩니다. 객체가 사용될 때 필요한 속성이나 상태를 초기값으로 설정하여 객체가 올바르게 동작하도록 보장합니다.
- 매개변수 전달 및 처리: 매개변수를 받는 생성자를 사용하여 객체를 생성할 때 외부에서 전달된 값들을 사용하여 초기화를 수행할 수 있습니다. 이를 통해 객체의 속성을 외부에서 지정할 수 있습니다.
- 상속 및 다형성 지원: 생성자는 상속과 다형성을 지원합니다. 부모 클래스의 생성자를 호출하여 부모 클래스의 초기화를 수행하거나 서브클래스에서 재정의된 생성자를 호출하여 특정 동작을 추가할 수 있습니다.
- 클래스 유효성 검사: 생성자는 객체가 생성될 때 입력된 값들의 유효성을 검사하고, 필요한 경우 예외를 던져서 객체의 생성을 중단시킬 수 있습니다.
요약하면, 생성자는 객체를 초기화하여 올바른 상태로 설정하고, 필요한 초기 작업을 수행하여 객체의 안정성과 일관성을 유지하는 데 중요한 역할을 합니다.
생성자의 특징
- 클래스 이름과 동일: 생성자의 이름은 해당 클래스의 이름과 동일합니다. 이로 인해 생성자를 식별할 수 있습니다.
- 리턴 타입이 없음: 생성자는 값을 반환하지 않으며, 리턴 타입이 없는(void가 아닌) 특징을 가집니다.
- 객체 초기화: 주된 목적은 객체를 초기화하는 것이며, 객체가 생성될 때 단 한 번 호출됩니다. 따라서 생성자를 통해 객체의 초기 상태를 설정할 수 있습니다.
- 오버로딩 가능: 클래스 내에 여러 개의 생성자를 정의할 수 있습니다. 이를 통해 다양한 매개변수를 받아 객체를 다양한 방식으로 초기화할 수 있습니다.
- 자동 호출: 객체를 생성할 때 new 키워드와 함께 생성자가 자동으로 호출됩니다. 생성자 호출 후에는 객체가 메모리에 할당되고, 초기화 작업이 수행됩니다.
- 상속: 부모 클래스의 생성자는 하위 클래스에서 자동으로 호출되며, 하위 클래스에서 명시적으로 부모 클래스의 생성자를 호출하는 경우에 사용됩니다.
- 기본 생성자 자동 생성: 클래스에 명시적으로 생성자를 정의하지 않으면 자바 컴파일러가 자동으로 기본 생성자를 생성합니다.
- 인스턴스 변수 초기화: 생성자는 주로 인스턴스 변수를 초기화하는 데 사용되며, 객체가 유효한 상태로 시작할 수 있도록 도와줍니다.
생성자의 사용법
생성자의 선언
클래스 내부에 생성자를 선언하는 것은 다음과 같습니다. 생성자의 이름은 클래스의 이름과 동일하게 설정되어야 합니다. (생성자는 반환타입이 없습니다.)
public class MyClass {
// 기본 생성자
public MyClass() {
// 생성자의 내용
}
}
Java디폴트 생성자
매개변수를 가지지 않는 생성자를 명시적으로 선언하지 않고도 자바 컴파일러가 자동으로 생성하는 생성자입니다. 클래스에 생성자가 하나라도 명시적으로 정의되어 있으면 디폴트 생성자는 자동으로 생성되지 않습니다.
public class MyClass {
// 매개변수가 없는 생성자를 명시적으로 선언하지 않아도
// 자바 컴파일러가 자동으로 생성함
}
Java매개변수가 있는 생성자
생성자는 매개변수를 가질 수 있으며, 매개변수를 통해 외부에서 전달된 값을 활용하여 객체를 초기화할 수 있습니다.
public class Person {
private String name;
private int age;
// 매개변수가 있는 생성자
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
Java다른 생성자 호출
같은 클래스 내에서 다른 생성자를 호출하여 코드의 중복을 방지하고 재사용성을 높일 수 있습니다.
public class MyClass {
private int value;
// 기본 생성자
public MyClass() {
this(0); // 다른 생성자 호출
}
// 매개변수가 있는 생성자
public MyClass(int value) {
this.value = value;
}
}
Java생성자의 오버로딩 (Overloading)
자바에서 생성자의 오버로딩(Overloading)은 같은 이름의 생성자를 여러 개 정의하는 것을 의미합니다. 오버로딩된 생성자들은 서로 다른 매개변수 목록을 가져야 합니다. 다양한 생성자를 제공함으로써 객체를 다양한 방식으로 초기화할 수 있습니다.
매개변수의 개수나 타입이 다른 생성자 정의
생성자 오버로딩은 매개변수의 개수나 타입을 다르게 하여 같은 이름의 생성자를 여러 개 정의하는 것입니다. 예를 들어, 클래스에는 여러 생성자가 있을 수 있습니다.
public class MyClass {
private int value;
// 생성자 오버로딩
public MyClass() {
// 매개변수 없는 생성자
this.value = 0;
}
// 매개변수가 있는 생성자
public MyClass(int value) {
// 매개변수가 있는 생성자
this.value = value;
}
// 다른 매개변수 타입을 가진 생성자
public MyClass(String strValue) {
// 다른 매개변수 타입을 가진 생성자
this.value = Integer.parseInt(strValue);
}
}
Java매개변수의 개수와 타입에 따라 호출되는 생성자가 결정됨
생성자를 호출할 때 전달하는 매개변수의 개수와 타입에 따라 어떤 생성자가 호출될지 자동으로 결정됩니다. 컴파일러는 호출될 생성자를 선택하기 위해 전달된 매개변수의 타입 및 개수와 일치하는 생성자를 찾습니다.
// 생성자 호출
MyClass obj1 = new MyClass(); // 매개변수 없는 생성자 호출
MyClass obj2 = new MyClass(42); // 매개변수가 있는 생성자 호출
MyClass obj3 = new MyClass("123"); // 다른 매개변수 타입을 가진 생성자 호출
Java✔️생성자 오버로딩은 다양한 상황에서 객체를 생성하고 초기화할 수 있도록 하여 코드의 유연성을 제공하며, 다양한 요구사항에 대응할 수 있도록 도와줍니다.
생성자에서 다른 생성자 호출 – this
this를 사용하여 같은 클래스의 다른 생성자를 호출하는 것을 생성자 체이닝(Constructor Chaining)이라고 합니다. 이를 통해 중복 코드를 최소화하고 재사용성을 높일 수 있습니다.
💡this 를 사용해 다른 생성자를 호출할 때는 첫줄에서만 호출할 수 있습니다.
public class Product {
private String name;
private double price;
private int quantity;
// 기본 생성자
public Product() {
this("Unknown", 0.0, 0); // 다른 생성자 호출
}
// 매개변수가 1개인 생성자
public Product(String name) {
this(name, 0.0, 0); // 다른 생성자 호출
}
// 매개변수가 2개인 생성자
public Product(String name, double price) {
this(name, price, 0); // 다른 생성자 호출
}
// 매개변수가 3개인 생성자
public Product(String name, double price, int quantity) {
this.name = name;
this.price = price;
this.quantity = quantity;
}
// 상품 정보 출력 메서드
public void displayProductInfo() {
System.out.println("Product: " + name);
System.out.println("Price: $" + price);
System.out.println("Quantity: " + quantity);
}
public static void main(String[] args) {
// 다양한 생성자 호출
Product product1 = new Product(); // 매개변수가 없는 생성자 호출
Product product2 = new Product("Laptop"); // 매개변수가 1개인 생성자 호출
Product product3 = new Product("Smartphone", 799.99); // 매개변수가 2개인 생성자 호출
Product product4 = new Product("Tablet", 299.99, 10); // 매개변수가 3개인 생성자 호출
Product product5 = new Product("Camera", 2); // 다른 매개변수 타입을 가진 생성자 호출
// 상품 정보 출력
product1.displayProductInfo();
System.out.println();
product2.displayProductInfo();
System.out.println();
product3.displayProductInfo();
System.out.println();
product4.displayProductInfo();
System.out.println();
product5.displayProductInfo();
}
}
//결과
Product: Unknown
Price: $0.0
Quantity: 0
Product: Laptop
Price: $0.0
Quantity: 0
Product: Smartphone
Price: $799.99
Quantity: 0
Product: Tablet
Price: $299.99
Quantity: 10
Product: Camera
Price: $0.0
Quantity: 2
Java✔️이 예제에서는 this 키워드를 사용하여 생성자에서 다른 생성자를 호출하였습니다. 각 생성자는 자신의 매개변수를 초기화한 후 다른 생성자를 호출하여 중복 코드를 피하고, 초기화 로직을 재사용합니다.
결론
자바의 생성자는 객체를 초기화하고 인스턴스를 생성하는 메서드로, 주로 객체의 초기 상태를 설정하거나 필드를 초기화하는 데 사용됩니다. 클래스 이름과 동일하며, 객체를 생성할 때 new 키워드와 함께 호출됩니다. 생성자의 주요 목적은 객체를 초기화하고 필요한 초기 상태로 설정하는 것이며, 주로 인스턴스 변수를 초기화하거나 매개변수를 전달하여 객체를 초기화하는 데 사용됩니다.
생성자는 리턴 타입이 없고, 클래스의 다양한 상황에 맞게 여러 개 정의할 수 있습니다. 생성자의 특징으로는 클래스 이름과 동일하며, 객체 초기화, 오버로딩 가능, 자동 호출, 상속 등이 있습니다.
적절한 생성자를 설계하여 객체를 효과적으로 초기화하고 다양한 상황에 대응하는 것이 중요합니다.