✅ 생성자(Constructor)
자바에서 생성자(Constructor)는 클래스의 인스턴스를 초기화하는 특별한 메서드입니다. 객체를 생성할 때 호출되며, 주로 객체의 멤버 변수를 초기화하고 객체의 초기 상태를 설정하는 데 사용됩니다. 생성자는 클래스 이름과 동일한 이름을 가지고 있으며, 반환 값(return)이 없고 실제로 반환 타입을 선언하지 않습니다.
- 생성자의 특징
- 생성자는 클래스의 인스턴스를 초기화하는 데 사용됩니다.
- 생성자는 객체를 생성할 때 자동으로 호출됩니다.
- 생성자는 클래스 이름과 동일한 이름을 가지고 있습니다.
- 생성자는 반환 값(return)이 없고, 반환 타입을 선언하지 않습니다.
- 클래스에 생성자를 명시적으로 선언하지 않으면 컴파일러가 기본 생성자를 자동으로 생성합니다.(default Constructor)
- 생성자의 사용 방법
- 생성자는 new 키워드와 함께 사용하여 객체를 생성할 때 호출됩니다.
- 생성자를 호출할 때는 클래스 이름 다음에 괄호()를 사용합니다.
- 생성자를 오버로딩(여러 개의 생성자를 선언)하여 다양한 초기화 방법을 제공할 수 있습니다.
- 기본 생성자와 매개 변수가 있는 생성자
public class Person { private String name; private int age; // 매개변수가 없는 디폴트 생성자 public Person() { name = "Unknown"; age = 0; } // 이름과 나이를 받는 생성자 public Person(String name, int age) { this.name = name; this.age = age; } // Getter 및 Setter 메서드 생략 public static void main(String[] args) { // 기본 생성자를 사용하여 객체 생성 Person person1 = new Person(); System.out.println(person1.getName()); // "Unknown" System.out.println(person1.getAge()); // 0 // 매개변수를 받는 생성자를 사용하여 객체 생성 Person person2 = new Person("Alice", 25); System.out.println(person2.getName()); // "Alice" System.out.println(person2.getAge()); // 25 } }
Person 클래스가 있고, 기본 생성자와 매개변수를 받는 생성자를 정의하였습니다. 디폴트 생성자는 name과 age를 초기화하고, 매개변수를 받는 생성자는 전달된 값을 사용하여 초기화합니다. main 메서드에서는 두 가지 방식으로 객체를 생성하여 결과를 출력합니다.
- 부모 생성자 호출
class Child extends Parent { private int childData; public Child(int parentData, int childData) { super(parentData); // 부모 클래스의 생성자 호출 this.childData = childData; System.out.println("Child constructor"); } } public class Main { public static void main(String[] args) { Child child = new Child(10, 20); } }
Child 클래스는 Parent 클래스를 상속하고 있습니다. Child 클래스의 생성자에서 super(parentData)를 호출하여 Parent 클래스의 생성자를 호출하고 있습니다. 이렇게 하면 Parent 클래스의 생성자가 먼저 실행되고, 그 후에 Child 클래스의 생성자가 실행됩니다.
- 디폴트 생성자(default Constructor)
public class MyClass { private int myNumber; private String myString; // 생성자를 정의하지 않음 // getter 및 setter 메서드 생략 // 클래스의 다른 메서드들 생략 }
MyClass 클래스에는 생성자가 명시적으로 정의되지 않았습니다. 따라서 컴파일러는 디폴트 생성자를 자동으로 생성합니다. 이 디폴트 생성자는 매개변수 없이 객체를 초기화하며, myNumber 변수를 0으로, myString 변수를 null로 초기화합니다.
🔎—default 생성자의 자동 생성 클래스를 정의할 때 생성자를 명시적으로 정의하지 않으면, 컴파일러는 디폴트 생성자를 자동으로 생성합니다. 디폴트 생성자는 매개변수 없이 객체를 초기화하는 역할을 합니다. 디폴트 생성자는 클래스의 멤버 변수들을 기본값으로 초기화합니다. 예를 들어, 정수형 변수는 0으로, 실수형 변수는 0.0으로, 참조형 변수는 null로 초기화됩니다. 또한, 클래스에 상속이 있는 경우에는 부모 클래스의 디폴트 생성자도 호출됩니다. 하지만 클래스에서 생성자를 하나 이상 명시적으로 정의한 경우에는 컴파일러는 디폴트 생성자를 자동으로 생성하지 않습니다. 이 경우 객체를 생성할 때는 명시적으로 정의된 생성자 중 하나를 호출해야 합니다.
✅ 생성자 빌더 패턴(Constructor Builder Pattern)
생성자 빌더 패턴(Constructor Builder Pattern)은 복잡한 객체 생성을 위해 사용되는 디자인 패턴입니다. 이 패턴은 많은 매개변수를 갖는 생성자를 간결하고 가독성이 높은 방식으로 구현할 수 있도록 도와줍니다.
public class Person {
private String firstName;
private String lastName;
private int age;
private String address;
private String phoneNumber;
private Person(Builder builder) {
this.firstName = builder.firstName;
this.lastName = builder.lastName;
this.age = builder.age;
this.address = builder.address;
this.phoneNumber = builder.phoneNumber;
}
// Getter methods...
public static class Builder {
private String firstName;
private String lastName;
private int age;
private String address;
private String phoneNumber;
public Builder() {
}
public Builder setFirstName(String firstName) {
this.firstName = firstName;
return this;
}
public Builder setLastName(String lastName) {
this.lastName = lastName;
return this;
}
public Builder setAge(int age) {
this.age = age;
return this;
}
public Builder setAddress(String address) {
this.address = address;
return this;
}
public Builder setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
return this;
}
public Person build() {
return new Person(this);
}
}
}
Person 클래스의 생성자 매개변수로 Builder 객체를 받아 Builder 객체의 필드를 Person 객체의 필드로 저장하는 생성자입니다. 이 생성자는 private으로 외부에서 접근해서 생성할 수 없고 static 키워드를 통해서 Person 객체를 생성하지 않고 클래스 이름을 통해서 접근할 수 있습니다. 따라서 static inner class로 Builler을 구성하여, 내부 클래스를 통해서 private 생성자에게 접근하여 Person 객체를 생성하고 반환하는 build()
메소드를 만들었습니다.
실제 사용하는 예시는 아래와 같습니다.
Person person = new Person.Builder()
.setFirstName("John")
.setLastName("Doe")
.setAge(30)
.setAddress("123 Main St")
.setPhoneNumber("555-1234")
.build();
Builder 객체를 생성한 후, setter 메소드를 통해서 Builder 객체의 필드의 값을 수정합니다. Builder 객체가 가지고 있는 build()
메소드를 호출하여 Builder 객체를 인수로 넘겨 Person 객체를 생성합니다. 이때 Person 생성자가 호출될 수 있는 이유는 Builder 클래스가 Person 클래스의 내부 클래스이기 때문입니다. Person 생성자는 인수로 받은 Builder 객체를 통해서 Builder 객체의 필드 값을 Person 객체의 필드로 저장하여 Person 객체를 생성합니다. 생성된 Person 객체는 build()
메소드가 반환하여 Person 타입의 person 참조 변수에 대입되어 사용되게 됩니다.
생성자 빌더 패턴은 불변성(Immutability)과 함께 사용될 때 특히 유용합니다. Person 클래스의 필드가 final로 선언되고, Builder 클래스에서 설정한 매개변수를 통해 객체를 생성하면, 생성된 객체는 변경할 수 없는 불변 객체가 됩니다.
🏷️이미지 출처 및 참고한 사이트
![](https://www.w3schools.com/images/w3schools_logo_436_2.png)
![](https://www.geeksforgeeks.org/wp-content/uploads/gfg_200X200.png)
![](https://media.geeksforgeeks.org/wp-content/cdn-uploads/gfg_200x200-min.png)
![](https://img1.daumcdn.net/thumb/R800x0/?scode=mtistory2&fname=https%3A%2F%2Ft1.daumcdn.net%2Ftistory_admin%2Fstatic%2Fimages%2FopenGraph%2Fopengraph.png)
![](https://www.geeksforgeeks.org/wp-content/uploads/gfg_200X200.png)
![](https://media.geeksforgeeks.org/wp-content/cdn-uploads/gfg_200x200-min.png)
Uploaded by N2T