Java - Overloading vs Overriding(오버로딩 vs 오버라이딩)

청포도봉봉이·2023년 11월 7일
1

java

목록 보기
2/20
post-thumbnail

오버로딩(Overloading)과 오버라이딩(Overriding)의 차이점에 대해 설명해주세요.

오버로딩


오버로딩(Overloading)은 한 클래스 내에서 같은 이름으로 정의된 메서드가 여러개 있어도 매개변수의 개수, 타입, 순서가 다르다면 이름이 같게 해도 되는 기술이다.

public class Overloading {
    public static void main(String args[]) {
        print();
        print("Hello!");
        print(10, 20);
    }

    public static void print() {
        System.out.println("print!");
    }

    public static void print(String text) {
        System.out.println(text);
    }

    public static void print(int a, int b) {
        System.out.println(a);
        System.out.println(b);
    }
}
print!
Hello!
10
20

위의 코드를 살펴보면 동일한 메서드들이 정의되었지만 매개변수의 개수, 순서들이 다른걸 확인할 수 있다.

정리


  • 오버로딩은 같은 이름의 메서드를 여러 개 가지면서 매개변수의 유형과 개수를 다르게 하는 기술이다.
  • 오버로딩은 같은 클래스 내에서 이루어진다.
  • 오버로딩은 메서드의 반환 타입으로 구분하는데 영향을 주진 않는다.

주의할 점


  • 매개변수의 개수나 타입, 순서가 달라져야 한다. 동일한 매개변수를 가지는 메서드를 생성하면 컴파일 에러가 발생한다.



오버라이딩


오버라이딩(OverRiding)은 부모에서 상속 받은 메서드를 재정의하는 것으로 매개변수, 반환타입이 같아야하는 기술이다. 즉 상위 클래스의 메서드와 동일한 이름, 매개변수를 가지면 동작 방식을 하위 클래스에서 정할 수 있다.

public class Parent {
    public void print() {
        System.out.println("Parent!");
    }

    public void plus(int a, int b) {
        System.out.println(a + b);
    }

    public void multiple(int a, int b, int c) {
        System.out.println(a * b * c);
    }

    public void division(int a, int b, String str) {
        System.out.println(str + " " + (a / b));
    }

}
public class Child extends Parent{
    @Override
    public void print() {
        System.out.println("Child!");
    }

    @Override
    public void plus(int a, int b) {
        System.out.println(b + a);
    }

    @Override
    public void multiple(int a, int b, int c) {
        System.out.println(c * b * a);
    }

    @Override
    public void division(int a, int b, String str) {
        System.out.println((b / a) + " " + str);
    }
}
public class Overriding {
    public static void main(String args[]) {
        Parent parent = new Parent();
        parent.print();
        parent.plus(10, 20);
        parent.multiple(10, 20, 30);
        parent.division(10, 20, "부모 메서드에서 나누기");

        System.out.println();

        Child child = new Child();
        child.print();
        child.plus(1, 2);
        child.multiple(1, 2, 3);
        child.division(1, 2, "자식 메서드에서 나누기");
    }
}
Parent!
30
6000
부모 메서드에서 나누기 0

Child!
3
6
2 자식 메서드에서 나누기

위의 코드를 살펴보면 Child 클래스에서 Parent 를 상속받아 하위 클래스에도 상위 클래스의 메서드와 동일한 이름의 메서드가 존재하는 걸 확인할 수 있다. 메서드의 매개변수의 개수, 순서, 반환 타입이 동일하다.
하지만 메서드 안의 내용은 재정의되어 있다.

정리


  • 오버라이딩은 상위 클래스가 가지고 있는 메서드를 상속 받아 재정의하여 사용하는 기술이다.
  • 오버라이딩은 상속 관계에서 이루어진다.
  • 메서드의 반환 타입, 이름, 매개변수가 일치해야 한다.

주의할 점


  • 상위 클래스의 메서드를 재정의하려면 접근 범위를 좁게할 수 없다. 예를 들어 상위 클래스의 메서드가 public으로 선언되어 있다면 재정의하는 클래스도 public이어야 한다. 또한 상위 클래스의 메서드가 final이나 private로 선언되었다면 하위 클래스에서 재정의할 수 없다.
profile
서버 백엔드 개발자

0개의 댓글