본문 바로가기
Android/Java

[Java] 오버로딩과 오버라이딩: 객체 지향 프로그래밍에서의 메소드 다형성 이해하기

by quessr 2024. 4. 2.

 

이슈 수정을 위해 생성자 오버로딩을 사용할 필요가 생겼다. 이를 잊지 않기 위해 오버로딩에 대해 정리하려고 한다.
그 과정에서 오버라이딩과의 비교가 자주 나오기 때문에, 이 두 개념을 함께 정리하고자 한다.

 

오버로딩과 오버라이딩은 비록 서로 다른 목적과 작동 방식을 가지고 있지만, 

이들은 메소드 재정의의 중요한 형태로, 객체 지향 프로그래밍에서 메소드의 다형성을 구현하는 데 필수적인 기술이다.

 

오버로딩(Overloading)

오버로딩은 메서드 오버로딩과 생성자 오버로딩 두가지 형태로  나뉜다.

오버로딩은 같은 이름을 가진 메소드나 생성자를 여러 개 정의할 수 있게 하며, 매개변수의 타입, 개수, 순서에 따라 구분된다.
이를 통해 메소드나 생성자에 다양한 입력을 처리할 수 있는 유연성을 제공한다.

 

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

오버로딩은 같은 이름의 메소드를 클래스 내에 여러 정의하는 것을 의미한다.
하지만 메소드는 매개변수의 타입, 개수, 순서가 달라야 한.
오버로딩을 사용하는 주된 목적은 같은 기능을 하는 메소드에 대해 다양한 타입이나 개수의 매개변수를 제공할 있게 하여, 메소드 사용의 유연성을 높이는 것이다.

 

오버로딩의 조건:

  • 메소드의 이름이 같아야 한다.
  • 매개변수의 타입, 개수, 순서가 달라야 한다.
  • 반환 타입이나 접근 제어자는 오버로딩을 구분하는 사용되지 않는다.

메소드 오버로딩 예시:

class MathOperation {
    int add(int a, int b) {
        return a + b;
    }
    
    double add(double a, double b) {
        return a + b;
    }
    
    int add(int a, int b, int c) {
        return a + b + c;
    }
}

 

 

2. 생성자 오버로딩(Constructor Overloading)

생성자 오버로딩은 같은 클래스 내에서 여러 개의 생성자를 정의하되, 생성자가 다른 매개변수의 목록을 가지게 하는 것이다.
이를 통해 객체를 생성할 다양한 방법으로 초기화할 있다.
생성자 오버로딩은 객체를 다양한 상태로 쉽게 초기화하고, 객체 생성 과정에 유연성을 제공한다.

 

생성자 오버로딩 예시:

public class ItemTouchHelperCallback extends ItemTouchHelper.Callback {

    private ItemTouchHelperListener listener;

    private ItemTouchHelperExListener completionListener;

	// 첫 번째 생성자: ItemTouchHelperListener 타입의 인자 하나를 받습니다.
    public ItemTouchHelperCallback(ItemTouchHelperListener listener) {
        this.listener = listener;
    }

	// 두 번째 생성자: ItemTouchHelperListener 타입과 ItemTouchHelperExListener 타입의 인자 두 개를 받습니다.
    public ItemTouchHelperCallback(ItemTouchHelperListener listener, ItemTouchHelperExListener completionListener) {
        this.listener = listener;
        this.completionListener = completionListener;
    }

	.
	.
	.
	.

}

 

기존에 사용되던 ItemTouchHelperCallback 클래스의 생성자는 아이템 터치에 대한 기본적인 기능을 지원하고 있었다.
이후, 드래그 앤 드롭 후 추가적인 기능이 필요하게 되었고, 이를 위해 기존 생성자에 completionListener라는 새로운 인자를 추가할 필요성이 생겼다.
그러나 ItemTouchHelperCallback을 사용하는 기존 코드가 많았기 때문에, 모든 곳에서 새로운 인자를 추가하는 것은 큰 작업이 될 것이라는 문제가 있었다.

이 문제를 해결하기 위해, 생성자 오버로딩을 사용했다. 기존에는 ItemTouchHelperListener 타입의 인자 하나만 받던 ItemTouchHelperCallback 클래스에, 이제는 ItemTouchHelperListener와 ItemTouchHelperExListener 두 타입의 인자를 모두 받을 수 있는 새로운 생성자를 추가했다.
이렇게 함으로써, 드래그 앤 드롭 후의 추가적인 기능이 필요한 경우에는 새로운 생성자를 사용하여 두 인자를 모두 전달할 수 있게 되었다.

결과적으로, 생성자 오버로딩을 사용하는 방법을 통해 기존 코드를 크게 변경하지 않으면서도 새로운 기능을 효율적으로 추가할 있는 방법을 제공하게 되었다. 이는 기존의 코드를 유지하면서도 필요에 따라 추가 기능을 쉽게 확장할 있는 유연한 해결책이 되었.

 

 

오버라이딩 (Overriding)

오버라이딩은 상속 관계에 있는 부모 클래스로부터 상속받은 메소드를 자식 클래스에서 재정의하는 것을 의미한다.
오버라이딩을 통해 자식 클래스는 상속받은 메소드의 구현을 자신의 상황에 맞게 변경할 수 있다.
오버라이딩을 사용하는 주된 목적은 상속받은 메소드의 동작을 자식 클래스에 맞게 수정하여 다형성을 구현하는 것이다.

오버라이딩의 조건:

  • 메소드의 이름, 매개변수의 타입과 개수, 반환 타입이 부모 클래스의 메소드와 동일해야 한다.
  • 접근 제어자는 부모 클래스의 메소드보다 더 제한적이어서는 안 됩니다. 예를 들어, 부모 클래스의 메소드가 protected라면, 자식 클래스에서는 protected 또는 public으로 오버라이딩할 수 있다.
  • @Override 어노테이션을 사용하여 컴파일러에게 명시적으로 오버라이딩임을 알릴 수 있다.

오버라이딩 예시:

class Animal {
    void eat() {
        System.out.println("Animal is eating.");
    }
}

class Dog extends Animal {
    @Override
    void eat() {
        System.out.println("Dog is eating.");
    }
}



오버로딩(Overloading)과 오버라이딩(Overriding) 성립조건

구분  오버로딩  오버라이딩 
 메서드 이름 동일  동일 
 매개변수, 타입 다름  동일 
 리턴 타입 상관없음  동일 

 

출처: https://private.tistory.com/25 [오토봇팩토리:티스토리]


참고 :
https://www.tcpschool.com/java/java_usingMethod_overloading

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com

https://www.tcpschool.com/java/java_inheritance_overriding