오버라이딩(overriding)
오버라이딩이란?
- 조상 클래스에서 상속받은 메소드의 내용을 변경하는 것.
- 부모 클래스의 메소드를 자식 클래스에서 다시 재정의해서 사용하는 것을 메소드 오버라이딩이라 한다.
- @Override 어노테이션을 붙여 준다. (생략 가능)
오버라이딩의 조건
자손 클래스에서 오버라이딩하는 메서드는 조상 클래스의 메서드와 이름, 매개변수, 반환타입이 같아야 한다. (선언부가 서로 일치)
- 접근 제어자는 조상 클래스의 메서드보다 좁은 범위로 변경 할 수 없다. (public - protected - (default) - private)
- 조상 클래스의 메서드보다 많은 수의 예외를 선언할 수 없다.
- 인스턴스 메서드는 static 메서드로 또는 그 반대로 변경할 수 없다.
- 선언부가 조상 클래스의 메서드와 일치해야 한다.
오버로딩 vs 오버라이딩
- 오버로딩(overloading) : 기존에 없는 새로운 메서드를 정의하는 것(new) - 상속 X
- 오버라이딩(overriding) : 상속받은 메서드의 내용을 변경하는 것(change, modify)
class Parent {
void parentMethod(){}
}
class Child extends Parnet{
void parentMethod(){} // 오버라이딩
void parentMethod(double d){} // 오버로딩
void childMethod(){}
void childMethod(double d){} // 오버로딩
}
// 부모 클래스
public class Animal {
private String name;
private String kinds;
public Animal() {
}
public Animal(String name, String kinds) {
this.name = name;
this.kinds = kinds;
}
public String bark() {
return "짖는다.";
}
}
// 자식 클래스
public class Dog extends Animal {
private int weight;
public Dog() {
}
public Dog(String name, String kinds, int weight) {
super(name, kinds);
this.weight = weight;
}
@Override
public String bark() {
return "멍멍~ 짖는다.";
}
}
- 자식 객체에서 오버라이딩된 메소드를 호출하면 부모 객체의 메소드가 아닌 오버라이딩된 자식 메소드가 호출된다.
- 부모 객체의 메소드는 삭제되는 것이 아닌 오버라이딩된 메소드에 의해 가려지게 된다.
- 자식 클래스 내부에서 오버라이딩된 부모 클래스의 메소드를 호출해야 하는 상황이 발생한다면 super를 통해서 부모 메소드를 호출할 수 있다.
super
- 자손 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조 변수.
- 모든 인스턴스 메서드에는 자신이 속한 인스턴스의 주소가 지역변수로 저장되는데, 이것이 참조변수인 this와 super의 값이 된다.
- static 메서드(클래스 메서드)는 인스턴스와 관련이 없으므로 this와 같이 super도 static 메서드에서는 사용할 수 없고 인스턴스 메서드에서만 사용한다.
참고) this
- 객체 자신을 가리키는 참조변수, 인스턴스 메서드(생성자)내에서만 존재
- 조상의 멤버를 자신의 멤버와 구별할 때 사용
super() - 조상 클래스의 생성자
- super()는 자식 클래스의 생성자 첫 줄에 위치해야 한다.
- 생성자는 객체 생성을 위한 특별한 메소드로 상속되지 않는다.
- 자식 클래스의 객체를 생성하면 부모 클래스의 생성자가 먼저 호출되면서 부모 객체가 생성되고 자식 객체가 생성된다.
- 자식 클래스의 생성자 안에서 super()를 통해서 부모 클래스의 생성자를 호출한다.
- Object클래스를 제외한 모든 클래스의 생성자 첫 줄에 생성자, this() 또는 super()를 호출해야 한다. 그렇지 않으면 컴파일러가 자동으로 super()를 생성자의 첫 줄에 삽입한다.
// 부모 클래스
public class Animal {
private String name;
private String kinds;
public Animal() {
}
public Animal(String name, String kinds) {
this.name = name;
this.kinds = kinds;
}
}
// 자식 클래스
public class Dog extends Animal {
private int weight;
public Dog() {
// super() 생략 시 자동으로 생성한다.
}
public Dog(String name, String kinds, int weight) {
super(name, kinds);
this.weight = weight;
}
}
final 클래스와 final 메소드
- final 키워드는 필드뿐만 아니라 클래스와 메소드 선언 시에 사용할 수 있다.
- final 키워드를 클래스 선언에 붙이게 되면 이 클래스는 상속할 수 없는 클래스가 된다.
// java.lang에서 제공하는 String 클래스
public final class String {
...
}
// java.lang에서 제공하는 Object 클래스
public class Object {
public final void wait() {
...
}
}
'Java' 카테고리의 다른 글
객체(Object) - 제어자(modifier) (0) | 2022.09.22 |
---|---|
객체(Object) - package & import (0) | 2022.09.21 |
객체(Object) - 상속(inheritance) (0) | 2022.09.19 |
객체(Object) - 변수의 초기화 (0) | 2022.08.24 |
객체(Object) - 생성자(Constructor) (0) | 2022.08.24 |