[개발] 지식/Java

오버라이딩(Overriding)과 오버로딩(Overloading)

하하미아 2023. 6. 13. 06:10

오버로딩 (Overloading)

조건

  • 부모 클래스의 메서드를 자식 클래스에서 재정의
  • 메서드의 이름이 같고, 매개변수(개수, 타입)이 달라야 한다.
  • 리턴 타입과 접근제어자는 상관없다.

예시

class Calculator {
    public int add(int a, int b) {
        return a + b;
    }

    public double add(double a, double b) {
        return a + b;
    }

    public int add(int a, int b, int c) {
        return a + b + c;
    }
}

public class Main {
    public static void main(String[] args) {
        Calculator calculator = new Calculator();

        System.out.println(calculator.add(1, 2));           // int add(int a, int b) 호출, 결과: 3
        System.out.println(calculator.add(1.5, 2.5));       // double add(double a, double b) 호출, 결과: 4.0
        System.out.println(calculator.add(1, 2, 3));        // int add(int a, int b, int c) 호출, 결과: 6
    }
}

사용하는 이유

  1. 같은 기능을 하는 메소드를 하나의 이름으로 사용 가능
  2. 메소드의 이름을 절약

오버라이딩(overriding)

부모 클래스로부터 상속받은 메소드를 자식 클래스에서 재정의

조건

  • 메소드의 이름, 매개변수, 리턴타입이 동일해야 한다.
  • 접근제어자는 부모 클레스보다 넓게 설정해야 한다.
    • 부모 클래스 메서드가 default인 경우, 자식 클래스 메서드는 default, protected, public 사용 가능
  • 예외(Exception)은 부모 클래스의 메소드보다 많이 선언할 수 없다.
  • static 메소드를 인스턴스의 메소드 또는 그 반대로 바꿀 수 없다.
    • 부모 클래스의 static 메소드를 자식 클래스에서 동일 이름으로 정의하는 경우, 재정의가 아니라 새로 정의하는 것

예시

class Animal {
    public void makeSound() {
        System.out.println("동물이 소리를 낸다.");
    }
}

class Dog extends Animal {
    @Override
    public void makeSound() {
        System.out.println("멍멍!");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal animal = new Dog();
        animal.makeSound();     // Dog 클래스에서 오버라이딩한 makeSound() 메서드 호출, 결과: "멍멍!"
    }
}

Reference

[Java]오버로딩 & 오버라이딩(Overloading & Overriding)