[자바의 정석] 오버라이딩 (overriding)

강신현·2022년 5월 23일
0

자바의 정석

목록 보기
10/15

✅ 오버라이딩 ✅ vs오버로딩 ✅ super

오버라이딩

(overriding)

조상 클래스로부터 상속받은 메서드를 (자손 클래스) 자신에 맞게 변경하는 것

class Point{
	int x;
    int y;
    
    String getLocation(){
    	return x+y;
    }
}

class Point3D ectends Point{
	int z;
    
    String getLocation(){ // 오버라이딩
    	return x+y+z;
    }
}

- 조건

조상 클래스의 메서드와

  1. 이름이 같아야 한다.
  2. 매개변수가 같아야 한다.
  3. 반환타입이 같아야 한다.
    (한마디로 선언부가 일치해야 한다.)

접근 제어자와 예외는 제한된 조건 하에서 다르게 변경할 수 있다.

  1. 접근 제어자는 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
    public > protected > (default) > private
    만약 조상 클래스의 메서드가 protected라면,
    자손 클래스의 메서드는 protected나 public이어야 한다.
  2. 조상 클래스의 메서드보다 많은 예외를 선언할 수 없다.
  3. 인스턴스 메서드를 static메서드로, 혹은 그 반대로 변경할 수 없다.

오버로딩 vs 오버라이딩

오버로딩 (overloading) : 기존에 없는 새로운 메서드를 정의하는 것
오버라이딩 (overriding) : 상속받은 메서드의 내용을 변경하는 것

class Parent{
	void parentMethod() {}
}

class Child extends Parent{
	void parentMethod() {} // 오버라이딩
    void parentMethod(int i) {} // 오버로딩
    
    void childMethod()
    void childMethod(int i) // 오버로딩
}

super

자손 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조변수

  • 조상 클래스로부터 상속받은 멤버도 자손 클래스 자신의 멤버이므로 super대신 this를 사용할 수 있다.
  • 하지만 멤버가 중복 정의되어 구별이 필요한 경우에넌 super을 사용하는게 좋다.
  • static 메서드 (클래스 메서드) 는 인스턴스와 관련이 없으므로 this와 마찬가지로 super 역시 static 메서드에서는 사용할 수 없고 인스턴스 메서드에서만 사용할 수 있다.
package ch07;

public class Super {

	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

  • 변수만이 아니라 메서드 역시 super을 사용해서 호출할 수 있는데, 특히 조상 클래스의 메서드를 자손 클래스에서 오버라이딩한 경우에 조상 클래스의 메서드가 필요할때 super을 사용한다.

- 조상 클래스의 생성자

Object 클래스를 제외한 모든 클래스의 생성자 첫 줄에 생성자.this() 또는 super()을 호출해야 한다. 그렇지 않으면 컴파일러가 자동적으로 super() 을 생성자의 첫 줄에 삽입한다.

(자세한 매커니즘은 2회독때 알아보도록 하자.)

profile
땅콩의 모험 (server)

0개의 댓글