[Java] 상속 ②

kiteB·2022년 1월 3일
0

Java

목록 보기
14/35
post-thumbnail

[ 메소드 재정의 (오버라이딩) ]

메소드 오버라이딩은 상속된 메소드의 내용이 자식 클래스에 맞지 않는 경우, 자식 클래스에서 동일한 이름을 갖는 메소드를 재정의하는 것을 말한다.

메소드가 오버라이딩되었다면 부모 객체의 메소드는 숨겨지기 때문에, 자식 객체에서 메소드를 호출하면 오버라이딩된 자식 메소드가 호출된다.

예제

  • Parent
class Parent {
    void method1();
    void method2();
}
  • Child
class Child extends Parent {
    void method2();
    void method3();
}
  • ChildExample
class ChildExample {
    public static void main(String[] args) {
        Child child = new Child();
        
        child.method1();
        child.method2();	//재정의된 메소드 호출 (즉, Child 객체의 method2() 호출)
        child.method3();
    }
}

위와 같이, 메소드 오버라이딩을 했을 때, 자식 객체의 메소드를 호출하면 재정의된 메소드가 호출된다.

1. 오버라이딩의 조건

메소드를 오버라이딩하기 위한 조건은 다음과 같다.

  • 메소드의 선언부(메소드 이름, 매개 변수 리스트)는 기존 부모의 메소드와 완전히 같아야 한다.
    하지만 메소드의 반환 타입부모의 변환 타입으로 변환 가능한 타입이라면 변경할 수 있다.
  • 부모 클래스 메소드보다 접근 제한을 더 좁은 범위를 변경할 수 없다.
    • Ex) 부모 메소드가 public 접근 제한을 가질 경우, 자식 메소드는 defaultprivate 접근 제한으로 수정할 수 없다.
  • 부모 클래스 메소드보다 더 큰 범위의 예외를 throws할 수 없다.

2. 부모 메소드 호출(super)

자식 클래스 내부에서 오버라이딩된 부모 클래스의 메소드를 호출해야 하는 경우, 명시적으로 super 키워드를 붙여서 부모 메소드를 호출할 수 있다.

  • super는 부모 객체를 참조하고 있기 때문에 부모 메소드에 직접 접근할 수 있다.
super.부모메소드();

[ final 클래스와 final 메소드 ]

fianl 키워드는 해당 선언이 최종 상태이고, 결코 수정될 수 없음을 뜻한다.

  • final 키워드는 클래스, 필드, 메소드 선언 시에 사용할 수 있다.

1. 상속할 수 없는 final 클래스

클래스를 선언할 때 final 키워드를 class 앞에 붙이면 상속할 수 없는 클래스가 된다.
final 클래스는 부모 클래스가 될 수 없어 자식 클래스를 만들 수 없다!

public final class 클래스 { ... }

예제

  • Member
public final class Member {
}
  • VeryVeryImportantPerson
public class VeryVeryImportantPerson extends Member {
}

→ 에러 발생!


2. 오버라이딩할 수 없는 final 메소드

메소드를 선언할 때 final 키워드를 붙이면 오버라이딩할 수 없는 메소드가 된다.
즉, 부모 클래스를 상속해서 자식 클래스를 선언할 때 부모 클래스에 선언된 final 메소드는 자식 클래스에서 재정의할 수 없다.

public final 리턴타입 메소드( [매개변수, ...] ) { ... }

예제

  • Car
public class Car {
    //필드
    public int speed;
    
    //메소드
    public void speedUp() { speed += 1}
    
    //final 메소드
    public final void stop() {
        System.out.println("차를 멈춤");
        speed = 0;
    }
}
  • SportsCar
public class SportsCar extends Car {
    @Override
    public void speedUp() { speed += 10 }
    
    //오버라이딩할 수 없음!
    //@Override
    //public void stop() {
    //    System.out.println("스포츠카를 멈춤");
    //    speed = 0;
    //}   
}

Car에서 stop() 메소드를 final로 선언하였으므로, Car를 상속받은 SportsCar에서는 stop() 메소드를 오버라이딩할 수 없다!


[ 참고자료 ]

이것이 자바다 책
http://tcpschool.com/java/java_inheritance_overriding

profile
🚧 https://coji.tistory.com/ 🏠

0개의 댓글