<상속>
✍ 슈퍼클래스(부모)의 모든 멤버를 서브클래스(자식)에서 물려받아 선언 없이 사용하는 것을 말한다.
--> 상속을 받은 서브클래스에서 별도의 선언 및 정의 없이도 슈퍼클래스가 가진 멤버변수나 메서드 등을 자신의 멤버처럼 사용 가능하다.
--> 상속을 활용하면 코드 중복이 제거되며, 유지보수에 용이해진다!
✍슈퍼클래스(Super class) = 부모클래스(조상클래스) = 상위클래스
서브클래스(Sub class) = 자식클래스(자손클래스) = 하위클래스 = 파생클래스
✍ 서브 클래스 정의 시 서브클래스명 뒤에 extends 키워드를 사용하고 extends 키워드 뒤에 슈퍼클래스의 이름을 명시한다. (--> 슈퍼클래스가 가진 멤버를 물려받아 서크믈래스에서 멤버를 추가하므로, 기존 클래스를 확장(extends)하는 개념으로 사용된다.
✍ private 접근제한자가 적용된 멤버는 상속 대상에서 제외된다.
✍ 생성자는 상속되지 않는다.
(생성자는 자신의 클래스이름과 동일해야하는데 생성자가 상속되면 클래스 이름과 상이하기 때문이다.)
✍ 자바는 단일 상속만 지원하므로 동시에 2개 이상의 클래스를 상속받을 수 없다.
(class 서브클래스명 extends 슈퍼클래스1, 슈퍼클래스2 {} --> 이런 형태로 상속은 불가하다!)
✍ 클래스 정의 시 별도의 extends 키워드를 사용하지 않으면(즉, 상속을 명시하지 않으면) 자동으로 java.lang.Object 클래스를 상속받게 된다.
--> 따라서 Object 클래스는 모든 자바 클래스의 최상위 클래스이다.
-->즉, 모든 클래스에서 Object 클래스의 멤버에 접근 가능하다.
ex)
✍ 슈퍼클래스와 서브클래스 정의하기
class Parent{ // 슈퍼클래스 Parent
String name;
public Parent() {
System.out.println("Parent() 생성자 호출됨!");
}
public void parentPrn() {
System.out.println("슈퍼클래스의 parentPrn()");
}
}
class Child extends Parent { // Parent 클래스를 상속받는 서브클래스 Child
public Child() {
System.out.println("Child() 생성자 호출됨!");
}
public void childPrn() {
System.out.println("서브클래스 childPrn()");
}
}
--> 모든 클래스는 상속을 명시하지 않아도 Object 클래스를 상속받는다.
✍ 서브클래스 Child의 인스턴스 생성하기
Child c = new Child();
✍ 서브클래스로 슈퍼클래스에 접근하기
Child c = new Child();
c.childPrn(); // 서브클래스의 메서드에 접근
c.name = "홍길동"; // 슈퍼클래스의 멤버변수에 접근
c.parentPrn(); // 슈퍼클래스의 메서드에 접근
💻 서브클래스의 생성자를 호출하면 슈퍼클래스의 생성자도 함께 호출된다(상속때문)
✍ 주의! 슈퍼클래스는 서브클래스의 멤버에 접근할 수 없다.
Parent p = new Parent();
p.name = "이순신";
p.parentPrn();
//p.childPrn(); --> 오류 발생. 슈퍼클래스는 서브클래스 멤버에 접근 할 수 없다.
주의! private 접근제한자를 갖는 멤버는 상속 대상에서 제외된다.
--> private 접근제한자는 자신의 클래스 내에서만 접근 가능하고
다른 클래스에서 접근 불가능하도록 제어하므로
상속받는 자식클래스도 접근 불가능하기 때문이다.
주의! 생성자는 상속 대상에서 제외된다.
--> 생성자의 이름은 클래스의 이름과 동일해야 하는데
생성자를 상속받을 경우 자신의 이름이 아닌 부모 클래스의 이름이 사용되므로
생성자 작성 규칙을 위반하게 된다. 따라서 생성자는 상속되지 않는다.
'개발 > Java' 카테고리의 다른 글
[Java] 메서드 오버라이딩(Method Overriding) (0) | 2023.02.07 |
---|---|
[Java] 접근제한자 (0) | 2023.02.07 |
[Java] 별 찍기 복습 (0) | 2023.02.01 |
[Java] 객체지향으로 문제풀기 (0) | 2023.02.01 |
[Java] 객체지향으로 문제풀기 (0) | 2023.01.31 |