오버라이딩
조상 클래스로부터 상속받은 메서드의 내용을 상속받는 클래스에 맞게 변경하는 것
class Point {
int x;
int y;
String getLocation() {
return "x :" + x + ", y :"+ y;
}
}
class Point3D extends Point {
int z;
String getLocation() { // 오버라이딩
return "x :" + x + ", y :"+ y + ", z :" + z;
}
}
조건
선언부가 같아야 한다.(이름, 매개변수, 반환타입)
접근 제어자, 예외는 제한된 조건 하에서 다르게 변경할 수 있다.
- 접근 제어자는 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
- 조상 클래스의 메서드보다 많은 수의 예외를 선언할 수 없다.
- 인스턴스 메서드를 static 메서드로 또는 그 반대로 변경할 수 없다.
조상 클래스에 정의된 static 메서드를 자손 클래스에서 같은 이름의 static메서드로 정의할 수 있지만, 이것은 오버라이딩이 아니다.
오버로딩 vs 오버라이딩
오버로딩(overloading) 기존에 없는 새로운 메서드를 정의하는 것
오버라이딩(overriding) 상속받은 메서드의 내용을 변경하는 것
class Parent {
void parentMethod() {}
}
class Child extends Parent {
void parentMethod() {} // 오버라이딩
void parentMEthod(int i) {} // 오버로딩
void childMethod() {}
void childMethod(int i) {} // 오버로딩
void childMethod() {} // 에러. 중복정의
}
super
자손 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는 데 사용되는 참조변수
class SuperTest {
public static void main(String args[]) {
Child c = new Child();
c.method();
}
}
class Parent {
int x=10;
}
class Child extends Parent {
void method() {
System.out.println("x=" + x);
System.out.println("this.x=" + this.x); // this.x=10
System.out.println("super.x="+ super.x); // super.x=10
}
}
class SuperTest2 {
public static void main(String args[]) {
Child2 c = new Child2();
c.method();
}
}
class Parent2 {
int x=10;
}
class Child2 extends Parent2 {
int x=20;
void method() {
System.out.println("x=" + x);
System.out.println("this.x=" + this.x); // this.x=20
System.out.println("super.x="+ super.x); // super.x=10
}
}
super()
조상 클래스의 생성자
- 자손 클래스의 인스턴스를 생성하면, 자손의 멤버와 조상의 멤버가 합쳐진 하나의 인스턴스가 생성된다.
- 조상의 멤버들도 초기화되어야 하기 때문에 자손의 생성자의 첫 문장에서 조상의 생성자를 호출해야 한다.
Object 클래스를 제외한 모든 클래스의 생성자 첫 줄에 생성자 this() 또는 super()를 호출해야 한다. 그렇지 않으면 컴파일러가 자동적으로 super()를 생성자의 첫 줄에 삽입한다.
'JAVA' 카테고리의 다른 글
[OOP] 제어자(modifier) (0) | 2023.03.07 |
---|---|
[OOP] package와 import (0) | 2023.03.07 |
[OOP] 상속(inheritance) (0) | 2023.03.06 |
[OOP] 변수의 초기화 (0) | 2023.03.04 |
[OOP] 생성자(Constructor) (0) | 2023.03.03 |