Java - 생성자

develkkm·2025년 9월 11일

0부터 시작하는 Java

목록 보기
13/27

생성자(Constructor)


생성자가 필요한 이유

객체를 만들고 나면 보통은 곧바로 초기값을 넣어야 한다.
예를 들어, 회원 객체를 생성하자마자 이름·나이·성적을 설정하는 경우가 많다.

MemberInit member1 = new MemberInit();
member1.name = "user1";
member1.age = 15;
member1.grade = 90;

이 초기화 작업은 매번 반복된다.
물론 initMember(...) 같은 메서드를 만들어 중복을 줄일 수 있지만, 객체 생성 직후 반드시 호출해야 한다는 보장이 없다.
→ 이 문제를 해결하는 것이 바로 생성자(Constructor)다.


this 키워드와 초기화 메서드

public class MemberInit {
    String name;
    int age;
    int grade;

    void initMember(String name, int age, int grade) {
        this.name = name;   // 인스턴스 자신의 참조값을 의미
        this.age = age;
        this.grade = grade;
    }
}
  • 지역 변수와 멤버 변수 이름이 같으면 지역 변수가 우선한다.
  • 따라서 멤버 변수에 접근하려면 this를 붙여야 한다.
  • this는 인스턴스 자기 자신을 가리키는 참조값이다.
this.name = name;
// 1. 오른쪽 name → 매개변수
// 2. this.name → 인스턴스의 멤버 변수

생성자 도입

생성자를 사용하면 객체를 만들자마자 초기화를 강제할 수 있다.

public class MemberConstruct {
    String name;
    int age;
    int grade;

    MemberConstruct(String name, int age, int grade) {
        System.out.println("생성자 호출 name=" + name);
        this.name = name;
        this.age = age;
        this.grade = grade;
    }
}

사용 예시:

MemberConstruct member1 = new MemberConstruct("user1", 15, 90);
MemberConstruct member2 = new MemberConstruct("user2", 16, 80);

출력:

생성자 호출 name=user1
생성자 호출 name=user2
  • 생성자의 이름은 클래스명과 같아야 한다.
  • 반환 타입이 없다.

생성자의 장점

  1. 중복 제거
    객체 생성과 동시에 초기화를 처리한다.

    // 생성자 전
    MemberInit member = new MemberInit();
    member.initMember("user1", 15, 90);
    
    // 생성자 후
    MemberConstruct member = new MemberConstruct("user1", 15, 90);
  2. 필수값 입력 보장

    • 생성자가 있으면 반드시 호출해야 한다.
    • 초기화를 빼먹을 가능성이 없다.
    • 따라서 “유령 객체”가 생기지 않는다.

기본 생성자

public class MemberDefault {
    String name;
}

위 코드에서 다음과 같이 호출할 수 있다:

MemberDefault member = new MemberDefault(); // OK
  • 생성자를 하나도 정의하지 않으면, 자바가 매개변수 없는 기본 생성자를 자동으로 추가한다.
  • 하지만 생성자를 하나라도 정의하면, 자동 기본 생성자는 만들어지지 않는다.

직접 정의할 수도 있다:

MemberDefault() {
    System.out.println("생성자 호출");
}

생성자 오버로딩과 this()

생성자도 오버로딩이 가능하다.

public class MemberConstruct {
    String name;
    int age;
    int grade;

    MemberConstruct(String name, int age) {
        this(name, age, 50); // 다른 생성자 호출
    }

    MemberConstruct(String name, int age, int grade) {
        this.name = name;
        this.age = age;
        this.grade = grade;
    }
}
  • this()를 사용하면 같은 클래스의 다른 생성자를 호출할 수 있다.
  • 반드시 첫 줄에만 작성해야 한다.
profile
알던것을 더 확실하게

0개의 댓글