Java

[Java] 자바 생성자(Constructor) 개념 및 기본 생성자 자동 생성 조건

clolee 2025. 4. 8. 13:37

✅ 자바 생성자(Constructor) 개념 및 기본 생성자 자동 생성 조건 완전 정리


🔷 0️⃣ 생성자란 무엇인가?

📌 정의

**생성자(Constructor)**는 클래스가 객체로 생성될 때 호출되는 특수한 메서드입니다.
객체가 생성될 때 초기화 작업을 수행하며, 클래스 이름과 동일한 이름을 가지며 반환 타입이 없습니다.


✅ 왜 필요한가?

역할 설명
객체 초기화 객체 생성 시 필드 값을 원하는 값으로 설정 가능
기본 상태 보장 초기화 코드 없이 객체가 불완전한 상태로 생성되는 것을 방지
생성자 오버로딩 다양한 생성 방식 지원 가능 (기본값, 필수값 등)

✅ 생성자 기본 형식

public class Student {
    String name;
    int score;

    // 생성자
    public Student(String name, int score) {
        this.name = name;
        this.score = score;
    }
}

🔷 1️⃣ 기본 생성자의 자동 생성 조건

✅ 생성자를 정의하지 않았을 때

class Student {
    String name;
    int score;
}
  • 🔹 생성자가 없으므로 컴파일러가 자동으로 기본 생성자 Student()를 생성
  • 🔹 이 경우 별도로 작성하지 않아도 다음 코드가 정상 동작함:
Student s = new Student();  // ✅ 자동 생성된 기본 생성자 사용

📌 자동 생성된 기본 생성자는 내부적으로 super(); 호출만 수행합니다.


❌ 생성자를 하나라도 정의하면?

class Student {
    public Student(String name) {
        this.name = name;
    }
}
  • 🔸 생성자를 정의한 순간, 컴파일러는 기본 생성자를 더 이상 만들지 않음
  • 🔸 다음 코드에서 컴파일 오류 발생:
Student s = new Student();  // ❌ 컴파일 에러: 생성자 없음

✅ 해결 방법: 명시적으로 기본 생성자 추가

public Student() {
    // 기본 생성자 수동 정의
}

이렇게 하면 new Student()가 다시 가능해집니다.

public Student() {
    // 기본 생성자 직접 정의
}

🧠 한 줄 정리

자바는 클래스에 생성자를 하나도 정의하지 않았을 때만 기본 생성자를 자동으로 생성해준다.

하나라도 생성자를 만들면, 기본 생성자도 직접 정의해야 사용 가능하다.

🔷 2️⃣ 생성자 오버로딩 (Overloading)

자바에서는 **생성자를 여러 개 정의(오버로딩)**할 수 있습니다.

public class Student {
    String name;
    int score;

    // 기본 생성자
    public Student() {
        this("이름 없음", 0); // 다른 생성자 호출
    }

    // 오버로딩 생성자
    public Student(String name, int score) {
        this.name = name;
        this.score = score;
    }
}

🔁 this(...)를 통해 다른 생성자를 호출할 수 있으며, 반드시 생성자의 첫 줄에 와야 합니다.


🔷 3️⃣ 생성자에서 필드 초기화 순서

  1. 클래스 필드가 선언된 순서대로 기본값으로 초기화됨
  2. 명시적 필드 초기값이 있을 경우, 해당 값으로 덮어씀
  3. 생성자에서 값이 다시 설정됨

예:

class Person {
    String name = "기본 이름"; // 2단계
    int age;

    Person() {
        this.name = "홍길동"; // 3단계
    }
}

✅ 함께 알아두면 좋은 키워드

키워드 설명
this() 생성자 내부에서 다른 생성자 호출
super() 생성자 내부에서 부모 클래스 생성자 호출
생성자 오버로딩 다양한 초기화 방식 제공 (디폴트, 이름만, 전체 필드 등)
초기화 블록 복잡한 공통 초기화가 필요할 경우 사용 ({} 블록)

이어서 :

2025.04.08 - [Java] - [Java] 자바 생성자 확장 설명 (생성자 체이닝, 생성자 오버로딩)

2025.04.08 - [Java] - [Java] 왜 `this()` 생성자 체이닝을 사용하는가?