[자바 무료 강의] 상속과 생성자 - 코드라떼
Lesson List button
코스자바로 배우는 프로그래밍
hamburger button
강의상속과 생성자최종수정일 2022-01-01
아이콘약 4분

생성자는 상속을 할 수 없는데요. 이번 강의에서 상속시에 어떻게 생성자에 대해 처리하는지 배워봅시다.

추가 노트

상속과 생성자


이전 강의에서 상속을 받을 수 있는 요소는 변수와 메서드라고 설명했는데요. 다시 말하면 생성자는 상속받을 수 없습니다. 부모 클래스에서 생성자가 명시적으로 선언되어 있는 경우는 자식 클래스에서 필수적으로 부모의 생성자를 호출해야 하는 제약조건이 따릅니다.


super() 메서드를 이용한 부모 생성자 호출

public class ParentDog {
    String name;

    ParentDog(String name) {
        this.name = name;
    }
}
public class ChildDog extends ParentDog {
    ChildDog(String name) {
        super(name); // 부모 ParentDog 클래스의 생성자 호출
    }
}

부모의 생성자가 명시적으로 선언되어 있는 경우 자식 클래스에서 부모의 생성자 중 하나를 반드시 호출해야 합니다. 그리고 부모의 생성자는 super()를 이용하여 호출할 수 있습니다.

super(name)ParentDog(String name)에 매칭됩니다.


case 최소 하나 이상의 부모 생성자 호출

public class ParentDog {
    String name;

    ParentDog(String name) {
        this.name = name;
    }

    ParentDog(String name1, String name2) {

    }
}
public class ChildDog extends ParentDog {
    ChildDog(String name) {
        super(name); // 부모 클래스의 ParentDog(String name)생성자 호출
    }
}

서로 다른 부모의 생성자가 두 개가 선언되어 있어도 최소한 하나 이상의 부모 생성자를 호출해야만 합니다.

즉, super(name)이나 , super(name1, name2) 둘 중 하나를 자식 생성자 내에서 호출해야 합니다. 부모 생성자를 호출하려면 자식 생성자를 명시적으로 선언과 정의를 할 수밖에 없습니다. 주의할 점은 super() 메서드는 자식 생성자 내부에서만 호출 가능하며 메서드에서 호출이 불가능합니다.


case 같은 형태의 부모 생성자 호출

public class ParentDog {
    String name;

    ParentDog(String name) {
        this.name = name;
    }

    ParentDog(String name1, String name2) {

    }
}
public class ChildDog extends ParentDog {
    ChildDog(String name) {
        super(name); // 부모 클래스의 ParentDog(String name)생성자 호출
    }

    ChildDog(String name1, String name2) {
        super(name1, name2); // 부모 클래스의 ParentDog(String name1, String name2)생성자 호출
    }
}

꼭 자식 생성자가 부모 생성자의 형태를 따라갈 필요는 없지만, 특별한 이유가 없다면 부모 생성자의 형태를 따라가는 것이 좋습니다.


super() 메서드를 명시적으로 호출하지 않아도 되는 예외

유일하게 super()를 명시적으로 호출하지 않아도 되는 경우가 존재합니다.

  1. 부모 클래스의 생성자가 명시적으로 선언되어 있지 않은 경우

  2. 부모 클래스의 생성자가 명시적으로 선언되어 있어도 기본 생성자만 명시되어 있는 경우

super()를 명시적으로 선언하여 호출하지 않는다 하더라도, 내부적으로는 부모 생성자를 호출합니다.


case 기본 생성자만 명시적으로 선언되어 있는 경우

public class ParentDog {
    String name;

    ParentDog() {
        this.name = "이쁜 강아지"
    }

}
public class ChildDog extends ParentDog {
    ChildDog(String name) {
        // super(); 생략 가능
   }

    ChildDog(String name1, String name2) {
       // super(); 생략 가능
   }
}

NOTE! 매개변수가 없는 생성자를 기본 생성자라고 합니다. 명령어의 존재여부와 상관 없습니다.

super의 엄밀한 의미

강의에서는 super를 키워드라고 얘기했지만, 좀 더 깊게 들어가면 슈퍼 클래스의 인스턴스에 접근할 수 있도록 하는 포인터를 뜻합니다. 즉 super()는 super라는 포인터를 통하여 슈퍼 클래스의 생성자를 호출할 수 있도록 합니다.

도전자 질문
아이콘bng4535(2022-01-01 17:09 작성됨)
super()를 쓰지 않아도 되는 경우에서, 부모의 생성자가 기본생성자인 경우를 말씀해주셨는데 기본생성자는 매개변수와 명령어가 없어야 하지 않나여??
아이콘코드라떼(2022-01-01 17:26 작성됨)
안녕하세요. 코드라떼입니다 :)

기본 생성자는 매개 변수가 없는 생성자입니다.
명령어의 존재 여부는 상관없습니다.

public class ParentDog {
    String name;

    ParentDog() { // 기본 생성자
        this.name = "이쁜 강아지"
    }

}

감사합니다.
이용약관|개인정보취급방침
알유티씨클래스|대표, 개인정보보호책임자 : 이병록
이메일 : cs@codelatte.io
사업자등록번호 : 824-06-01921
통신판매업신고 : 2021-성남분당C-0740
주소 : 경기도 성남시 분당구 대왕판교로645번길 12, 9층 24호
파일
파일파일
Root
파일

super() 메서드의 쓰임새를 확인해보세요

