상속이란
부모 클래스의 멤버를 자식 클래스에게 물려주는 것을 말한다.
그러면 상속을 쓰는 이유는 무엇일까?
이미 개발된 클래스를 재사용하여 코드의 중복을 줄이거나 부모 클래스의 한번의 수정으로 모든 자식 클래스가 수정되는 효과가 있어 유지보수 시간이 줄어들게 되기 때문에 사용!
class 자식클래스 extends 부모클래스 {
//필드
//생성자
//메소드
}
class TestSub extends TestMain {}
위처럼 자식 클래스는 여러 개의 부모 클래스를 상속할 수 없으며
부모 클래스에서 private 접근 제한 갖는 필드와 메소드는 상속 대상에서 제외되며
부모와 자식 클래스가 서로 다른 패키지에 존재할 경우 default 접근 제한된 필드와 메소드도 제외!
부모 생성자의 호출
자식 객체를 생성할 때 부모 객체가 먼저 생성이 되고 그 다음 자식 객체가 생성되게 된다
TestSub testSub = new TestSub();
예를 들어, TestSub 객체를 생성했을 때 TestMain이 먼저 생성되고 그 다음 자식인 TestSub가 생성된다
부모 생성자는 자식 생성자의 맨 첫출에서 호출되며 이걸 명시적으로 나타낼 경우엔 super메소드를 써주면 된다.
public TestSub(){
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 int number;
public Student(String name, String ssn, int number) {
super(name,ssn);
this.number = number;
}
}
메소드 재정의 (오버라이딩)
자식 클래스에서 부모 클래스의 메소드를 재수정하여 사용하는 것을 말한다
그럼 메소드 재정의 방법은?
일단 부모 메소드와 동일한 시그니철르 가져야 하고,
접근 제한자를 더 강하게 정의할 수 없으며(public으로 정의됐는데 private으로 변경 X)
새로운 예외를 throws 처리할 수 없다
##참고##
메소드를 재정의하기 전에
@Override
void test() {
}
코드처럼 override라는 annotation을 이용하면 부모 클래스의 해당 메소드를 찾아서 비교해준다.
그러면 메소드를 재정의한 이후에 부모 메소드를 호출하고 싶다면 어떻게 해야할까?
그럴때는 super를 이용하면 된다
class TestSub extends TestMain{
void mt1(){} //재정의를 함
void mt2(){
mt1();
super.mt1();
}
}
final class와 method
- final로 선언된 메소드나 클래스는 수정될 수 없음을 의미한다.
public final class TestMain{} //부모로 사용불가능
public final void test(){} //자식 클래스에서 재정의 불가능
'Language > Java' 카테고리의 다른 글
Java 추상클래스 (0) | 2022.05.30 |
---|---|
Java 타입 변환과 다형성 (0) | 2022.05.27 |
Java 접근 제한자 (0) | 2022.05.13 |
Java 인스턴스 멤버와 정적 멤버 (0) | 2022.05.10 |
Java 메소드 (0) | 2022.05.09 |