Java Spring

8. Overriding & Overloading

pearl.k 2023. 4. 3. 15:08

1. Overriding

 상속은 상위 클래스의 기능을 하위 클래스로 물려주지만, 하위 클래스에서 상속받은 기능을 항상 그대로 쓴다면 불편할 것이다. 하위 클래스가 상위 클래스에게 상속받은 기능을 수정할 수 있는 방법을 바로 메소드 오버라이딩(Overriding)이라고 한다.

 아래 예시 코드의 결과를 보면, 상위 클래스의 sum( ) 함수가 아니라, 하위 클래스의 sum( ) 함수가 실행된 것을 볼 수 있다.

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 void substract() {
        System.out.println(this.left - this.right);
    }
}

class Main {

    public static void main(String[] args) {
        SubstractionableCalculator c1 = new SubstractionableCalculator();
        c1.setOprands(10, 20);
        c1.sum();
        c1.avg();
        c1.substract();
    }
}

// print 결과
// 실행 결과는 30 입니다.
// 15
// 10

 하위 클래스에서 상위 클래스와 동일한 메소드를 정의하면, 상위 클래스로부터 상속 받은 기본 동작을 변경하는 효과가 있다. 또한, 기본 동작과 다른 "예외적인 동작"의 우선순위가 더 높다. // 출력 결과를 보면 하위 클래스의 println( ) 문이 실행된 것을 볼 수 있다.

Overriding 할 때 주의점

  • 상위 클래스와 하위 클래스의 해당하는 메소드의 리턴 타입이 같아야 한다. (ex. avg( ) 함수의 리턴 타입이 상위: void != 하위: int 처럼 서로 다를 경우 에러가 발생한다.)
  • 메소드의 이름 / 메소드의 매개변수 (개수, 데이터 타입, 순서) / 메소드의 리턴 타입 => 이 모든게 같아야 한다.
    • 이렇게 메소드의 형태를 정의하는 사항들을 메소드의 서명 (signature)라고 한다.   
    • 메소드의 서명이 달라 오류가 발생할 때, 이를 올바르게 고쳐야 한다.
    • 위 참고 코드에서 avg( )를 int로 리턴하고 싶을 때, 아래처럼 코드를 수정하면 int 타입으로 return이 가능하다.
class Calculator {
    int left, right;

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

class SubstractionableCalculator extends Calculator {

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

}

 

2. Overloading

 이름이 같지만 서명(signature)이 다른 메소드를 중복으로 선언할 수 있다. 이를 메소드 오버로딩(Overloading) 이라고 한다.

 예를 들어 sum( ) 함수에서, 기존 함수는 매개변수 2개의 sum을 계산한다. 그러나 매개변수가 3개~4개 일 때는 어떻게 계산할까? 이 경우에는 메소드 오버로딩을 통해 원하는 매개변수 개수를 추가하면 된다.

 매개변수가 다르면 이름은 같지만 서로 다른 메소드가 된다. 그러나 리턴 타입에 주의해야 하는데, 매개변수가 같더라도 리턴 타입이 다르면 오류가 발생하기 때문이다. 기존 클래스 안에서 뿐만 아니라 상속에서도 Overloading을 사용할 수 있다.

class Calculator{
    int left, right;
    int third = 0;

    public void setOprands(int left, int right){
        System.out.println("setOprands(int left, int right)");
        this.left = left;
        this.right = right;
    }

    public void setOprands(int left, int right, int third){
        System.out.println("setOprands(int left, int right, int third)");
        this.left = left;
        this.right = right;
        this.third = third;
    }

    public void sum(){
        System.out.println(this.left+this.right+this.third);
    }

    public void avg(){
        System.out.println((this.left+this.right+this.third)/3);
    }
}

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

[Spring] 스프링 입문 - 스프링 부트, 웹 MVC, DB 접근 기술  (0) 2023.05.15
9. 접근 제어자  (0) 2023.04.03
7. 상속과 생성자  (0) 2023.04.03
6. 객체 지향 프로그래밍  (0) 2023.03.27
5. 메소드, 입출력  (0) 2023.03.27