Java에서 메소드 오버로딩과 메소드 오버라이딩의 차이점은 다음과 같습니다.
메소드 오버로딩 | 메소드 재정의 |
|---|---|
| 메소드 오버로딩은 컴파일 타임 다형성입니다. | 메서드 재정의는 런타임 다형성입니다. |
| 메소드 오버로딩은 프로그램의 가독성을 높이는 데 도움이 됩니다. | 메서드 재정의는 부모 클래스나 슈퍼클래스에서 이미 제공한 메서드의 특정 구현을 부여하는 데 사용됩니다. |
| 수업 내에서 발생합니다. | 이는 상속 관계가 있는 두 클래스에서 수행됩니다. |
| 메서드 오버로드에는 상속이 필요할 수도 있고 필요하지 않을 수도 있습니다. | 메서드 재정의에는 항상 상속이 필요합니다. |
| 메서드 오버로딩에서는 메서드의 이름이 동일하고 시그니처가 달라야 합니다. | 메서드 재정의에서는 메서드의 이름과 서명이 동일해야 합니다. |
| 메소드 오버로딩에서는 반환 유형이 같을 수도 있고 같을 수도 없지만 매개변수만 변경하면 됩니다. | 메서드 재정의에서 반환 형식은 동일하거나 공변형이어야 합니다. |
| 오버로드된 메서드에 정적 바인딩이 사용됩니다. | 메서드 재정의에 동적 바인딩이 사용됩니다. |
| 컴파일 타임 다형성으로 인해 성능이 저하되었습니다. | 더 나은 성능을 제공합니다. 그 이유는 재정의된 메서드의 바인딩이 런타임에 수행되기 때문입니다. |
| Private 및 final 메서드는 오버로드될 수 있습니다. | Private 및 final 메서드는 재정의될 수 없습니다. |
| 메소드 오버로딩을 수행하는 동안 인수 목록은 달라야 합니다. | 인수 목록은 메소드 재정의에서 동일해야 합니다. |
Java의 메소드 오버로딩
메소드 오버로딩 는 컴파일 시간 다형성 . 메서드 오버로딩에서는 둘 이상의 메서드가 클래스의 다른 시그니처와 동일한 메서드 이름을 공유합니다. 메소드 오버로딩에서는 반환 유형이 같을 수도 있고 같을 수도 없지만, 자바에서는 메소드의 반환 유형만 바꾸면 메소드 오버로딩을 이룰 수 없기 때문에 매개변수를 변경해야 한다.
메소드 오버로딩의 예:
자바
// Java Program to Implement // Method Overloading import java.io.*; class MethodOverloadingEx { static int add(int a, int b) { return a + b; } static int add(int a, int b, int c) { return a + b + c; } // Main Function public static void main(String args[]) { System.out.println('add() with 2 parameters'); // Calling function with 2 parameters System.out.println(add(4, 6)); System.out.println('add() with 3 parameters'); // Calling function with 3 Parameters System.out.println(add(4, 6, 7)); } }> 산출
add() with 2 parameters 10 add() with 3 parameters 17>
Java의 메소드 재정의
메소드 재정의 는 런타임 다형성 . 메서드 재정의에서 파생 클래스는 기본 클래스 또는 부모 클래스에서 이미 제공하는 메서드의 특정 구현을 제공합니다. 메서드 재정의에서 반환 유형은 동일하거나 공변적이어야 합니다(반환 유형은 파생 클래스와 동일한 방향으로 달라질 수 있음).
메서드 재정의의 예:
자바 // Java Program to implement // Method Overriding import java.io.*; // Base Class class Animal { void eat() { System.out.println('eat() method of base class'); System.out.println('eating.'); } } // Inherited Class class Dog extends Animal { void eat() { System.out.println('eat() method of derived class'); System.out.println('Dog is eating.'); } } // Driver Class class MethodOverridingEx { // Main Function public static void main(String args[]) { Dog d1 = new Dog(); Animal a1 = new Animal(); d1.eat(); a1.eat(); // Polymorphism: Animal reference pointing to Dog object Animal animal = new Dog(); // Calls the eat() method of Dog class animal.eat(); } }> 산출
eat() method of derived class Dog is eating. eat() method of base class eating. eat() method of derived class Dog is eating.>
위 프로그램에 대한 설명:
여기서는 파생 클래스 이름에서 eat() 메서드가 재정의된 것을 볼 수 있습니다. 개 기본 클래스 이름으로 이미 제공됨 동물 . Dog 클래스의 인스턴스를 생성하고 eat() 메서드를 호출하면 기본 클래스 메서드 eat() 대신 파생 클래스 eat() 메서드만 실행되는 것을 볼 수 있으며, Animal 클래스의 인스턴스를 생성하고 eat()를 호출하면 ) 메소드를 사용하면 파생 클래스 메소드 eat() 대신 기본 클래스 eat() 메소드만 실행되는 것을 볼 수 있습니다.