조상 클래스로부터 상속받은 메소드의 내용을 변경하는 것
상속받은 메소드를 그대로 사용하기도 하지만, 자손 클래스에 맞게 변경할 때 사용
ex)
class Point{
int x;
int y;
String get Location(){
return "x + y :", x + y;
}
}
3d는 point를 상속
class Point3D extends Point{
int z;
String get Location(){
return "x + y + z:", x + y + z;
}
}
위 Point3D 클래스를 보면 Point를 상속받지만 Location() 메소드를 오버라이딩
즉, 재정의하여 자신에 맞게 z축 좌표를 추가하였다
이와 같이 자손 클래스 자신에게 맞게 메소드를 변경하는 것을 오버라이딩이라고 한다
오버라이딩은 메소드의 내용만을 새로 작성하는 것이기에 메소드 선언부는 조상과 일치
자손 클래스에서 오버라이딩하는 메소드는 조상클래스의 메소드와
- 이름이 같아야 한다
- 매개변수가 같아야 한다
- 반환 타입이 같아야 한다
한마디로 선언부가 같아야 한다.
다만 접근 제어자와 예외는 제한된 조건 하에서만 다르게 변경할 수 있다
아직 접근 제어자와 예외에 대해서 다루지 않았지만 간단하게 설명하자면
1. 접근 제어자는 조상클래스의 메서드보다 좁은 범위로 변경할 수 없다
조상 protected -> 자손 -> protected or public
public, protected, (default), private
2. 조상 클래스의 메소드보다 많은 수의 예외를 선언할 수 없다
3. 인스턴스 메소드를 static 메소드로 또는 그 반대로 변경할 수 없다
처음 오버로딩과 오버라이딩의 개념을 접한다면 헷갈릴 수 있지만 완전히 다른 기능
오버로딩 : 기존에 없는 새로운 메소드를 정의
오버라이딩 : 상속받은 메소드의 내용을 변경
오버로딩을 전에 배울 때 매개변수의 개수나 타입이 달라야한다는 조건이 있었다
허나 오버라이딩은 상속받을 메소드의 매개변수와 타입이 같아야한다는 조건이 있다
즉 오버로딩은 같은 메소드 이름으로 새로운 메소드를 정의하는 것이고
오버라이딩은 상속받은 메소드의 내용을 바꾸는 것이다
class Parent{
void parentMethod(){}
}
class Child extends Parent{
void parentMethod(){} // 오버라이딩
void parentMethod(int i) {} // 오버로딩 > 매개변수 변경
void childMethod(){} 메소드 정의
void childMethod(int i) {} // 오버로딩
}
자손 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조변수
멤버변수와 지역변수의 이름이 같을 때 this를 붙여 구별했듯이
상속받은 멤버와 자신의 멤버와 이름이 같을 때는 super를 붙여서 구별할 수 있다
조상 클래스로부터 상속받은 멤버도 자신의 멤버이므로 this를 사용할 수 있으나
조상 클래스의 멤버와 자손 클래스의 멤버가 중복 정의되어 서로 구별해야 하는 경우에만 super를 사용하는 것이 좋다
class SuperTest{
main(){ // 메인 메소드
Child c = new Child();
c. method(); // c의 method() 메소드 실행
}
}
class Parent{
int x = 10;
}
class Child extends Parent{
int x = 20;
void method(){ // 메인에서 실행
print(x); // 20
print(this.x); // 20
print(super.x) // 10
}
}
위 코드는 변수만을 다뤘지만 메소드 역시 super를 써서 호출할 수 있다
조상 클래스의 생성자
this()는 같은 클래스의 다른 생성자를 호출하는데 사용되지만,
super()는 조상 클래스의 생성자를 호출하는데 사용
자손 클래스의 인스턴스를 생성하면, 자손과 조상의 멤버가 합쳐진 하나의 인스턴스가 생성
이 때 조상 클래스 멤버의 초기화 작업이 수행해야 하기에 자손 클래스에서 조상 클래스 생성자 호출
Object클래스는 모든 클래스의 최고 조상임을 우리는 알고 있다
즉 Object를 제외한 모든 클래스의 생성자는 첫줄에 반드시 자신 조상의 생성자를 호출
그렇지 않으면 컴파일러는 생성자의 첫 줄에 super()를 자동으로 추가
- 오버로딩과 오버라이딩의 차이점을 꼭 알아두자
- super()는 Object를 제외한 모든 클래스의 생성자 첫줄에서 호출
- 상속 관계에서 접근 제어자 범위와 예외처리 수의 관계를 알게 됨
- 확실히 Java를 한번 하고 두번째 복습을 통해 학습을 하니 훨씬 이해도 잘되고
내가 놓쳤던 부분을 되짚어보는 시간인 것 같다