오버라이딩
조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것
오버라이딩 조건
자손 클래스에서 오버라이딩하는 메서드는 조상 클래스의 메서드와
- 이름이 같아야 한다.
- 매개변수가 같아야 한다.
- 반환타입이 같아야 한다.
→ 선언부가 서로 일치해야 한다.
- 접근 제어자는 조상 클래스의 메서드보다 좁은 범위로 변경 할 수 없다.접근 제어자의 넓은 것에서 좁은 것으로 나열 : public → protected → (default) → private
- 조상 클래스의 메서드보다 많은 수의 예외를 선언할 수 없다.
- 인스턴스메서드를 static메서드로 또는 그 반대로 변경할 수 없다.
오버로딩과 오버라이딩
오버로딩 : 기존에 없는 새로운 메서드를 추가
오버라이딩 : 조상으로부터 상속받은 메서드의 내용을 변경하는 것이다.
super
super는 자손 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조변수 멤버변수와 지역변수의 이름이 같을 경우 this로 구분하듯, 멤버변수와 자신의 멤버와 이름이 같을 경우 super를 붙여 구분
package object_oriented_programming2;
public 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);
System.out.println("super.x="+super.x);
}
}
//결과
x=10
this.x=10
super.x=10
package object_oriented_programming2;
public class SuperTest2 {
public static void main(String[] args) {
Child2 c = new Child2();
c.method();
}
}
class Parent2{
int x=10;
}
class Child2 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
super() 조상 클래스의 생성자
Object클래스를 제외한 모드 클래스의 생성자 첫 줄에 생성자 , this() 또는 super()를 호출해야 한다. 그렇지 않으면 컴파일러가 자동적으로 'super();'를 생성자의 첫줄에 삽입한다.
- 클래스 : 어떤 클래스의 인스턴스를 생성할 것인가?
- 생성자 : 선택한 클래스의 어떤 생성자를 이용해서 인스턴스를 생성할 것인가?
package object_oriented_programming2;
public class PointTest {
public static void main(String[] args) {
Point2 p3 = new Point3D(1,2,3);
}
}
class Point2{
int x, y;
Point2(int x, int y){
this.x = x;
this.y = y;
}
String getLocation() {
return "x :" + x+ ", y :"+y;
}
}
class Point3D extends Point2 {
int z;
Point3D(int x, int y, int z){
this.x = x;
this.y = y;
this.z = z;
}
String getLocation() {
return "x :" + x +", y :"+y;
}
}
//결과
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Implicit super constructor Point2() is undefined. Must explicitly invoke another constructor
at object_oriented_programming2.Point3D.<init>(PointTest.java:26)
at object_oriented_programming2.PointTest.main(PointTest.java:6)
Point3D클래스의 생성자에서 조상 클래스의 생성자인 Point()를 찾을 수 없음.
💡조상 클래스의 멤버변수는 이처럼 조상의 생성자에 의해 초기화되도록 해야 하는 것이다.
package object_oriented_programming2;
public class PointTest2 {
public static void main(String[] args) {
Point3D2 p3 = new Point3D2();
System.out.println("p3.x= "+p3.x);
System.out.println("p3.y= "+p3.y);
System.out.println("p3.z= "+p3.z);
}
}
class Point3{
int x=10;
int y=20;
Point3(int x, int y){
this.x = x;
this.y = y;
}
}
class Point3D2 extends Point3{
int z = 30;
Point3D2(){
this(100, 200, 300);
}
Point3D2(int x, int y, int z){
super(x,y);
this.z = z;
}
}
//결과
p3.x= 100
p3.y= 200
p3.z= 300
출처 : JAVA의 정석 - (남궁성지음)