: 조상 클래스로부터 상속받은 메서드의 내용을 변경하는것
오버라이딩의 조건
자손클래스에서 오버라이딩하는 메서드는 조상 클래스의 메서드와
- 이름이 같아야 한다.
- 메서드가 같아야 한다.
- 반환타입이 같아야 한다.
조상클래스의 메서드를 자손클래스에서 오버라이딩할때
- 접근제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
- 예외는 조상클래스의 메서드보다 많이 선언할 수 없다.
- 인스턴스메서드를 static메서드로 또는 그 반대로 변경할 수 없다.
오버로딩
: 기존에 없는 새로운 메서드를 정의하는 것(new)
오버라이딩
: 상속받은 메서드의 내용을 변경하는 것(change, modify)
class Parent {
void parentMethod() {}
}
class Child extends Parent {
void parentMethod() {} //오버라이딩
void parentMethod(int i) {} //오버로딩
}
this와 super
this
: 멤버변수와 지역변수의 이름이 같을때 this를 붙여서 구분한다.
super
: 상속받은 멤버와 자신의 멤버와 이름이 같을때 super를 붙여서 구분한다.
- 조상의 멤버와 자신의 멤버를 구별하는데 사용된다는 점을 제외하고 super와 this는 근본적으로 같다.
- 모든 인스턴스메서드에는 자신이 속한 인스턴스의 주소가 지역변수로 저장되는데, 이것이 참조변수인 this와 super의 값이 된다.
- static메서드(클래스메서드)는 인스턴스와 관련이 없으므로 this와 super는 static메서드에서는 사용불가하고 인스턴스메서드에서만 사용가능하다.
class SuperTest2 {
public static void main(String args[]) {
Child c = new Child();
c.method();
}
}
class Parent {
int x = 10;
}
class Child extends Parent {
int x = 20;
void method() {
System.out.println("x=" + x);
System.out.println("this.x=" + this.x);
System.out.println("super.x=" + super.x);
}
}
실행결과
x = 20
this.x=20
super.x=10
Object클래스를 제외한 모든 클래스의 생성자 첫줄에 생성자(this() 또는 super())를 호출해야 한다. 그렇지 않으면 컴파일러가 자동으로 super();를 생성자의 첫줄에 삽입한다.
인스턴스를 생성할때는 클래스를 선택하는 것만큼 생성자를 선택하는 것도 중요하다.
1. 클래스 - 어떤 클래스의 인스턴스를 선택할 것인가?
2. 생성자 - 선택한 클래스의 어떤 생성자를 이용해서 인스턴스를 생성할 것인가?