본문 바로가기

프로그래밍/JAVA

[ JAVA ] 오버라이딩(overriding)

1. 오버라이딩이란?

- override의 사전적 의미는 '~위에 덮에쓰다(overwrite)'으로 조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것을 말한다.

- 상속받은 메서드를 자손 클래스 자신에 맞게 변경해야하는 경우 조상의 메서드를 오버라이딩한다.

2. 오버라이딩의 조건

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

✔ 접근 제어자(access modifier)와 예외(exception)는 제한된 조건 하에서만 다르게 변경할 수 있다.

1️⃣ 접근 제어자는 조상 클래스의 메서드보다 좁은 범위로 변경 할 수 없다.
  - 만약 조상 클래스에 정의된 메서드의 접근 제어자가 protected라면, 이를 오버라이딩하는 자손 클래스의 메서드는 접근 제어자가  protected나 public이어야 한다.
  - 대부분의 경우 같은 범위의 접근 제어자를 사용한다.
    ※ 접근 제어자의 접근범위
     public   >   protected   >   (default)   >   private

2️⃣ 조상 클래스의 메서드보다 많은 수의 예외를 선언할 수 없다.

3️⃣ 인스턴스메서드를 static메서드로 또는 그 반대로 변경할 수 없다.
  - 조상 클래스에 정의된 static메서들르 자손 클래스에서 똑같은 이름의 static메서드로 정의할 수 있지만 
    이것은 각 클래스에 별개의 static메서드를 정의한 것일 뿐 오버라이딩은 아니다.

3. 오버로딩 vs 오버라이딩

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

예시)

4. super

> 자손 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조변수이다.
> 조상 클래스 멤버 변수와 자손 클래스 멤버 변수는 같은 이름으로 정의하는 것이 가능하며 참조변수 super를 이용해서 서로 구별할 수 있다.
> static메서드(클래식 메서드)는 인스턴스와 관련이 없으므로 this와 마찬가지로 super도 static 메서드에서는 사용할 수 없고 인스턴스 메서드에서만 사용할 수 있다.
> 메서드도 super를 써서 호출할 수 있으며, 특히 조상 클래스의 메서드를 자손 클래스에서 오버라이딩한 경우에 super를 사용한다.

예시)

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

- super()는 조상 클래스의 생성자를 호출하는데 사용된다.
- Object클래스를 제외한 모든 클래스의 생성자 첫 줄에 생성자, this() 또는 super(),를 호출해야한다.
  그렇지 않으면 컴파일러가 자동적으로 'super();'를 생성자의 첫줄에 삽입한다.
  ❓ 생성자의 첫 줄에서 조상클래스의 생성자를 호출해야하는 이유
    >
자손 클래스의 멤버가 조상 클래스의 멤버를 사용할 수도 있으므로 조상의 멤버들이 먼저 초기화되어
       있어야 하기 때문

※ 인스턴스를 생성할 때 고려할 점

① 클래스 - 어떤 클래스의 인스턴스를 생성할 것인가?

② 생성자 - 선택한 클래스의 어떤 생성자를 이용해서 인스턴스를 생성할 것인가?

예시1)

예시2)

 생성자의 호출 순서

Point3D()   >   Point3D(int x, int y, int z)   >   Point(int x, int y)   >   Object()

'프로그래밍 > JAVA' 카테고리의 다른 글

[ JAVA ] java.lang 패키지 - Object클래스  (0) 2022.11.26
[ JAVA ] 인터페이스(interface)  (0) 2022.10.29
[ JAVA ] 상속(inheritance)  (0) 2022.10.09
[ JAVA ] 자바의 형변환  (0) 2022.10.08
[ JAVA ] 변수와 메서드  (0) 2022.09.20