[Java] 생성자 - 오버로딩과 this()

코드 속의 "진돌"·2024년 2월 10일
0
post-thumbnail

✅ 생성자 - 오버로딩


생성자도 메서드 오버로딩처럼 매개변수만 다르게 해서 여러 생성자를 제공할 수 있다.



✏️ MemberConstruct - 생성자 추가

package construct;

public class MemberConstruct {
  String name;
  int age;
  int grade;
  
  // 추가
  MemberConstruct(String name, int age) {
    this.name = name;
    this.age = age;
    this.grade = 50;
  }

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

기존 MemberConstruct에 생성자를 하나 추가해서 생성자가 2개가 되었다.

MemberConstruct(String name, int age)
MemberConstruct(String name, int age, int grade)

새로 추가한 생성자는 grade를 받지 않는다. 대신에 grade50점이 된다.



✏️ ConstructMain2

package construct;

public class ConstructMain2 {

  public static void main(String[] args) {
    MemberConstruct member1 = new MemberConstruct("user1", 15, 90);
    MemberConstruct member2 = new MemberConstruct("user2", 16);

    MemberConstruct[] members = {member1, member2};

    for (MemberConstruct s : members) {
      System.out.println("이름: " + s.name + " 나이: " + s.age + " 성적: " + s.grade);
    }
  }
}



🖥️ 실행 결과

생성자를 오버로딩 한 덕분에 성적 입력이 꼭 필요한 경우에는 grade가 있는 생성자를 호출하면 되고, 그렇지 않은 경우에는 grade가 없는 생성자를 호출하면 된다. grade가 없는 생성자를 호출하면 성적은 50점이 된다.




✅ 생성자 - this()


두 생성자를 비교해보면 코드가 중복되는 부분이 있다.

MemberConstruct(String name, int age) {
    this.name = name;
    this.age = age;
    this.grade = 50;
  }
MemberConstruct(String name, int age, int grade) {
    this.name = name;
    this.age = age;
    this.grade = grade;
  }

바로 다음 부분이다.

this.name = name;
this.age = age;

이때 this()라는 기능을 사용하면 생성자 내부에서 자신의 생성자를 호출할 수 있다. 참고로 this는 인스턴스 자신의 참조값을 가리킨다. 그래서 자신의 생성자를 호출한다고 생각하면 된다.

코드를 다음과 같이 수정해보자.



✏️ MemberConstruct - this() 사용

package construct;

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) {
    System.out.println("생성자 호출 name: " + name + ", age: " + age + ", grade: " + grade);
    this.name = name;
    this.age = age;
    this.grade = grade;
  }
}

이 코드는 첫 번째 생성자 내부에서 두 번째 생성자를 호출한다.

MemberConstruct(String name, int age) -> MemberConstruct(String name, int age, int grade)

this()를 사용하면 생성자 내부에서 다른 생성자를 호출할 수 있다. 이 부분을 잘 활용하면 중복을 제거할 수 있다.



💡 this() 규칙

  • this()생성자 코드의 첫줄에만 작성할 수 있다.

다음은 규칙 위반이다. 이 경우 컴파일 오류가 발생한다.

public MemberConstruct(String name, int age) {
	System.out.println("go");
	this(name, age, 50);
}
profile
매일 성장하는 주니어 개발자의 기록📝

0개의 댓글