오버라이딩 (Overriding)

멍빼미·2024년 2월 29일

오버라이딩 (Overriding)

오버라이딩은 상속받은 클래스의 메서드의 내용만 재정의하는 것이다.

오버라이딩의 조건

  1. 메서드의 선언부가 조상 클래스의 메서드와 일치해야 한다.
    • 선언부
    반환타입 메서드 이름(매개변수 선언) 형태다.
    예시 int add (int x, int y) {}
  2. 접근 제어자는 조상 클래스의 메서드보다 좁은 범위로 변경 불가하다.
  3. 조상 클래스의 메서드보다 많은 수의 예외 선언이 불가하다.

잘못된 코드

class Add {

    int a, b;

    public Add(int a, int b) {
        this.a = a;
        this.b = b;
    }

    int getResult() {
        return a + b;
    }

}


class Multi extends Add{
    int c;

    public Multi(int a,int b,int c) {
        super(a,b);
        this.c = c;
    }

    @Override
    long getResult() {
        return a+b+c;
    }
}

메서드의 선언부가 같아야 하지만 선언부의 타입이 int와 long으로 달라
아래와 같은 컴파일 에러가 났다.
java: getResult() in Multi cannot override getResult() in Add return type long is not compatible with int

올바른 예시

class Add {

    int a, b;

    public Add(int a, int b) {
        this.a = a;
        this.b = b;
    }

    void result() {
        System.out.println("두 수의 덧셈 : " + (a + b));
    }
}


class Multi extends Add {
    int c;

    public Multi(int a, int b, int c) {
        super(a, b);
        this.c = c;
    }

    @Override
    void result() {
        System.out.println("세 수의 덧셈 : " + (a + b + c));;
    }
}

선언부가 같고 안의 내용물만 변경되어야 오버라이딩이 된다.

전체 코드

public class Main {
    public static void main(String[] args) {

        Add add = new Add(1,2);
        Multi multi = new Multi(1,2,3);

        add.result();
        multi.result();
    }
}

class Add {

    int a, b;

    public Add(int a, int b) {
        this.a = a;
        this.b = b;
    }

    void result() {
        System.out.println("두 수의 덧셈 : " + (a + b));
    }
}


class Multi extends Add {
    int c;

    public Multi(int a, int b, int c) {
        super(a, b);
        this.c = c;
    }

    @Override
    void result() {
        System.out.println("세 수의 덧셈 : " + (a + b + c));;
    }
}

결과 값

두 수의 덧셈 : 3
세 수의 덧셈 : 6

헷갈리지 말 것

  • 오버로딩은 매개변수 개수 혹은 타입을 바꿔 새로운 메서드를 정의 하는 것이다.
  • 오버라이딩은 상속받은 메서드를 내용만 재정의 하는 것이다.
profile
멍한 올빼미

0개의 댓글