JAVA

객체지향(오버로딩 (Overloading), 오버라이딩 (Overriding))

jki09871 2024. 7. 24. 13:00

자바에서 **오버로딩(Overloading)**과 **오버라이딩(Overriding)**은 메서드를 다루는 두 가지 중요한 개념입니다. 두 개념 모두 메서드와 관련이 있지만, 그 방식과 목적이 다릅니다. 다음은 각각에 대한 자세한 설명입니다.

 

오버로딩 (Overloading)

오버로딩은 같은 이름의 메서드를 여러 개 정의하는 기능입니다. 메서드 오버로딩을 통해 같은 이름의 메서드를 다양한 방식으로 사용할 수 있게 됩니다. 주로 매개변수의 개수나 타입에 따라 메서드를 구분합니다.

오버로딩의 규칙

  1. 메서드 이름이 동일해야 함:
    • 같은 이름의 메서드를 정의합니다.
  2. 매개변수의 리스트가 달라야 함:
    • 매개변수의 개수 또는 타입이 달라야 합니다.
    • 반환 타입만으로는 오버로딩을 구분할 수 없습니다.
  3. 접근 제어자와 반환 타입:
    • 접근 제어자와 반환 타입은 메서드 오버로딩에 영향을 미치지 않습니다.
    • 즉, 반환 타입이 다르더라도 매개변수가 같으면 오버로딩이 아니며 컴파일 오류가 발생합니다.

예제

public class Printer {
    
    // 정수 출력 메서드
    public void print(int number) {
        System.out.println("Printing integer: " + number);
    }
    
    // 문자열 출력 메서드
    public void print(String text) {
        System.out.println("Printing string: " + text);
    }
    
    // 두 정수의 합 출력 메서드
    public void print(int num1, int num2) {
        System.out.println("Printing sum: " + (num1 + num2));
    }
    
    // 실수 출력 메서드
    public void print(double number) {
        System.out.println("Printing double: " + number);
    }
}

public class Main {
    public static void main(String[] args) {
        Printer printer = new Printer();
        printer.print(10);             // Printing integer: 10
        printer.print("Hello");        // Printing string: Hello
        printer.print(5, 10);          // Printing sum: 15
        printer.print(5.5);            // Printing double: 5.5
    }
}

이 예제에서는 print라는 이름의 메서드를 여러 번 정의하고, 매개변수의 타입과 개수에 따라 각각 다른 동작을 수행합니다.

 

오버라이딩 (Overriding)

오버라이딩은 상속을 통해 부모 클래스의 메서드를 자식 클래스에서 재정의하는 기능입니다. 오버라이딩은 자식 클래스가 부모 클래스의 메서드를 새롭게 구현하여 상속받은 메서드의 동작을 변경하거나 확장할 때 사용됩니다.

오버라이딩의 규칙

  1. 메서드 이름, 반환 타입, 매개변수 리스트가 동일해야 함:
    • 부모 클래스의 메서드와 동일한 이름, 반환 타입, 매개변수 리스트를 가져야 합니다.
  2. 접근 제어자:
    • 자식 클래스에서 오버라이딩하는 메서드는 부모 클래스의 메서드보다 같거나 더 넓은 접근 제어자를 가질 수 있습니다.
    • 예를 들어, 부모 클래스에서 protected로 선언된 메서드는 자식 클래스에서 protected 또는 public으로 오버라이딩할 수 있습니다.
  3. 부모 클래스 메서드가 final, static, private일 경우 오버라이딩 불가:
    • final: 메서드를 상속받아 오버라이딩할 수 없으며, 메서드가 상수처럼 동작합니다.
    • static: 정적 메서드는 오버라이딩이 아니라 메서드 숨기기(메서드 히든)가 발생합니다.
    • private: 상속되지 않기 때문에 오버라이딩할 수 없습니다.

예제

// 부모 클래스
public class Animal {
    // 부모 클래스의 메서드
    public void makeSound() {
        System.out.println("Some generic animal sound");
    }
}

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

// 또 다른 자식 클래스
public class Cat extends Animal {
    // 부모 클래스의 메서드를 오버라이딩
    @Override
    public void makeSound() {
        System.out.println("Meow");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal myAnimal = new Animal();
        myAnimal.makeSound();  // Some generic animal sound

        Dog myDog = new Dog();
        myDog.makeSound();     // Bark

        Cat myCat = new Cat();
        myCat.makeSound();     // Meow

        // 다형성을 활용한 오버라이딩
        Animal myPet = new Dog();
        myPet.makeSound();     // Bark (Dog의 makeSound 호출)
    }
}

이 예제에서는 Animal 클래스의 makeSound 메서드를 Dog와 Cat 클래스에서 오버라이딩하여 각각 다른 동작을 구현하고 있습니다. 또한 다형성을 이용하여 Animal 타입의 변수에 Dog 객체를 할당하고, Dog의 makeSound 메서드가 호출됩니다.

요약

  • 오버로딩:
    • 정의: 같은 이름의 메서드를 다양한 매개변수 리스트로 정의.
    • 목적: 메서드의 기능을 다양화하여 사용.
    • 규칙: 메서드 이름은 같지만, 매개변수의 타입이나 개수가 달라야 함.
  • 오버라이딩:
    • 정의: 상속받은 클래스에서 부모 클래스의 메서드를 재정의.
    • 목적: 자식 클래스에서 부모 클래스의 메서드를 새롭게 구현하거나 변경.
    • 규칙: 메서드 이름, 반환 타입, 매개변수 리스트가 동일해야 하고, 접근 제어자는 같거나 더 넓은 범위여야 함.

오버로딩과 오버라이딩은 자바에서 코드의 재사용성을 높이고, 유연한 객체 지향 프로그래밍을 가능하게 합니다.