오버로딩과 오버라이딩

Dev.Dana·2024년 11월 23일

TIL

목록 보기
5/6

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

1. 오버로딩(Overloading)

  • 같은 클래스 내에서 메서드 이름은 동일하지만, 매개변수의 타입, 개수, 순서를 다르게 정의하여 메서드를 재사용하는 방식.
  • 컴파일 시점에서 호출할 메서드가 결정되므로 정적 바인딩(Static Binding)에 해당.

특징

  1. 메서드 이름은 동일.
  2. 매개변수의 타입, 개수, 순서가 달라야 함.
  3. 리턴 타입은 오버로딩과 관계가 없음.
  4. 컴파일러가 메서드를 호출하기 전에 매개변수 시그니처를 기준으로 호출할 메서드를 결정.

예제 코드

class OverloadingExample {
    void print(String message) {
        System.out.println("Message: " + message);
    }

    void print(String message, int count) {
        for (int i = 0; i < count; i++) {
            System.out.println("Message: " + message);
        }
    }

    void print(int number) {
        System.out.println("Number: " + number);
    }
}

public class Main {
    public static void main(String[] args) {
        OverloadingExample example = new OverloadingExample();
        example.print("Hello");           // 매개변수 1개
        example.print("Hi", 3);          // 매개변수 2개
        example.print(42);               // 매개변수 타입이 다름
    }
}

2. 오버라이딩(Overriding)

  • 상속 관계에서 자식 클래스가 부모 클래스의 메서드를 재정의하는 방식
  • 런타임 시점에 호출할 메서드가 결정되므로 동적 바인딩(Dynamic Binding)에 해당

특징

  1. 부모 클래스의 메서드와 이름, 매개변수 시그니처, 리턴 타입이 동일해야 함
  2. 접근 제어자는 부모 메서드와 같거나 더 넓은 범위를 가져야 함
  3. @Override 어노테이션을 사용해 재정의를 명시할 수 있음
  4. 부모 클래스의 메서드를 호출하려면 super 키워드를 사용

예제코드

class Parent {
    void show() {
        System.out.println("Parent class method");
    }
}

class Child extends Parent {
    @Override
    void show() {
        System.out.println("Child class method");
    }
}

public class Main {
    public static void main(String[] args) {
        Parent parent = new Parent();
        Parent child = new Child();  // 업캐스팅

        parent.show();  // Parent class method
        child.show();   // Child class method (동적 바인딩)
    }
}

3. 주요 사용 사례

오버로딩 사용 사례

  • 메서드의 이름은 유지하면서 다양한 매개변수 조합에 대응할 때 사용.
  • 예시 : 입력값에 따라 다른 처리를 해야 하는 경우
void add(int a, int b);
void add(double a, double b);
void add(int a, int b, int c);

오버라이딩 사용 사례

  • 부모 클래스의 기본 동작을 재정의하고 싶을 때 사용.
  • 예시 : 다형성을 활용해 부모 메서드를 호출하지만 자식 클래스에서 서로 다른 동작을 구현할 때
class Animal {
    void sound() {
        System.out.println("Animal makes a sound");
    }
}

class Dog extends Animal {
    @Override
    void sound() {
        System.out.println("Dog barks");
    }
}
profile
어제의 나보단 나은 오늘의 내가 되기를

0개의 댓글