본문 바로가기

JAVA/기초다지기

오버라이딩의 조건

 

 

overriding을 하기위해서는 아래의 조건을 충족시켜야 한다.

 

 

· 메소드의 이름

 

·  메소드 매개변수의 숫자와 데이터타입 그리고 순서

 

·  메소드의 리턴 타입

 

위와 같이 메소드의 형태를 정의하는 사항들을 통틀어서 메소드의 서명(Signature)이라고 한다.

 

 

<잘못된 오버라이딩 예>

package day0407;

class Calculatori {
    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 SubstractionableCalculatori extends Calculatori {

    public void sum() {
        System.out.println("실행 결과는" + (this.left + this.right) + "입니다.");
    }

    public void substract() {
        System.out.println(this.left - this.right);
    }

    public int avg() {
        return ((this.left + this.right) / 2);
    }
}

public class CalculatorDemo {

    public static void main(String[] args) {
        SubstractionableCalculatori c1 = new SubstractionableCalculatori();

        c1.setOprands(10, 20);
        c1.sum();
        c1.avg();
        c1.substract();
    }
}

 

 

그렇다면 부모클래스의 코드를 변경한다면 되는걸까?

package day0407;

class Calculatori {
    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() {
        System.out.println((this.left + this.right) / 2);
    }
}

class SubstractionableCalculatori extends Calculatori {

    public void sum() {
        System.out.println("실행 결과는" + (this.left + this.right) + "입니다.");
    }

    public void substract() {
        System.out.println(this.left - this.right);
    }

    public int avg() {
        return ((this.left + this.right) / 2);
    }
}

public class CalculatorDemo {

    public static void main(String[] args) {
        SubstractionableCalculatori c1 = new SubstractionableCalculatori();

        c1.setOprands(10, 20);
        c1.sum();
        c1.avg();
        c1.substract();
    }
}

 

 

답은 아니다이다.

 

상위클래스와 하위 클래스의 서명(int)이 같기 때문에 메소드 오버라이딩은 할 수 있었지만

코드의 중복이 발생한다.

 

avg()의 부모와 자식클래그사 같은 로직을 가지고 있기때문에 중복은 제거되어야한다.

 

이때,

생성자와 마찬가지로 super를 사용하면 이를 해결할 수 있다.

 


package day0407;

class Calculatori {
    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 SubstractionableCalculatori extends Calculatori {

    public void sum() {
        System.out.println("실행 결과는" + (this.left + this.right) + "입니다.");
    }

    public void substract() {
        System.out.println(this.left - this.right);
    }

    public int avg() {
        return super.avg();
    }
}

public class CalculatorDemo {

    public static void main(String[] args) {
        SubstractionableCalculatori c1 = new SubstractionableCalculatori();

        c1.setOprands(10, 20);
        c1.sum();
        System.out.println("실행 결과는"+ c1.avg());
        c1.substract();
    }
}

하위 클래스의 메소드 avg에서 상위 클래스의 메소드를 호출하기위해서 super를 사용하고 있다.

이 덕분에 중복을 제거 할 수 있었다.

'JAVA > 기초다지기' 카테고리의 다른 글

객체지향 프로그래밍  (0) 2021.10.22
String 클래스 - 메소드  (0) 2021.10.21
overriding  (0) 2021.04.07
코드로 알아보는 상속  (0) 2021.04.07
Method  (0) 2021.03.11