Java 자바 생성자 (Constructor) 특징과 사용법

suover

java

생성자란?

자바에서 생성자(Constructor)는 객체를 초기화하고 인스턴스를 생성하는 데 사용되는 특별한 종류의 메서드입니다. 생성자는 클래스의 이름과 동일하며, 객체를 생성할 때 new 키워드와 함께 호출됩니다. 생성자는 주로 객체의 초기 상태를 설정하거나 필드를 초기화하는 데 사용됩니다.

생성자의 목적

생성자의 주요 목적은 객체를 초기화하고 필요한 초기 상태로 설정하는 것입니다. 이것은 객체가 생성될 때 한 번 호출되며, 클래스의 인스턴스가 생성될 때 필요한 초기화 작업을 수행합니다. 여러 가지 목적이 있지만 주로 다음과 같은 이유로 사용됩니다.

  1. 인스턴스 변수 초기화: 생성자는 주로 클래스의 인스턴스 변수를 초기화하는 데 사용됩니다. 객체가 사용될 때 필요한 속성이나 상태를 초기값으로 설정하여 객체가 올바르게 동작하도록 보장합니다.
  2. 매개변수 전달 및 처리: 매개변수를 받는 생성자를 사용하여 객체를 생성할 때 외부에서 전달된 값들을 사용하여 초기화를 수행할 수 있습니다. 이를 통해 객체의 속성을 외부에서 지정할 수 있습니다.
  3. 상속 및 다형성 지원: 생성자는 상속과 다형성을 지원합니다. 부모 클래스의 생성자를 호출하여 부모 클래스의 초기화를 수행하거나 서브클래스에서 재정의된 생성자를 호출하여 특정 동작을 추가할 수 있습니다.
  4. 클래스 유효성 검사: 생성자는 객체가 생성될 때 입력된 값들의 유효성을 검사하고, 필요한 경우 예외를 던져서 객체의 생성을 중단시킬 수 있습니다.

요약하면, 생성자는 객체를 초기화하여 올바른 상태로 설정하고, 필요한 초기 작업을 수행하여 객체의 안정성과 일관성을 유지하는 데 중요한 역할을 합니다.

생성자의 특징

  1. 클래스 이름과 동일: 생성자의 이름은 해당 클래스의 이름과 동일합니다. 이로 인해 생성자를 식별할 수 있습니다.
  2. 리턴 타입이 없음: 생성자는 값을 반환하지 않으며, 리턴 타입이 없는(void가 아닌) 특징을 가집니다.
  3. 객체 초기화: 주된 목적은 객체를 초기화하는 것이며, 객체가 생성될 때 단 한 번 호출됩니다. 따라서 생성자를 통해 객체의 초기 상태를 설정할 수 있습니다.
  4. 오버로딩 가능: 클래스 내에 여러 개의 생성자를 정의할 수 있습니다. 이를 통해 다양한 매개변수를 받아 객체를 다양한 방식으로 초기화할 수 있습니다.
  5. 자동 호출: 객체를 생성할 때 new 키워드와 함께 생성자가 자동으로 호출됩니다. 생성자 호출 후에는 객체가 메모리에 할당되고, 초기화 작업이 수행됩니다.
  6. 상속: 부모 클래스의 생성자는 하위 클래스에서 자동으로 호출되며, 하위 클래스에서 명시적으로 부모 클래스의 생성자를 호출하는 경우에 사용됩니다.
  7. 기본 생성자 자동 생성: 클래스에 명시적으로 생성자를 정의하지 않으면 자바 컴파일러가 자동으로 기본 생성자를 생성합니다.
  8. 인스턴스 변수 초기화: 생성자는 주로 인스턴스 변수를 초기화하는 데 사용되며, 객체가 유효한 상태로 시작할 수 있도록 도와줍니다.

생성자의 사용법

생성자의 선언

클래스 내부에 생성자를 선언하는 것은 다음과 같습니다. 생성자의 이름은 클래스의 이름과 동일하게 설정되어야 합니다. (생성자는 반환타입이 없습니다.)

