티스토리 뷰

Spring/Java

[Java] Overriding vs Overloading

DevJunku 2021. 12. 6. 19:53

Override: 새롭게 정의하다

상속은 상위 클래스의 기능을 하위 클래스에게 물려주는 기능이다. 예를 들어서 상위 클래스의 기능을 하위 클래스가 수정없이 그대로 사용하게 될 경우 어떻게 될까? 상당한 제약이 있을 것이다. 이러한 제약에서 벗어나기 위해서는 서브 클래스가 슈퍼 클래스의 메소드를 변경할 수 있어야 한다. 이러한 맥락이 바로 Overriding이다.

즉 자바에서는 부모의 기능만을 사용하는 것이 아니라 부모의 기능을 수정 및 재정의하여 자식 클래스가 사용할 수 있도록 해주는 것이 바로 Overriding이다.

Overriding의 조건

  1. Overriding을 하기 위해서는 Super class method의 리턴 형식과 Sub class method의 리턴형식이 같아야 한다. 즉 Super class method는 void 형식이면 Sub class method의 리턴형식도 void여야 한다. 예를 들어서 다음과 같은 코드를 보자.Math class에서 avg라는 메소드를 정의했고 SubstructionableMath class에서 Math를 상속 받은 후 이를 Overriding하고 있는 것이다.
class Math {
        int left, right;

        public Math(int left, int right) {
                this.left = left;
                this.right = right;
        }

        ...

        public int avg() {
                return ((this.left + thie.right) / 2); // 1번 메소드, return 값이 overriding한 super 부분으로 들어감
        }
}

class SubstructionableMath extends Math {
        ...
        public int avg() {
                return super.avg(); // 이 부분에서 1번 메소드를 호출함
        }
}

Math class에서 avg라는 메소드를 정의했고 SubstructionableMath class에서 Math를 상속 받은 후 이를 Overriding하고 있는 것이다. 아직 java의 overriding을 제대로 배운 것은 아니지만, 약간 코드를 읽을 때 불편한 감이 있는 것 같다. 확실히 이 메소드는 오버라이드 하고 있다는 느낌을 받지 못하는 느낌이다.

 

overloading: 매개변수의 형식을 갖는 여러 개의 변수를 정의할 수 있는 방법

아래의 예제를 봐보자.

class Math {
    int left, right, third;
        int forth = 0;

    public void setOprand(int left, int right, int third) {
        this.left = left;
        this.right = right;
        this.third = third;
    }

}

public class Calculation {
    public static void main(String[] args) {
        Math m = new Math();
        m.setOprand(10, 20, 30);
    }
}

만약에 Math class에 4번째 변수의 forth를 받아야 한다면, 어떻게 해야 할까? 변수를 받는 setOprand 메소드를 수정해야 할 것이다. 또는 해당 메소드를 따로 만들어주면 된다. 하지만, 이런 방식은 매력적인 방법은 아닌 것 같다. 그렇다면 어떻게 해야할까? 아래의 코드를 봐보자.

class Math {
    int left, right, third;
    int forth = 0;

    public void setOprand(int left, int right, int third) {
        this.left = left;
        this.right = right;
        this.third = third;
    }

    public void setOprand(int left, int right, int third, int forth) {
        this.left = left;
        this.right = right;
        this.third = third;
        this.forth = forth;
    }

}

public class Calculation {
    public static void main(String[] args) {
        Math m = new Math();
        m.setOprand(10, 20, 30);
        m.setOprand(10, 20, 30, 40);
    }
}

메소드의 이름을 갖게 하여 추가적인 변수를 받을 수 있도록 지정할 수 있다. 즉 자바에서는 메소드의 이름이 같더라도 매개변수의 개수나 출력 형태가 다르면 다른 메소드로 인식하게 된다. 추가적으로 위의 코드의 반복을 줄이기 위해서는 다음과 같이 코드를 짜면 된다.

public int setOprand(int left, int right, int third, int forth) {
        System.out.println("setOprand(int left, int right, int third, int forth)");
        this.setOprand(left, right, third);
        this.forth = forth;
        return left + right + third + forth;
    }

Overloading의 규칙

overloading을 할 때 type은 무조건 같아야 한다. 무조건!! 같아야 한다! 입력 파라미터 타입이 다를 수는 있지만 출력 type은 무조건 같아야한다. 안 그러면 오류난다. 그리고 또 하나 입력 파라미터의 값의 타입은 달라도 되지만, 이름은 같아야 같아야한다. 무조건 같아야 한다.

 

 

정리하자면

Method Overloading은 여러 개의 같은 이름에 다른 기능을 갖는 메소드를 정의하는 것이고

Method Overriding은 super class의 method의 기능을 사용하면서 또는 해당 기능을 sub class에서 확장하고자 할 때 사용하는 것이다.

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

[Java] 상속 / 상속과 생성자  (0) 2021.12.03
[Java] 초기화와 생성자  (0) 2021.12.02
[Java] 유효범위  (0) 2021.12.02
[Java] 클래스 맴버와 인스턴스 맴버  (0) 2021.12.02
[Java] 클래스와 인스턴스 그리고 객체  (0) 2021.12.02