Java에서 생성자 오버로드

Mohammad Irfan 2023년10월12일
  1. Java의 기본 생성자
  2. Java의 매개변수화된 생성자
  3. 생성자 오버로딩 없는 코드
  4. Java의 생성자 오버로딩
  5. 생성자 오버로딩 모범 사례
  6. 생성자 오버로드
Java에서 생성자 오버로드

이 자습서에서는 Java에서 생성자를 오버로드하는 방법을 소개합니다. 또한 이 주제를 더 잘 이해하기 위해 따를 수 있는 몇 가지 예제 코드를 나열했습니다.

생성자는 클래스 개체에 대한 메모리를 할당하고 해당 개체에 대한 클래스 속성을 초기화하기 위해 호출되는 메서드입니다. 클래스에 대해 생성자가 생성되지 않은 경우 Java는 기본 생성자를 제공합니다.

예를 들어 아래 클래스에는 생성자가 정의되어 있지 않습니다. 그래도 속성이 기본값(이 경우 null)으로 초기화되는 동안 해당 클래스의 개체를 만들 수 있습니다.

Java의 기본 생성자

class Student {
  String name;
  Double gpa;
}
public class Main {
  public static void main(String[] args) {
    Student s = new Student();
    System.out.println(s.name + "\t" + s.gpa);
  }
}

출력:

null	null

생성자 오버로딩 개념은 메서드 오버로딩과 유사합니다. 즉, 단일 클래스에 대해 둘 이상의 생성자가 있습니다. 생성자 오버로딩은 클래스의 멤버 변수를 다양한 방식으로 초기화하기 위해 수행됩니다.

우리는 원하는 만큼 오버로드된 생성자를 만들 수 있습니다. 유일한 조건은 오버로드된 생성자가 취하는 매개변수의 수와 유형이 달라야 한다는 것입니다.

예를 들어, student nameGPA라는 두 가지 속성이 있는 아래 표시된 Student 클래스를 고려하십시오. 문자열 이름과 이중 GPA를 매개변수로 사용하고 새 개체에 대한 해당 속성을 초기화하는 생성자가 클래스에 대해 정의됩니다.

Java의 매개변수화된 생성자

class Student {
  String name;
  Double gpa;
  Student(String s, Double g) {
    name = s;
    gpa = g;
  }
}
public class Main {
  public static void main(String[] args) {
    Student s = new Student("Justin", 9.75);
    System.out.println(s.name + "\t" + s.gpa);
  }
}

출력:

Justin	9.75

생성자 오버로딩 없는 코드

새 개체를 만들 때 학생 이름만 생성자에 전달되는 시나리오를 고려하십시오. 이 경우 GPA는 자동으로 null로 설정되어야 합니다. 생성자를 오버로드하지 않고 이름만 전달하면 다음 컴파일 오류가 발생합니다.

class Student {
  String name;
  Double gpa;
  Student(String s, Double g) {
    name = s;
    gpa = g;
  }
}
public class Main {
  public static void main(String[] args) {
    Student s = new Student("Justin");
    System.out.println(s.name + "\t" + s.gpa);
  }
}

출력:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
	The constructor Student(String) is undefined

	at ConstructorOverloading.main(ConstructorOverloading.java:18)

Java의 생성자 오버로딩

위의 상황을 해결하기 위해 매개변수로 학생 이름만 사용하여 오버로드된 생성자를 만들 수 있습니다. 이 생성자가 호출되면 GPAnull로 설정합니다.

class Student {
  String name;
  Double gpa;
  Student(String s, Double g) {
    name = s;
    this.gpa = g;
  }
  Student(String s) {
    name = s;
    gpa = null; // Setting GPA to null
  }
}
public class Main {
  public static void main(String[] args) {
    Student s1 = new Student("Justin");
    Student s2 = new Student("Jessica", 9.23);
    System.out.println(s1.name + "\t" + s1.gpa);
    System.out.println(s2.name + "\t" + s2.gpa);
  }
}

출력:

Justin	null
Jessica	9.23

