Java

객체(Object) - 오버라이딩(overriding)

제주니어 2022. 9. 20. 22:44

오버라이딩(overriding)

오버라이딩이란?

  • 조상 클래스에서 상속받은 메소드의 내용을 변경하는 것.
  • 부모 클래스의 메소드를 자식 클래스에서 다시 재정의해서 사용하는 것을 메소드 오버라이딩이라 한다.
  • @Override 어노테이션을 붙여 준다. (생략 가능)

오버라이딩의 조건

자손 클래스에서 오버라이딩하는 메서드는 조상 클래스의 메서드와 이름, 매개변수, 반환타입이 같아야 한다. (선언부가 서로 일치)

  • 접근 제어자는 조상 클래스의 메서드보다 좁은 범위로 변경 할 수 없다. (public - protected - (default) - private)
  • 조상 클래스의 메서드보다 많은 수의 예외를 선언할 수 없다.
  • 인스턴스 메서드는 static 메서드로 또는 그 반대로 변경할 수 없다.
  • 선언부가 조상 클래스의 메서드와 일치해야 한다.

오버로딩 vs 오버라이딩

  • 오버로딩(overloading) : 기존에 없는 새로운 메서드를 정의하는 것(new) - 상속 X
  • 오버라이딩(overriding) : 상속받은 메서드의 내용을 변경하는 것(change, modify)
class Parent {
	void parentMethod(){}
}

class Child extends Parnet{
	void parentMethod(){} // 오버라이딩
	void parentMethod(double d){} // 오버로딩

	void childMethod(){}
	void childMethod(double d){} // 오버로딩
}
// 부모 클래스
public class Animal {
  private String name;
  private String kinds;
  
  public Animal() {
  }

  public Animal(String name, String kinds) {
      this.name = name;
      this.kinds = kinds;
  }

  public String bark() {
      return "짖는다.";
  }
}

// 자식 클래스
public class Dog extends Animal {
  private int weight;

  public Dog() {
  }

  public Dog(String name, String kinds, int weight) {
    super(name, kinds);
    this.weight = weight;
  }

  @Override
  public String bark() {
      return "멍멍~ 짖는다.";
  }
}
  • 자식 객체에서 오버라이딩된 메소드를 호출하면 부모 객체의 메소드가 아닌 오버라이딩된 자식 메소드가 호출된다.
  • 부모 객체의 메소드는 삭제되는 것이 아닌 오버라이딩된 메소드에 의해 가려지게 된다.
  • 자식 클래스 내부에서 오버라이딩된 부모 클래스의 메소드를 호출해야 하는 상황이 발생한다면 super를 통해서 부모 메소드를 호출할 수 있다.

super

  • 자손 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조 변수.
  • 모든 인스턴스 메서드에는 자신이 속한 인스턴스의 주소가 지역변수로 저장되는데, 이것이 참조변수인 this와 super의 값이 된다.
  • static 메서드(클래스 메서드)는 인스턴스와 관련이 없으므로 this와 같이 super도 static 메서드에서는 사용할 수 없고 인스턴스 메서드에서만 사용한다.

참고) this

  • 객체 자신을 가리키는 참조변수, 인스턴스 메서드(생성자)내에서만 존재
  • 조상의 멤버를 자신의 멤버와 구별할 때 사용

super() - 조상 클래스의 생성자

  • super()는 자식 클래스의 생성자 첫 줄에 위치해야 한다.
  • 생성자는 객체 생성을 위한 특별한 메소드로 상속되지 않는다.
  • 자식 클래스의 객체를 생성하면 부모 클래스의 생성자가 먼저 호출되면서 부모 객체가 생성되고 자식 객체가 생성된다.
  • 자식 클래스의 생성자 안에서 super()를 통해서 부모 클래스의 생성자를 호출한다.
  • Object클래스를 제외한 모든 클래스의 생성자 첫 줄에 생성자, this() 또는 super()를 호출해야 한다. 그렇지 않으면 컴파일러가 자동으로 super()를 생성자의 첫 줄에 삽입한다.
// 부모 클래스
public class Animal {
  private String name;
  private String kinds;
  
  public Animal() {
  }

  public Animal(String name, String kinds) {
      this.name = name;
      this.kinds = kinds;
  }
}

// 자식 클래스
public class Dog extends Animal {
  private int weight;

  public Dog() {
    // super() 생략 시 자동으로 생성한다.
  }

  public Dog(String name, String kinds, int weight) {
    super(name, kinds);

    this.weight = weight;
  }
}

final 클래스와 final 메소드

  • final 키워드는 필드뿐만 아니라 클래스메소드 선언 시에 사용할 수 있다.
  • final 키워드를 클래스 선언에 붙이게 되면 이 클래스는 상속할 수 없는 클래스가 된다.
// java.lang에서 제공하는 String 클래스
public final class String {
  ...
}
// java.lang에서 제공하는 Object 클래스
public class Object {
  public final void wait() {
      ...
  }
}

'Java' 카테고리의 다른 글

객체(Object) - 제어자(modifier)  (0) 2022.09.22
객체(Object) - package & import  (0) 2022.09.21
객체(Object) - 상속(inheritance)  (0) 2022.09.19
객체(Object) - 변수의 초기화  (0) 2022.08.24
객체(Object) - 생성자(Constructor)  (0) 2022.08.24