Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java에서 매개변수화된 생성자(Parameterized Constructor) 만드는 방법


생성자(Constructor)란 무엇인가?

생성자는 메서드와 비슷한 형태를 가지지만, 클래스의 객체가 생성되는 시점에 자동으로 호출되는 특별한 멤버입니다. 일반적으로 클래스의 인스턴스 변수를 초기화하는 용도로 사용됩니다.

생성자는 다음과 같은 특징을 가지고 있습니다.

  • 생성자의 이름은 반드시 클래스 이름과 같아야 합니다.
  • 반환 타입(return type)이 없으며, void조차 붙이지 않습니다.
  • 객체를 생성할 때 new 키워드와 함께 자동으로 호출됩니다.

Java의 생성자는 크게 두 가지 유형으로 나뉩니다.

  • 매개변수 없는 생성자(No-arg Constructor) – 인자를 전달받지 않는 기본 형태의 생성자
  • 매개변수화된 생성자(Parameterized Constructor) – 인자를 전달받아 인스턴스 변수를 초기화하는 생성자

매개변수화된 생성자란?

매개변수화된 생성자는 하나 이상의 매개변수를 받아들여, 그 값으로 인스턴스 변수를 초기화합니다. 이 생성자를 사용하면 객체를 인스턴스화하는 시점에 서로 다른 값을 전달하여 클래스 변수를 동적으로 초기화할 수 있습니다.

또한 매개변수의 개수나 타입이 서로 다른 여러 생성자를 하나의 클래스에 정의하는 생성자 오버로딩(Constructor Overloading)을 함께 활용하면, 상황에 따라 다양한 방식으로 객체를 유연하게 초기화할 수 있습니다.

예제 코드

다음 예제는 학생 정보를 담는 StudentData 클래스에 매개변수 조합이 서로 다른 네 가지 생성자를 정의하고, 각각의 생성자로 객체를 생성한 뒤 정보를 출력하는 프로그램입니다.

import java.util.Scanner;

public class StudentData {
    private String name;
    private int age;

    // 이름과 나이를 모두 받는 매개변수화된 생성자
    public StudentData(String name, int age){
        this.name = name;
        this.age = age;
    }

    // 매개변수가 없는 기본 생성자
    public StudentData(){
        this(null, 0);
    }

    // 이름만 받는 생성자
    public StudentData(String name) {
        this(name, 0);
    }

    // 나이만 받는 생성자
    public StudentData(int age) {
        this(null, age);
    }

    public void display(){
        System.out.println("학생 이름: " + this.name);
        System.out.println("학생 나이: " + this.age);
    }

    public static void main(String args[]) {
        // 사용자로부터 값 입력받기
        Scanner sc = new Scanner(System.in);
        System.out.println("학생의 이름을 입력하세요: ");
        String name = sc.nextLine();

        System.out.println("학생의 나이를 입력하세요: ");
        int age = sc.nextInt();
        System.out.println(" ");

        // 두 값을 모두 받는 생성자 호출
        System.out.println("[이름과 나이를 모두 받는 생성자]");
        new StudentData(name, age).display();
        System.out.println(" ");

        // 이름만 받는 생성자 호출
        System.out.println("[이름만 받는 생성자]");
        new StudentData(name).display();
        System.out.println(" ");

        // 나이만 받는 생성자 호출
        System.out.println("[나이만 받는 생성자]");
        new StudentData(age).display();
        System.out.println(" ");

        // 기본 생성자 호출
        System.out.println("[기본 생성자]");
        new StudentData().display();
    }
}

실행 결과

학생의 이름을 입력하세요:
Krishna
학생의 나이를 입력하세요:
22

[이름과 나이를 모두 받는 생성자]
학생 이름: Krishna
학생 나이: 22

[이름만 받는 생성자]
학생 이름: Krishna
학생 나이: 0

[나이만 받는 생성자]
학생 이름: null
학생 나이: 22

[기본 생성자]
학생 이름: null
학생 나이: 0

코드 해설

위 예제의 핵심 포인트는 다음과 같습니다.

  • this(...)를 활용한 생성자 체이닝: 매개변수가 적은 생성자들은 내부적으로 this(...)를 호출하여 두 값을 모두 받는 생성자에게 초기화 작업을 위임합니다. 이를 통해 중복 코드를 줄이고 유지보수성을 높일 수 있습니다.
  • 오버로딩에 의한 생성자 선택: new StudentData(name, age), new StudentData(name), new StudentData(age), new StudentData()처럼 전달하는 인자의 개수와 타입에 따라 컴파일러가 알맞은 생성자를 자동으로 선택합니다.
  • 초기화되지 않은 값의 처리: 이름만 전달하면 나이는 0으로, 나이만 전달하면 이름은 null로 초기화됩니다. 이는 String 참조형 변수의 기본값이 null이고, int의 기본값이 0이기 때문입니다.

이처럼 매개변수화된 생성자와 생성자 오버로딩을 적절히 조합하면, 객체 생성 시점에 필요한 데이터만 유연하게 전달하면서 인스턴스 변수를 깔끔하게 초기화할 수 있습니다.