logo

Java의 메소드 오버로딩과 메소드 오버라이딩의 차이점

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() 메소드만 실행되는 것을 볼 수 있습니다.