Output
root$
Lesson List button
코스자바로 배우는 프로그래밍
hamburger button
강의상속과 생성자최종수정일 2022-01-01
아이콘약 4분

생성자는 상속을 할 수 없는데요. 이번 강의에서 상속시에 어떻게 생성자에 대해 처리하는지 배워봅시다.

추가 노트

상속과 생성자


이전 강의에서 상속을 받을 수 있는 요소는 변수와 메서드라고 설명했는데요. 다시 말하면 생성자는 상속받을 수 없습니다. 부모 클래스에서 생성자가 명시적으로 선언되어 있는 경우는 자식 클래스에서 필수적으로 부모의 생성자를 호출해야 하는 제약조건이 따릅니다.


super() 메서드를 이용한 부모 생성자 호출

public class ParentDog {
    String name;

    ParentDog(String name) {
        this.name = name;
    }
}
public class ChildDog extends ParentDog {
    ChildDog(String name) {
        super(name); // 부모 ParentDog 클래스의 생성자 호출
    }
}

부모의 생성자가 명시적으로 선언되어 있는 경우 자식 클래스에서 부모의 생성자 중 하나를 반드시 호출해야 합니다. 그리고 부모의 생성자는 super()를 이용하여 호출할 수 있습니다.

super(name)ParentDog(String name)에 매칭됩니다.


case 최소 하나 이상의 부모 생성자 호출

public class ParentDog {
    String name;

    ParentDog(String name) {
        this.name = name;
    }

    ParentDog(String name1, String name2) {

    }
}
public class ChildDog extends ParentDog {
    ChildDog(String name) {
        super(name); // 부모 클래스의 ParentDog(String name)생성자 호출
    }
}

서로 다른 부모의 생성자가 두 개가 선언되어 있어도 최소한 하나 이상의 부모 생성자를 호출해야만 합니다.

즉, super(name)이나 , super(name1, name2) 둘 중 하나를 자식 생성자 내에서 호출해야 합니다. 부모 생성자를 호출하려면 자식 생성자를 명시적으로 선언과 정의를 할 수밖에 없습니다. 주의할 점은 super() 메서드는 자식 생성자 내부에서만 호출 가능하며 메서드에서 호출이 불가능합니다.


case 같은 형태의 부모 생성자 호출

public class ParentDog {
    String name;

    ParentDog(String name) {
        this.name = name;
    }

    ParentDog(String name1, String name2) {

    }
}
public class ChildDog extends ParentDog {
    ChildDog(String name) {
        super(name); // 부모 클래스의 ParentDog(String name)생성자 호출
    }

    ChildDog(String name1, String name2) {
        super(name1, name2); // 부모 클래스의 ParentDog(String name1, String name2)생성자 호출
    }
}

꼭 자식 생성자가 부모 생성자의 형태를 따라갈 필요는 없지만, 특별한 이유가 없다면 부모 생성자의 형태를 따라가는 것이 좋습니다.


super() 메서드를 명시적으로 호출하지 않아도 되는 예외

유일하게 super()를 명시적으로 호출하지 않아도 되는 경우가 존재합니다.

  1. 부모 클래스의 생성자가 명시적으로 선언되어 있지 않은 경우

  2. 부모 클래스의 생성자가 명시적으로 선언되어 있어도 기본 생성자만 명시되어 있는 경우

super()를 명시적으로 선언하여 호출하지 않는다 하더라도, 내부적으로는 부모 생성자를 호출합니다.


case 기본 생성자만 명시적으로 선언되어 있는 경우

public class ParentDog {
    String name;

    ParentDog() {
        this.name = "이쁜 강아지"
    }

}
public class ChildDog extends ParentDog {
    ChildDog(String name) {
        // super(); 생략 가능
   }

    ChildDog(String name1, String name2) {
       // super(); 생략 가능
   }
}

NOTE! 매개변수가 없는 생성자를 기본 생성자라고 합니다. 명령어의 존재여부와 상관 없습니다.

super의 엄밀한 의미

강의에서는 super를 키워드라고 얘기했지만, 좀 더 깊게 들어가면 슈퍼 클래스의 인스턴스에 접근할 수 있도록 하는 포인터를 뜻합니다. 즉 super()는 super라는 포인터를 통하여 슈퍼 클래스의 생성자를 호출할 수 있도록 합니다.

도전자 질문
아이콘bng4535(2022-01-01 17:09 작성됨)
super()를 쓰지 않아도 되는 경우에서, 부모의 생성자가 기본생성자인 경우를 말씀해주셨는데 기본생성자는 매개변수와 명령어가 없어야 하지 않나여??
아이콘코드라떼(2022-01-01 17:26 작성됨)
안녕하세요. 코드라떼입니다 :)

기본 생성자는 매개 변수가 없는 생성자입니다.
명령어의 존재 여부는 상관없습니다.

public class ParentDog {
    String name;

    ParentDog() { // 기본 생성자
        this.name = "이쁜 강아지"
    }

}

감사합니다.
이용약관|개인정보취급방침
알유티씨클래스|대표, 개인정보보호책임자 : 이병록
이메일 : cs@codelatte.io|운영시간 09:00 - 18:00(평일)
사업자등록번호 : 824-06-01921|통신판매업신고 : 2021-성남분당C-0740
주소 : 경기도 성남시 분당구 대왕판교로645번길 12, 9층 24호(경기창조혁신센터)
파일
파일파일
Root
파일

super() 메서드의 쓰임새를 확인해보세요

Output
root$