Overriding 오버라이딩이란? - 조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것을 오버라이딩이라고 한다. 상속받은 메서드를 그대로 사용하기도 하지만, 자손 클래스 자신에 맞게 변경해야 하는 경우가 많다. 이럴 때 조상의 메서드를 오버라이딩한다. (override의 사전적 의미는 '~위에 덮어쓰다(overwrite)'이다.
오버라이딩의 조건 오버라이딩은 메서드의 내용만을 새로 작성하는 것이므로 메서드의 선언부는 조상의 것과 완전히 일치해야 한다. 그래서 오버라이딩이 성립하기 위해서는 다음과 같은 조건을 만족해야 한다.
자손 클래스에서 오버라이딩하는 메서드는 조상 클래스의 메서드와 1. 이름이 같아야하고 2. 매개변수가 같아야 하고 3. 반환타입이 같아야 한다. 요약하면 선언부가 서로 일치해야 한다는 것이다. 다만 접근 제어자(access modifier)와 예외(exception)는 제한된 조건 하에서만 다르게 변경할 수 있다.
1. 접근 제어자는 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다. 만일 조상 클래스에 정의된 메서드의 접근 제어자가 protected라면, 이를 오버라이딩하는 자손 클래스의 메서드는 접근 제어자가 protected 나 public이어야 한다. 대부분의 경우 같은 범위의 접근 제어자를 사용한다. 접근 제어자의 접근범위를 넓은 것에서 좁은 것 순으로 나열하면 public, protected, (default), private이다.
2. 조상 클래스의 메서드보다 많은 수의 예외를 선언할 수 없다. (예외의 개수는 적거나 같아야 한다는 조건을 만족시키지 못하는 잘못된 오버라이딩이다.)
조상 클래스의 메서드를 자손 클래스에서 오버라이딩할 떄
1. 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
2. 예외는 조상 클래스의 메서드보다 많이 선언할 수 없다.
3. 인스턴스메서드를 statc메서드로 또는 그 반대로 변경할 수 없다.
조상 클래스에 정의된 static메서드를 자손 클래스에서 똑같은 이름의 static메서드로 정의할 수 있을까?
- 가능은 하지만 이것은 각 클래스에 별개의 staric메서드를 정의한 것일 뿐 오버라이딩이 아니다. 각 메서드는 클래스이름으로 구별될 수 있으며, 호출할 때는 참조변수메서드이름() 대신 클래스이름. 메서드이름()으로 하는 것이 바람직하다. static멤버들은 자신들이 정의된 클래스에 묶여있다고 생각하면 된다
Overloading(오버로딩)과 Overloading(오버로딩)
오버로딩과 오버라이딩은 서로 혼동하기 쉽다. 하지만 그 차이는 명백하다. 오버로딩은 기존에 없는 새로운 메서드를 추가하는 것이고, 오버라이딩은 조상으로부터 상속받은 메서드의 내용을 변경하는 것이다
Overloading(오버로딩) - 기존에 없는 새로운 메서드를 정의하는 것(new).
Overloading(오버로딩) - 상속받은 메서드의 내용을 변경하는 것(change, modify).
'Java' 카테고리의 다른 글
Java 22. public, protected, default, private (접근제한자, 접근제어자) (0) | 2023.03.22 |
---|---|
Java 21. Package 패키지 (패키지의 선언) (0) | 2023.03.21 |
Java 19. 상속(inheritance) 상속의 개념과 특징 (0) | 2023.03.19 |
Java 18. static Method(스태틱 메서드) (0) | 2023.03.16 |
Java 17. 객체와 인스턴스(instance)의 개념 알아보기 (0) | 2023.03.15 |