Java
public class MyClass {
    // 기본 생성자
    public MyClass() {
        // 생성자의 내용
    }
}
Java

디폴트 생성자

매개변수를 가지지 않는 생성자를 명시적으로 선언하지 않고도 자바 컴파일러가 자동으로 생성하는 생성자입니다. 클래스에 생성자가 하나라도 명시적으로 정의되어 있으면 디폴트 생성자는 자동으로 생성되지 않습니다.

Java
public class MyClass {
    // 매개변수가 없는 생성자를 명시적으로 선언하지 않아도
    // 자바 컴파일러가 자동으로 생성함
}
Java

매개변수가 있는 생성자

생성자는 매개변수를 가질 수 있으며, 매개변수를 통해 외부에서 전달된 값을 활용하여 객체를 초기화할 수 있습니다.

Java
public class Person {
    private String name;
    private int age;

    // 매개변수가 있는 생성자
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
Java

다른 생성자 호출

같은 클래스 내에서 다른 생성자를 호출하여 코드의 중복을 방지하고 재사용성을 높일 수 있습니다.

Java
public class MyClass {
    private int value;

    // 기본 생성자
    public MyClass() {
        this(0); // 다른 생성자 호출
    }

    // 매개변수가 있는 생성자
    public MyClass(int value) {
        this.value = value;
    }
}
Java

생성자의 오버로딩 (Overloading)

자바에서 생성자의 오버로딩(Overloading)은 같은 이름의 생성자를 여러 개 정의하는 것을 의미합니다. 오버로딩된 생성자들은 서로 다른 매개변수 목록을 가져야 합니다. 다양한 생성자를 제공함으로써 객체를 다양한 방식으로 초기화할 수 있습니다.

매개변수의 개수나 타입이 다른 생성자 정의

생성자 오버로딩은 매개변수의 개수나 타입을 다르게 하여 같은 이름의 생성자를 여러 개 정의하는 것입니다. 예를 들어, 클래스에는 여러 생성자가 있을 수 있습니다.

Java
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

매개변수의 개수와 타입에 따라 호출되는 생성자가 결정됨

생성자를 호출할 때 전달하는 매개변수의 개수와 타입에 따라 어떤 생성자가 호출될지 자동으로 결정됩니다. 컴파일러는 호출될 생성자를 선택하기 위해 전달된 매개변수의 타입 및 개수와 일치하는 생성자를 찾습니다.

Java
// 생성자 호출
MyClass obj1 = new MyClass();          // 매개변수 없는 생성자 호출
MyClass obj2 = new MyClass(42);        // 매개변수가 있는 생성자 호출
MyClass obj3 = new MyClass("123");     // 다른 매개변수 타입을 가진 생성자 호출
Java

✔️생성자 오버로딩은 다양한 상황에서 객체를 생성하고 초기화할 수 있도록 하여 코드의 유연성을 제공하며, 다양한 요구사항에 대응할 수 있도록 도와줍니다.

생성자에서 다른 생성자 호출 – this

this를 사용하여 같은 클래스의 다른 생성자를 호출하는 것을 생성자 체이닝(Constructor Chaining)이라고 합니다. 이를 통해 중복 코드를 최소화하고 재사용성을 높일 수 있습니다.

💡this 를 사용해 다른 생성자를 호출할 때는 첫줄에서만 호출할 수 있습니다.

Java
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 키워드와 함께 호출됩니다. 생성자의 주요 목적은 객체를 초기화하고 필요한 초기 상태로 설정하는 것이며, 주로 인스턴스 변수를 초기화하거나 매개변수를 전달하여 객체를 초기화하는 데 사용됩니다.

생성자는 리턴 타입이 없고, 클래스의 다양한 상황에 맞게 여러 개 정의할 수 있습니다. 생성자의 특징으로는 클래스 이름과 동일하며, 객체 초기화, 오버로딩 가능, 자동 호출, 상속 등이 있습니다.

적절한 생성자를 설계하여 객체를 효과적으로 초기화하고 다양한 상황에 대응하는 것이 중요합니다.

Leave a Comment