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

artp·2025년 1월 22일
0

java

목록 보기
12/32
post-thumbnail

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

오버로딩과 오버라이딩은 객체지향 프로그래밍의 다형성을 구현하는 방법 중 하나입니다. 하지만 동작 방식, 목적, 사용되는 위치가 다릅니다.

다형성(polymorphism)이란 하나의 객체가 여러 가지 타입을 가질 수 있는 것을 의미합니다.
이를 통해 같은 타입의 변수로 다양한 객체를 참조하거나, 동일한 메서드 호출로 다양한 동작을 실행할 수 있습니다.

1. 오버로딩 (Overloading)

오버로딩은 하나의 클래스 내에서 이름이 같은 메서드를 여러 개 정의하는 것을 의미합니다. 메서드의 이름은 동일하지만, 매개변수의 개수, 타입, 또는 순서가 달라야 합니다.

오버로딩의 조건

  • 메서드 이름이 같아야 합니다.
  • 매개변수의 개수 또는 타입이 달라야 합니다.
  • 반환 타입은 오버로딩을 구분하는 데 영향을 주지 않습니다.

오버로딩의 목적

  • 동일한 기능을 수행하지만, 다양한 종류의 매개변수를 처리해야 할 때 사용됩니다.
  • 메서드 이름을 하나로 통일하여 코드의 가독성과 일관성을 높일 수 있습니다.
  • 컴파일 시점에 어떤 메서드가 호출될지 결정되는 정적 다형성(Static Polymorphism)의 한 예입니다.

예시 코드

class Calculator {
    // 정수 두 개를 더하는 메서드
    int add(int a, int b) {
        return a + b;
    }

    // 정수 세 개를 더하는 메서드 (오버로딩)
    int add(int a, int b, int c) {
        return a + b + c;
    }

    // 실수 두 개를 더하는 메서드 (오버로딩)
    double add(double a, double b) {
        return a + b;
    }
}

public class Main {
    public static void main(String[] args) {
        Calculator calc = new Calculator();
        System.out.println("정수 2개 덧셈: " + calc.add(10, 20));
        System.out.println("정수 3개 덧셈: " + calc.add(10, 20, 30));
        System.out.println("실수 2개 덧셈: " + calc.add(10.5, 20.5));
    }
}

2. 오버라이딩 (Overriding)

오버라이딩은 상속 관계에 있는 자식 클래스가 부모 클래스로부터 상속받은 메서드를 재정의하는 것을 의미합니다. 즉, 부모의 메서드를 자식 클래스의 상황에 맞게 변경하여 사용하는 것입니다.

오버라이딩의 조건

  • 부모 클래스의 메서드와 이름, 반환 타입, 매개변수 목록이 모두 같아야 합니다.
  • 접근 제어자는 부모 클래스의 메서드보다 좁은 범위로 변경할 수 없습니다. (예: protected -> public은 가능, public -> private은 불가능)
  • @Override 어노테이션을 사용하여 컴파일러가 오버라이딩 규칙을 올바르게 따랐는지 검사하도록 권장됩니다.

오버라이딩의 목적

  • 부모 클래스의 기능을 자식 클래스에서 확장하거나 변경할 필요가 있을 때 사용됩니다.
  • 런타임 시점에 호출될 메서드가 결정되는 동적 다형성(Dynamic Polymorphism)의 핵심 요소입니다.

예시 코드

// 부모 클래스
class Animal {
    void makeSound() {
        System.out.println("동물이 소리를 냅니다.");
    }
}

// 자식 클래스
class Dog extends Animal {
    @Override // makeSound() 메서드를 오버라이딩
    void makeSound() {
        System.out.println("멍멍!");
    }
}

// 자식 클래스
class Cat extends Animal {
    @Override // makeSound() 메서드를 오버라이딩
    void makeSound() {
        System.out.println("야옹~");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal myDog = new Dog();
        Animal myCat = new Cat();

        myDog.makeSound(); // "멍멍!" 출력
        myCat.makeSound(); // "야옹~" 출력
    }
}

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

구분오버로딩 (Overloading)오버라이딩 (Overriding)
정의같은 이름, 다른 매개변수를 가진 새로운 메서드 추가상속받은 메서드의 내용을 재정의
위치같은 클래스 내상속 관계의 부모-자식 클래스 간
메서드 시그니처메서드 이름은 같지만, 매개변수 목록은 달라야 함메서드 이름, 매개변수, 반환 타입이 모두 같아야 함
적용 시점컴파일 시점 (Static Binding)런타임 시점 (Dynamic Binding)
핵심새로운 메서드를 만드는 것기존 메서드를 재정의하는 것
profile
donggyun_ee

0개의 댓글