Web/⛺️ Java

오버로딩과 오버라이딩의 차이

키깡 2024. 8. 17.
728x90

오버로딩과 오버라이딩 차이

오버로딩은 동일한 메서드의 이름으로 서로 다른 파라미터와 리턴 타입의 메서드를 여러 개 정의 (= 메서드 여러 개 싣기)하는 것을 의미하고, 오버라이딩부모 클래스에 정의된 메서드를 자식 클래스에서 새롭게 정의 (= 메서드 재정의)하는 것을 의미.

오버로딩

class OverloadingTest {  
    public static void main(String[] args) {  
        OverloadingMethods om = new OverloadingMethods();  

        om.print(); // 오버로딩1
        System.out.println(om.print(3));  // 오버로딩2 찍히고 a.toString으로 3 찍히고 오버로딩3
        om.print("Hello!");  // 오버로딩3 찍히고 Hello! 프린트
        System.out.println(om.print(4, 5));  // 오버로딩4 찍히고 "4"+"5"인 "45" 찍힘
    }  
}  

class OverloadingMethods {  
    public void print() {  
        System.out.println("오버로딩1");  
    }  

    String print(Integer a) {  
        System.out.println("오버로딩2");  
        return a.toString();  
    }  

    void print(String a) {  
        System.out.println("오버로딩3");  
        System.out.println(a);  
    }  

    String print(Integer a, Integer b) {  
        System.out.println("오버로딩4");  
        return a.toString() + b.toString();  
    }  

}

결과물

오버로딩1
오버로딩2
3
오버로딩3
Hello!
오버로딩4
45

오버라이딩

public class Main {  
    public static void main(String[] args) {  
        Person person = new Person();  
        Child child = new Child();  
        Senior senior = new Senior();  

        person.cry();   //사람울음소리  
        child.cry();    //아이울음소리  
        senior.cry();   //노인울음소리  
    }  
}  

class Person {  
    void cry() {  
        System.out.println("사람울음소리");  
    }  
}  

class Child extends Person {  
    @Override  
    protected void cry() {  
        System.out.println("아이울음소리");  
    }  
}  

class Senior extends Person {  
    @Override  
    public void cry() {  
        System.out.println("노인울음소리");  
    }  
}

결과물

사람울음소리
아이울음소리
노인울음소리

오버로딩과 오버라이딩의 조건

오버로딩 (Overloading)

오버로딩은 동일한 이름의 메서드를 여러 개 정의하되, 서로 다른 매개변수를 가지도록 하는 것입니다. 메서드의 시그니처(이름과 매개변수 목록)가 다르면 동일한 이름의 메서드를 여러 번 정의할 수 있습니다.

오버로딩의 조건:

  1. 메서드 이름이 동일해야 함: 오버로딩은 같은 클래스 내에서 동일한 이름의 메서드를 여러 개 정의하는 것이므로, 메서드 이름이 같아야 합니다.
  2. 매개변수의 타입, 개수 또는 순서가 달라야 함: 매개변수 목록이 다르면 서로 다른 메서드로 인식됩니다. 즉, 매개변수의 타입, 개수, 또는 순서가 달라야 합니다.
  3. 반환 타입은 영향을 주지 않음: 반환 타입이 다르더라도 오버로딩에 영향을 미치지 않습니다. 오버로딩은 오로지 메서드 시그니처에 의해 결정됩니다.

오버라이딩 (Overriding)

오버라이딩은 상위 클래스(또는 부모 클래스)에 정의된 메서드를 하위 클래스(또는 자식 클래스)에서 재정의하는 것입니다. 상위 클래스의 메서드를 하위 클래스에서 동일한 이름, 동일한 매개변수로 다시 정의하여, 상위 클래스의 메서드를 덮어쓰게 됩니다.

