본문 바로가기

Programming/Java

overriding의 조건

반응형
package org.opentutorials.javatutorials.overriding.example1;
 
class Calculator {
    int left, right;
 
    public void setOprands(int left, int right) {
        this.left = left;
        this.right = right;
    }
 
    public void sum() {
        System.out.println(this.left + this.right);
    }
 
    public void avg() {
        System.out.println((this.left + this.right) / 2);
    }
}
 
class SubstractionableCalculator extends Calculator {
     
    public void sum() {
        System.out.println("실행 결과는 " +(this.left + this.right)+"입니다.");
    }
     
    public int avg() {
        return (this.left + this.right)/2;
    }
     
    public void substract() {
        System.out.println(this.left - this.right);
    }
}
 
public class CalculatorDemo {
    public static void main(String[] args) {
        SubstractionableCalculator c1 = new SubstractionableCalculator();
        c1.setOprands(10, 20);
        c1.sum();
        c1.avg();
        c1.substract();
        
   
    }
}

// 이것은 아래와 같은 에러를 발생한다.

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    The return type is incompatible with Calculator.avg()
 
    at org.opentutorials.javatutorials.overriding.example1.SubstractionableCalculator.avg(CalculatorDemo.java:26)
    at org.opentutorials.javatutorials.overriding.example1.CalculatorDemo.main(CalculatorDemo.java:40)

// overriding 하기 위한 조건이 있는데, 메소드의 리턴형식이 같아야 한다.
// 상위클래스는 void이고, 하위클래스는 int이기 때문에 호환되지 않는다는 에러다.

Overriding을 하기 위해서는 데이터 타입 뿐만 아니라 아래와 같은 조건이 맞을 때 가능하다.

 

  1. 메소드의 이름
  2. 메소드 매개변수의 숫자와 데이터 타입, 그리고 순서
  3. 메소드의 리턴타입

위와 같이 메소드의 형태를 정의하는 사항을 일컬어 메소드 시그니쳐(Signature)라고 말한다. 위의 에러는 즉, 메소드들 간의 시그니처가 달라서 생긴 문제다.

 

 

package org.opentutorials.javatutorials.overriding.example1;
 
class Calculator {
    int left, right;
 
    public void setOprands(int left, int right) {
        this.left = left;
        this.right = right;
    }
 
    public void sum() {
        System.out.println(this.left + this.right);
    }
 
 
 	// 아래와 같이 리턴타입을 int로 변경함으로써 에러가 사라진다.
    // void가 아니므로, int다음 return 을 넣어주는 것이다.
    public int avg() {
        return ((this.left + this.right) / 2);
    }
}
 
class SubstractionableCalculator extends Calculator {
     
    public void sum() {
        System.out.println("실행 결과는 " +(this.left + this.right)+"입니다.");
    }
     
    // 아래와 같이 리턴타입을 int로 변경함으로써 에러가 사라진다. 
    // void가 아니므로, int다음 return 을 넣어주는 것이다.
    public int avg() {
        return ((this.left + this.right) / 2);
    }
     
    public void substract() {
        System.out.println(this.left - this.right);
    }
}
 
public class CalculatorDemo {
    public static void main(String[] args) {
        SubstractionableCalculator c1 = new SubstractionableCalculator();
        c1.setOprands(10, 20);
        c1.sum();
        c1.avg();
        c1.substract();
    }
}

그런데 문제가 하나 생겼다.

 

에러는 나오지 않았지만, 상위클래스를 변경하면서 하위클래스와 동일한 코드가 중복되게 되었다.

 return ((this.left + this.right) / 2);

리팩토링 원칙에서 벗어난다.

 

 

package org.opentutorials.javatutorials.overriding.example1;
 
class Calculator {
    int left, right;
 
    public void setOprands(int left, int right) {
        this.left = left;
        this.right = right;
    }
 
    public void sum() {
        System.out.println(this.left + this.right);
    }
 
    public int avg() {
        return ((this.left + this.right) / 2);
    }
}
 
class SubstractionableCalculator extends Calculator {
     
    public void sum() {
        System.out.println("실행 결과는 " +(this.left + this.right)+"입니다.");
    }
     
    public int avg() {
    
    	// 이렇게 생성자 상속 때와 마찬가지로, super를 사용하여
        // 상위클래스의 메소드도 가져올 수 있다.
        return super.avg();
    }
     
    public void substract() {
        System.out.println(this.left - this.right);
    }
}
 
public class CalculatorDemo {
    public static void main(String[] args) {
        SubstractionableCalculator c1 = new SubstractionableCalculator();
        c1.setOprands(10, 20);
        c1.sum();
        System.out.println("실행 결과는" + c1.avg());
        c1.substract();
    }
}
 public int avg() {
 
 		// super.상위메소드();
        return super.avg();
    }

 

반응형

'Programming > Java' 카테고리의 다른 글

java 제네릭  (0) 2022.01.30
ArrayList<datatype> al = new ArrayList<datatype>();  (0) 2022.01.30
상속과 생성자 (기본생성자와 super)  (0) 2022.01.29
extends 상속  (0) 2022.01.29
자바 생성자  (0) 2022.01.29