Java 상속할때 생성자가 여러개 필요한경우

조회수 4187회

자바를 독학중인 학생입니다. 지금 상속과 super class 에대해서 공부중인데요 만약에 super class에 생성자가 여러 생성자를 갖을수 있는경우 sub class 생성자를 어떤 방식으로 작성해야 되는지 여쭤보고싶습니다. 지금 제가 쓴 코드는 에러 없이 돌아가지만 더 좋은 방법이 없나 궁금해서요

//Person.java
public class Person{

    private String name;
    private int age;
    private String homeTown;


    public Person(String name){  //생성자에 이름만 있는경우 나이와 집을 default로 정해줌
        this.name = name;
        this.age = 18;
        this.homeTown = "Seoul";
    }

    public Person(String name, int age){ //생성자에 이름과 나이만 있는경우 집을 default로 정해줌
        this.name = name;
        this.age = age;
        this.homeTown = "Seoul";
    }

    public Person(String name, int age, String homeTown){
        this.name = name;
        this.age = age;
        this.homeTown = homeTown;   

person 이라는 superclass를 상속받는 student 입니다

//student.java
public class Student extends Person{
    private double avgGPA;
    private int ID;
    private String[] classes;

    public Student(double avgGPA, int ID, String[] classes, String name){
        super(name);
        this.avgGPA = avgGPA;
        this.ID = ID;
        this.classes = classes;
    }

    public Student(double avgGPA, int ID, String[] classes, String name, int age){
        super(name, age);
        this.avgGPA = avgGPA;
        this.ID = ID;
        this.classes = classes;
    }

    public Student(double avgGPA, int ID, String[] classes, String name, int age, String homeTown){
        super(name, age, homeTown);
        this.avgGPA = avgGPA;
        this.ID = ID;
        this.classes = classes;

보시다 시피 subclass에 상성자 3개를 써줘야 하는 상황인데 이걸 좀더 간편하고 쉬운방식으로 사용하는 방법이 있나요?

2 답변

  • 애초에 Person이 생성자가 3개인 이상 Student도 생성자가 3개가 되어야 하는건 어쩔 수 없는것 같구요. 단지 코드를 줄이기만 한다면 아래처럼 가능합니다:

    public class Person {
        private String name;
        private Integer age;
        private String homeTown;
    
        public static final int DEFAULT_AGE = 18;
        public static final String DEFAULT_HOME_TOWN = "Seoul";
    
        public Person(String name){  //생성자에 이름만 있는경우 나이와 집을 default로 정해줌
            this(name, null, null);
        }
    
        public Person(String name, Integer age){ //생성자에 이름과 나이만 있는경우 집을 default로 정해줌
            this(name, age, null);
        }
    
        public Person(String name, Integer age, String homeTown){
            this.name = name;
            this.age = age != null ? age : DEFAULT_AGE;
            this.homeTown = homeTown != null ? homeTown : DEFAULT_HOME_TOWN;
        }
    }
    
    public class Student extends Person {
        private double avgGPA;
        private int ID;
        private String[] classes;
    
        public Student(double avgGPA, int ID, String[] classes, String name) {
            this(avgGPA, ID, classes, name, null, null);
        }
    
        public Student(double avgGPA, int ID, String[] classes, String name, Integer age) {
            this(avgGPA, ID, classes, name, age, null);
        }
    
        public Student(double avgGPA, int ID, String[] classes, String name, Integer age, String homeTown) {
            super(name, age, homeTown);
            this.avgGPA = avgGPA;
            this.ID = ID;
            this.classes = classes;
        }
    }
    

    위의 Student를 생성자 하나로 제한한다고 하면 아래처럼 되긴 하지만:

    public class Student extends Person {
        private double avgGPA;
        private int ID;
        private String[] classes;
    
        public Student(double avgGPA, int ID, String[] classes, String name, Integer age, String homeTown) {
            super(name, age, homeTown);
            this.avgGPA = avgGPA;
            this.ID = ID;
            this.classes = classes;
        }
    }
    

    이렇게 되면 쓰는 사람이 불편하겠죠. 항상 age와 homeTown에 대한 값을 명시해야 하니까요:

    public class Test {
        public static void main(String[] args) {
            Student st = new Student(123, 456, new String[] { "A" }, "waldo", null, null);
        }
    }
    
    
  • Builder Pattern을 활용하면 좀더 이쁠것 같습니다.

    구글에서 검색

    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)