Java

[Java] 메서드 오버로딩, 메서드 오버라이딩 (Method Overloading, Method Overriding)

공대생안씨 2023. 12. 10. 20:14

1. 메서드 오버로딩 (Method Overloading)

  • 자바에서 같은 이름의 메서드를 여러개 정의하는 것을 오버로딩 (Overloading) 이라고 함
  • 즉, 이름이 같고 매개변수가 다른 메서드를 여러 개 정의하는 것을 의미

 

1-1. 메서드 시그니처 (Method Signature)

  • 메서드를 구분할 수 있는 식별자
  • 메서드 이름, 매개변수 타입, 매개변수 순서 등으로 이루어짐

메서드 시그니쳐 = 메서드 이름 + 매개변수 타입과 순서

 

1-2. 오버로딩 규칙

오버로딩 규칙 : "메서드 시그니처가 달라야 한다."

 

1-3. 오버로딩 예시

  • 메서드의 이름이 같고, 매개변수의 개수가 달라야 한다.
// 매개변수의 개수가 다른 경우
public class Main {
    public static void main(String[] args) {

        System.out.println("두 수의 합 = " + sum(1,2));
        System.out.println("세 수의 합 = " + sum(1,2,3));
    }
    
    public static int sum(int a, int b){
        return a+b;
    }
    
    public static int sum(int a, int b, int c){
        return a+b+c;
    }
}

 

  • 메서드의 이름이 같고, 매개변수의 타입이나 순서가 달라야 한다.
// 매개변수의 타입이 다른 경우
public class Main {
    public static void main(String[] args) {

        System.out.println("정수 2개의 합 = " + sum(1,2));
        System.out.println("실수 2개의 합 = " + sum(1.0,2.5));
    }

    public static int sum(int a, int b){
        return a+b;
    }

    public static double sum(double a, double b){
        return a+b;
    }
}
// 매개변수의 타입 순서가 다른 경우
public class Main {
    public static void main(String[] args) {

        System.out.println("정수와 실수의 합 = " + sum(1,2.1));
        System.out.println("실수와 정수의 합 = " + sum(1.5,2));
    }

    public static double sum(int a, double b){
        return a+b;
    }

    public static double sum(double a, int b){
        return a+b;
    }
}

 

1-4. 오버로딩 실패

  • 메서드 시그니처 : 메서드의 반환 타입은 포함하지 X
  • 따라서 메서드 반환 타입만 다른 경우는 오버로딩 실패!

 

  •  메서드의 반환 타입만 다른 경우
// 오버로딩에 실패하여 에러가 발생한다.

public static double sum(int a, int b){
        return a+b;
}

public static int sum(int a, int b){
        return a+b;
}

 

 

2. 메서드 오버라이딩 (Method Overriding)

  • 상속받은 부모 클래스의 메서드를 자식 클래스에서 동일한 메서드 시그니처로 재정의 하는 것을 의미

 

2-0. @Override

  • 옵션임, 없어도 잘 동작함
  • 상위 클래스의 메서드를 오버라이드 했음을 의미 하는 애노테이션
  • 컴파일러가 이 애노테이션을 보고 정확히 오버라이드 되었는지 검사함 ⇒ 잘못되면 컴파일 에러
  • 오버라이딩 시 실수하는 경우를 방지해줌!
// 컴파일 에러
// java: method does not override or implement a method from a supertype

 

2-1. 메서드 오버라이딩 조건

  • 메서드 시그니처가 부모 클래스의 메서드와 동일해야 함
  • 접근제어자는 부모 클래스의 메서드와 같거나 더 넓은 범위여야 함
  • 반환 자료형은 부모 클래스의 메서드와 같거나 하위 자료형이어야 함

 

2-2. 메서드 오버라이딩 예시

  • Car 클래스 : 부모 클래스
public class Car {

    public void move() {
        System.out.println("차를 이동합니다.");
    }
}

 

  • ElectricCar 클래스 : Car를 상속받은 자식 클래스
public class ElectricCar extends Car{

    public void charge() {
        System.out.println("차를 충전합니다.");
    }

    // 메서드 오버라이딩
    @Override
    public void move() {
        System.out.println("전기차를 이동합니다!!");
    }
}
  • 부모 클래스인 Car 클래스에 존재한 move() 메서드를 오버라이딩 함
  • Car의 move()와 ElectricCar의 move()는 동일한 메서드 시그니처를 가짐
  • 상속받은 부모 클래스의 메서드 중 자식 클래스에 맞춰서 메서드를 수정한 것!

 

  • GasCar 클래스 : Car를 상속받은 자식 클래스
public class GasCar extends Car{

    public void fillup() {
        System.out.println("기름을 주유합니다.");
    }
}

 

  • CarMain 클래스
public class CarMain {

    public static void main(String[] args) {

        ElectricCar electricCar = new ElectricCar();
        GasCar gasCar = new GasCar();

        electricCar.move();
        electricCar.charge();

        gasCar.move();
        gasCar.fillup();
    }
}

 

  • 실행 결과
전기차를 이동합니다!!
차를 충전합니다.
차를 이동합니다.
기름을 주유합니다.

 

📌 메서드 오버라이딩 - 호출

1. 본인 타입에서 메서드 찾음
2. 없으면 부모 타입에서 메서드 찾음

 

3. 오버로딩 vs 오버라이딩

오버로딩 : 동일 클래스에서 이름이 동일하고 메서드 시그니처가 다른 여러 개의 메서드를 정의하는 것
오버라이딩 : 자식 클래스에서 부모 클래스의 메서드를 동일한 메서드 시그니처로 재정의 하는 것