오버라이딩의 조건:

  1. 메서드 이름, 매개변수 목록이 동일해야 함: 오버라이딩에서는 부모 클래스의 메서드와 동일한 이름과 동일한 매개변수 목록을 가져야 함
  2. 반환 타입이 동일하거나 하위 타입이어야 함: 반환 타입이 부모 클래스 메서드와 동일하거나, 부모 클래스의 반환 타입의 하위 타입이어야 함(공변 반환 타입).
  3. 접근 제어자가 더 제한적일 수 없음: 오버라이딩된 메서드는 부모 클래스 메서드의 접근 제어자보다 더 제한적인 접근 제어자를 가질 수 없음 예를 들어, 부모 클래스의 메서드가 public이라면, 오버라이딩하는 메서드도 public이어야 함 (default이면 public, protected, default 중 하나여야함.)
  4. 메서드가 final이나 static이면 오버라이딩할 수 없음: final로 선언된 메서드는 오버라이딩할 수 없음. 또한, static 메서드는 클래스에 종속되므로 오버라이딩이 아닌 숨김(hiding)의 개념이 적용됨.

오버로딩과 오버라이딩 장점

오버로딩(Overloading) 사용 이유 및 장점

  1. 코드의 가독성 및 편의성 향상:

    • 같은 기능을 하는 메서드들이 서로 다른 매개변수를 가질 때, 메서드 이름을 통일함으로써 코드를 읽고 이해하기 쉽게 만듦. 사용자는 메서드 이름을 외울 필요 없이, 동일한 이름으로 다양한 작업을 수행할 수 있음.
  2. 유연한 메서드 호출:

    • 동일한 이름의 메서드가 서로 다른 매개변수를 받을 수 있으므로, 다양한 상황에 맞춰 메서드를 호출할 수 있음. 예를 들어, print 메서드를 오버로딩하여 정수, 실수, 문자열 등을 출력할 수 있게 하면 상황에 따라 같은 이름의 메서드를 다양한 용도로 사용 가능
  3. 프로그램 유지보수 용이:

    • 오버로딩을 사용하면 관련된 기능을 한곳에서 관리할 수 있기 때문에, 코드의 유지보수성이 높아짐. 또한, 메서드의 이름이 일관되게 유지되므로 다른 개발자들이 코드를 이해하고 수정하기 쉬워짐.

오버라이딩(Overriding) 사용 이유 및 장점

  1. 다형성(Polymorphism) 구현:

    • 오버라이딩은 다형성의 핵심 요소
      • 다형성은 상위 클래스 타입의 객체가 하위 클래스 타입의 객체를 참조할 때, 실제로는 하위 클래스의 메서드를 호출하게 되는 특성을 말하며, 이를 통해 코드의 유연성을 높이고, 상속 구조에서 객체들의 행위를 일관되게 정의할 수 있음.
  2. 상위 클래스의 기능 확장:

    • 오버라이딩을 통해 상위 클래스에서 정의된 메서드의 기능을 하위 클래스에서 재정의하여 확장할 수 있는데, 이렇게 하면 하위 클래스는 상위 클래스의 기본 기능을 활용하면서도, 자신만의 특화된 동작을 추가가능.
  3. 코드의 재사용성 증대:

    • 상속받은 메서드를 그대로 사용하거나, 필요한 부분만 재정의하여 사용할 수 있으므로, 코드의 중복을 줄이고 재사용성을 높일 수 있음.
  4. 동적 바인딩 지원:

    • 오버라이딩을 통해 동적 바인딩(Dynamic Binding)이 가능해짐. 이는 실행 시간에 호출될 메서드가 결정되는 방식으로, 런타임에 객체의 실제 타입에 따라 호출되는 메서드가 달라지는 것. 이를 통해 유연하고 확장 가능한 시스템을 구축가능.

      결론

  • 오버로딩동일한 기능을 여러 방법으로 제공함으로써 코드의 가독성과 유연성을 높이는 데 기여.
  • 오버라이딩은 객체 지향 프로그래밍의 핵심인 다형성을 실현하고, 상속 관계에서 코드의 재사용성과 유연성을 극대화하는 데 중요한 역할.

댓글