자바 기초 (09). 상속
이번시간에는 상속에 대해 학습해보도록 하자
0. 들어가기 전에
객체 지향 프로그램에서는 부모 클래스의 멤버(필드, 메서드)를 자식클레스에게 물려줄수 있다(상속).
상속 :
- 이미 개발된 클래스를 재사용하여 새로운 클래스를 만들기에 중복되는 코드를 줄일수 있다.
- 부모 클래스의 한번의 수정으로 모든 자식 클래스 까지 수정되는 효과가 있어 유지보수 시간이 줄어든다.
1. 클래스 상속
- 자식 클래스 선언 시 부모 클래스 선택 (현실에선 부모가 자식을 만들지만 여기선 자식이 부모를 선택함. 금수저 은수저 고를수 있다.??)
- extends 뒤에 부모 클래스를 기술한다.
class 자식클래스 extends 부모클래스 {
//필드
// 생성자
// 메서드
}
- 여러 개의 부모 클래스 상속할 수 없다.
- 부모 클래스에서 private 접근 제한된 필드와 메서드는 자식이라도 상속 대상에서 제외된다.
- 부모와 자식 클래스가 다른 패키지에 존재할 경우 default 접근 제한된 필드, 메서드 역시 제외된다.
package parentex;
public class Parent{
private void method01{}
void method02{}
public void method03{}
}
////////////
package son;
public class son extends Parent{
// 자식이 사용할 수 있는건 method03 밖에 없다.
method03();
}
2. 부모 생성자 호출
-
자식 객체 생성할 때 부모 객체가 먼저 생성되고, 그 다음 자식 객체가 생성된다. ( 힙 메모리 역역에 부모객체도 올라간다는 말 )
-
자식 생성자 __맨 첫 줄__에서 부모 생성자가 호출된다.
public Son() extends Parent{
// super()로 인해 부모객체가 먼저 생성된다.
// super()를 우리가 정의 안해도 알아서 생성 해준다.
super()
}
음 위의 super는 __부모 생성자__를 호출하는 것이다. 그렇기에 올바른 부모 생성자가 정의되어 있지 않다면 컴파일 에러가 발생한다.
3. 메서드 재정의 (오버라이딩/ Overriding)
- 부모 클래스의 메소드가 자식 클래스에서 사용하기에 부적합할 경우 자식 클래스에서 수정하여 사용 가능하다.
- 메서드 재정의 방법
- 부모 메소드와 동일한 시그니처 가져야한다. (부모 선언 방식을 따라야 한다)
- 접근 제한 더 강하게 재정의 가능
- 새로운 예외를 throws할 수 있다.
- 메소드가 재정의될 때 부모 객체 메서드가 숨겨지며, 자식 객체에서 메서드 호출하면 재정의된 자식 메서드가 호출이 된다.
class Parent {
public void method01{
System.out.println("parent method01");
}
public void method02{
System.out.println("parent method02");
}
}
class Son {
public void method02{
System.out.println("son method02");
}
public void method03{
System.out.println("son method03");
}
}
class SonExam{
public static void main(String[] args){
Son s1 = new Son();
s1.method01();
s1.method02();
s1.method03();
}
}
출력결과는
parent method01
son method02
son method03
이 출력되게 된다. 그러면 오버라이딩도 사용하고 부모 메서드도 사용할 방법은 뭘까? 아래와 같이 사용하면 된다,
class Son {
public void method02{
System.out.println("son method02");
}
public void method03{
System.out.println("son method03");
}
public void parentMethod{
super.method02();
}
}
class SonExam{
public static void main(String[] args){
Son s1 = new Son();
s1.method01();
s1.parentMethod();
s1.method03();
}
}
4. final 클래스와 final 메서드
- 해당 선언이 최종 상태이며 수정될 수 없음을 의미하는 final
- 클래스 및 메서드 선언시 final 키워드를 사용하면 이는 상속과 관련된 것이다.
- class에 final 을 붙이면 그 클래스는 절대 부모 클래스가 될수 없어 자식클래스를 만들수 없다.
// 자바 String 도 final class이다. public final Class String{...}
- 부모 클래스에 선언된 final 메서드는 자식 클래스에서 __재정의가 불가!__하다