+상속

조영혜·2022년 1월 9일
0

클래스 상속 : 자식 클래스 선언 시 부모 클래스 선택

repuries ____ extends 뒤에 부모 클래스 기술.

디폴트 접근제한자 이용할경우, 같은 패키지 안에서만 사용 가능. -> 쓸거면 public!
프라이빗은 상속 대상 아님.
부모클래스에 어떤 접근제한자가 딸려 있느냐에 따라 상속 대상 다름!

자식개체 생성 시 자식개체만 생성되는 것 같지만 부모개체도 같이 생김.

자식생성자의 첫줄에 부모 생성자가 호출됨.
super => 상위의~ 부모생성자 호출코드. 컴파일할 때 자동생성->생략가능.
생성자가 호출된 순서대로 객체가 생성. 자식-> 부모
명시적으로 부모 생성자 호출하려는 경우 super써줘야함!

논리적으로 기본생성자 만들수 없는 경우

//부모
public class People{
public String name;
public String ssn;

public People(String name, String ssn){
this.name = name; 
this.ssn = ssn; 
}
}

//자식
public class Student extends People{
public Student (String name, String snn){
super(name, ssn)
}
}

//논리적으로 부모클래스에 기본생성자 만들어 줄 수 없는 경우 이렇게 해결할 수 있음. (Why? 사람이라면 이름과 주민번호 다 가지고 있으니까 기본생성자는 논리적으로 만들면 안됨.)
//기본생성자 만들 수 있으면 바로 해결되긴함. 

//부모
public class People{
public String name;
public String ssn;

public People(){ //기본생성자 
}

public People(String name, String ssn){
this.name = name; 
this.ssn = ssn; 
}
}

//자식
public class Student extends People{
public Student {
super();

메소드 재정의
오버라이딩
: 부모클래스의 메소드가 자식 클래스에 사용하기에 부적합할 경우 자식 클래스에서 수정하여 사용.

메소드 재정의 방법
: 부모메소드와 동일한 시그니쳐 가져야함. 선언된 방식 똑같이.
: 접근 제한 더 강하게 재정의할 수 없음. 좁은 범위는 안됨. 넓은 범위는 가능.
: 새로운 예외를 throws할 수 없음.
메소드가 재정의될 경우 부모객체 메소드가 숨겨지며, 자식 객체에서 메소드 호출하면 재정의된 자식 메소드가 호출됨.

@override
- 컴파일 단계에서 메소드 재정의된 클래스가 부모클래스와 잘 맺어졌는지 검사.

부모메소드 호출 : 자식 클래스 내부에서 부모클래스 메소드 호출해야 하는 경우 명시적으로 super키워드 붙여 부모 메소드 호출.

super.부모메소드();

컨트롤 스페이스 + 선택 엔터 =>재정의 쉽게 됨.

final
: 해당 선언이 최종상태이며 수정될 수 없음을 의미.
클래스 및 메소드 선언 시 상속과 관련됨.

public final class 클래스 {...}

부모클래스가 될 수 없어서 자식 클래스를 만들수 없음!!
재정의 할 수 없는 final메소드
: 부모 클래스에 선언된 fina는 자식 클래스에서 재정의할 수 없음.

0개의 댓글