Student 개체가 생성되었지만 이름이나 GPA가 언급되지 않은 다른 상황을 고려하십시오. 인수(기본 생성자)를 사용하지 않고 nameGPA 속성을 null로 설정하는 또 다른 오버로드된 생성자를 만들 수 있습니다.

Java는 클래스에 대해 다른 생성자가 생성되지 않은 경우에만 기본 생성자를 제공한다는 점을 기억하십시오. 그러나 우리 클래스의 경우 생성자가 이미 존재하므로 기본 생성자를 만들어야 합니다.

class Student {
  String name;
  Double gpa;
  Student(String s, Double g) {
    name = s;
    gpa = g;
  }
  Student(String s) {
    name = s;
    gpa = null;
  }
  Student() {
    name = null;
    gpa = null;
  }
}
public class Main {
  public static void main(String[] args) {
    Student s1 = new Student();
    Student s2 = new Student("Justin");
    Student s3 = new Student("Jessica", 9.23);
    System.out.println(s1.name + "\t" + s1.gpa);
    System.out.println(s2.name + "\t" + s2.gpa);
    System.out.println(s3.name + "\t" + s3.gpa);
  }
}

출력:

null	null
Justin	null
Jessica	9.23

생성자 오버로딩 모범 사례

생성자를 오버로드할 때 따라야 할 정해진 지침은 없습니다. 그러나 혼동을 피하고 오류 범위를 줄이기 위해 따를 수 있는 몇 가지 권장 모범 사례가 있습니다.

  • 클래스의 멤버 변수를 참조하려면 this 키워드를 사용해야 합니다. 혼란을 피하고 코드를 더 읽기 쉽게 만듭니다.
  • 보다 직관적인 매개변수 이름을 생성자에 전달할 수도 있습니다. 예를 들어 생성자가 이름 필드를 초기화하는 경우 생성자 서명은 Student(String s) 대신 Student(String name)일 수 있습니다. this 키워드를 사용하여 name이라는 매개변수와 name이라고도 하는 클래스 속성을 구별할 수 있습니다.

Student 클래스의 예제를 계속 진행하고 생성자 내에서 this 키워드를 사용합시다.

class Student {
  String name;
  Double gpa;
  Student(String name, Double gpa) // passing more intuitive parameter names
  {
    this.name = name; // using this keyword to avoid confusion
    this.gpa = gpa;
  }
  Student(String name) {
    this.name = name;
    this.gpa = null;

    Student()

        this.name = null;
    this.gpa = null;
  }
}
  • 클래스가 단일 기본 생성자만 갖는 것도 좋은 방법이며 나머지 모든 생성자는 이 기본 생성자를 호출하여 속성을 초기화해야 합니다.
  • this() 함수를 사용하여 다른 생성자에서 생성자를 호출할 수 있습니다. this()에 전달하는 속성의 수와 유형은 호출될 생성자를 결정합니다.
  • 코드 중복성을 줄이고 단일 생성자에 대한 논리만 작성하면 됩니다.
  • Student 클래스에는 3개의 오버로드된 생성자가 필요합니다. 기본 생성자는 nameGPA를 매개변수로 사용하는 매개변수화된 생성자가 됩니다. 다른 두 개의 오버로드된 생성자는 단순히 기본 생성자를 호출하고 매개변수 값을 null로 전달합니다.
class Student {
  String name;
  Double gpa;
  Student(String name, Double gpa) // Primary Constructor that sets the attribute values
  {
    this.name = name;
    this.gpa = gpa;
  }
  Student(String name) {
    this(name, null); // Calling the primary constructor with GPA as null
  }
  Student() {
    this(null, null); // Calling the primary constructor with both parameters as null
  }
}

생성자 오버로드

생성자 오버로딩은 다양한 방식으로 클래스의 속성을 초기화하기 위해 수행됩니다. 오버로드된 생성자는 매개변수의 수 또는 전달된 매개변수의 데이터 유형이 달라야 합니다.

각 생성자의 서명은 다른 것과 달라야 합니다. this 키워드를 사용하여 클래스 속성 및 기타 생성자를 참조해야 합니다. 코드가 덜 중복되고 이해하기 쉽기 때문입니다.

관련 문장 - Java Constructor