[Java] 오버로딩과 오버라이딩

RUreadyYe·2022년 12월 5일
0

자바 기초 이론

목록 보기
4/7

오버로딩과 오버라이딩

오버라이딩이란 ?

부모 클래스로부터 상속받은 메서드의 내용을 변경하는 것으로

상속받은 메서드를 그대로 사용하기도 하지만,

자식 클래스 자신에 맞게 변경해야하는 경우! 부모 메서드를 오버라이딩 한다.

class Point() {
  int x;
  int y;

  String getLocation() {
    return "x: " + x + ", y: " + y;
  }
}

class Point3D extends Point {
    int z;
    
    String getLocation() {
        return "x: " + x + ", y: " + y + ", z: " + z;
    }
}

내용을 바꾸는 것이라면 메서드를 새로 생성하는 것과 오버라이딩의 차이가 뭐지 ?

Point 클래스를 사용하던 사람은 새로 작성된 Point3D 클래스가 Point 클래스의 자식이므로
Point3D 클래스의 인스턴스에 대해서 getLocation()을 호출하면 Point 클래스의 getLocation()이 그랬듯
점의 좌표를 문자열로 얻을 수 있을 것이라고 기대할 것이다.
그렇기 때문에 새로운 매서드를 제공하는 것보다 오버라이딩을 하는 것이 바른 선택이다.

오버라이딩의 조건

자식 클래스에서 오버라이딩하는 메서드는 부모 클래스의 메서드
1. 이름이 같아야 한다.
2. 매개변수가 같아야 한다.
3. 반환타입이 같아야 한다.

부모 클래스의 메서드를 자식 클래스에서 오버라이딩할 때

  • 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
    • public > protected > (default) > private
  • 예외는 부모 클래스의 메서드보다 많이 선언할 수 없다.
    • 단순히 선언된 예외의 개수뿐만이 아니라 thorws Exception과 같이 부모 클래스의 예외보다 많은 예외를 던질 수 있게 정의한 것은 잘못된 오버라이딩이다.

오버로딩이란 ?

한 클래스 내에서 같은 이름의 메서드를 여러개 정의하는 것으로

메서드도 변수처럼 같은 클래스 내에서 서로 구별할 수 있게 각기 다른 이름을 가져야하지만,

자바에서는 매개변수의 개수나 타입이 다르면, 같은 이름을 사용해서 메서드를 재정의 할 수 있다.

이것을 메서드 오버로딩이라고 한다.

public class JavaChapter {

    int add(int a, int b) { return a+b; }
    long add(long a, long b) { return a+b; }
    long add(int[] a) {
        long sum = 0;
        for (int b : a) {
            sum += b;
        }
        return sum;
    }

    public static void main(String[] args) {
        JavaChapter chapter = new JavaChapter();
        System.out.println(chapter.add(25, 25));
        System.out.println(chapter.add(1147483647, 10000000000L));
        System.out.println(chapter.add(new int[] {1,2,3,4,5,6}));

    }
}

오버로딩의 조건

  1. 메서드 이름이 같아야 한다.
  2. 매개변수의 개수 또는 타입이 달라야 한다.

위의 조건을 만족시키지 못하는 메서드는 중복 정의로 간주되어 컴파일 시 에러가 난다.

오버로딩의 장점

자바의 println() 메서드도 각기 다른 타입의 매개변수로 오버로딩 되어있다.

이럴 경우 모두 근본적으로는 같은 기능을 하는 메서드들이지만,

서로 다른 이름을 가져야 하기 때문에 이름을 짓기도 어렵고, 사용자 쪽에서는 이름을 모두 구분해서 기억해야하기 때문에 서로 부담이 된다.

이처럼 오버로딩은 작성자와 사용자에게 모두 편리함을 준다.

* 오버로딩 : 기존에 없는 새로운 메서드를 정의하는 것(new) 

* 오버라이딩 : 상속받은 메서드의 내용을 변경하는 것(change, modify)
profile
기억력이 짧은 나를 위한 기록 🍀

0개의 댓글