Java

[인프런] 상속과 메서드 오버라이딩

sejin2 2024. 5. 27. 13:59

부모 타입의 기능을 자식에서는 다르게 재정의 하고 싶을 수 있다. 
부모에게서 상속 받은 기능을 자식이 재정의 하는 것메서드 오버라이딩이라 한다. 

public class Car {
    public void move() {
        System.out.println("차를 이동합니다.");
    }
    
    public void openDoor() {
        System.out.println("문을 엽니다.");
    }
}
public class ElectricCar extends Car {

    @Override
    public void move() {
        System.out.println("전기차를 빠르게 이동합니다.");
    }

    public void charge() {
        System.out.println("충전합니다.");
    }
}

ElectricCar는 부모인 Car의 move( ) 기능을 다르게 사용하고 싶어서 새로운 move(  )메서드를 새로 만들었다. 
이렇게 부모의 기능을 자식이 새로 재정의 하는 것을 메서드 오버라이딩이라고 한다.
이제 ElectricCar의 move(  )를 호출하면 Car의 move()가 아니라 ElectricCar의 move(  )가 호출된다. 

@Override

@가 붙은 부분을 어노테이션이라고 하는데, 주석과 비슷한데 프로그램이 읽을 수 있는 특별한 주석이라고 생각하면 된다. 
이 어노테이션은 상위 클래스의 메서드를 오버라이드 하는 것임을 나타낸다. 컴파일러는 이 어노테이션을 보고 메서드가 정확히 오버라이드 되었는지 확인한다. 오버라이딩 조건을 만족시키지 않으면 컴파일 에러를 발생시킨다.
따라서 실수로 오버라이딩을 못하는 경우를 방지해준다. 이 기능은 필수는 아니지만 코드의 명확성을 위해 붙여주는 것이 좋다. 

오버라이딩과 메모리 구조

electricCar.move( ) 를 호출하면 호출한 eletricCar의 타입은 ElectricCar이므로 인스턴스 내부의 ElectricCar타입에서 시작한다. ElectricCar에 move( ) 메서드가 있기 때문에 해당 메서드를 실행한다. 이때 실행할 메서드를 이미 찾았으므로 부모 타입을 찾지 않는다. 

오버로딩과 오버라이딩

  • 메서드 오버로딩 : 메서드 이름이 같고 매개변수(파라미터)가 다른 메서드를 여러 개 정의하는 것을 말한다. 같은 이름의 메서드를 여러개 정의했다고 이해하면 된다.
  • 메서드 오버라이딩 : 하위 클래스에서 상위 클래스의 메서드를 재정의하는 과정을 의미한다. 따라서 상속 관계에서 사용한다. 자식의 새로운 기능이 부모의 기존 기능을 넘어 타 기존 기능을 새로운 기능으로 덮어버린다고 이해하면 된다. 

메서드 오버라이딩의 조건

  • 메서드 이름 : 메서드 이름이 같아야 한다.
  • 메서드 파라미터 : 파라미터 타입, 순서, 개수가 같아야 한다.
  • 반환 타입 : 반환 타입이 같아야 한다. 단, 반환 타입이 하위 클래스 타입일 수 있다.
  • 접근 제어자 : 오버라이딩 메서드의 접근 제어자는 상위 클래스의 메서드보다 더 제한적이어서는 안된다. 예를 들어, 상위클래서의 메서드가 protected로 선언되어 있으면 하위 클래스에서는 이를 public이나 protected로 오버라이드할 수 있지만 default 또는 private로 오버라이드 할 수 없다.
  • 예외 : 오버라이딩 메서드는 상위클래스의 메서드보다 더 많은 체크 예외를 throws로 선언할 수 없다.
  • static, final, private 키워드가 붙은 메서드는 오버라이딩 될 수 없다.
    • static은 클래스 레벨에서 작동하므로 인스턴스 레벨에서 사용하는 오버라이딩의 의미가 없다.
    • final 메서드는 재정의를 금지한다.
    • private메서드는 해당 클래스에서만 접근 가능하기 때문에 하위 클래스에서 보이지 않기때문에 오버라이딩 할 수 없다. 
  • 생성자 오버라이딩 : 생성자는 오버라이딩 할 수 없다.  

 

 

 

공부 내용: [인프런] 김영한의 실전 자바 - 기본편

'Java' 카테고리의 다른 글

[인프런] super  (0) 2024.05.27
[인프런] 상속과 접근 제어  (0) 2024.05.27
[인프런] 상속  (0) 2024.05.27
[인프런] final 변수와 상수  (0) 2024.05.27
[인프런] static 메서드  (0) 2024.05.26