메소드 오버로드와 Java에서 메소드 오버라이드의 차이점은 무엇입니까?


답변:


41

새 메서드로 메서드를 오버로드하려면 새 메서드의 서명이 달라야합니다. 즉, 두 개의 오버로드 된 메소드는 이름은 같지만 매개 변수는 다릅니다. 다음은 오버로드 된 두 가지 방법의 예입니다.

boolean isOdd(int number) { ... };
boolean isOdd(float number) { ... };

매개 변수 유형에 따라 해당 메소드가 호출됩니다. 반환 유형을 변경하는 것만으로는 충분하지 않습니다 (추가로 수행 할 수 있음).

메서드를 재정의하면 새 메서드의 서명이 동일하고 경우에 따라 재정의 된 메서드를 대체합니다. 재정의 된 메소드의 예는 다음과 같습니다.

public class A 
{
     public void someMethod() { ... }
}

public class B extends A
{
     public void someMethod() { ... }
}

객체 유형에 따라 선택합니다. 예를 들어

A someA = new B();
someA.someMethod();

를 호출 someMethodB. @Override 주석을 추가 할 수 있고 추가해야합니다.

public class B extends A
{
     @Override
     public void someMethod() { ... }
}

이제 실수로 B의 매개 변수를 변경하면 컴파일러가 someMethod ()를 재정의하는 것이 아니라 과부하하는 것을 알려줍니다.


@scarfridge, 편집 해 주셔서 감사합니다. 오랫동안 자바로 프로그래밍하지 않았으며 많은 것을 잊어 버렸습니다.)))
superM

1
@Override 어노테이션과 다른 리턴 유형 만 있으면 메소드가 대체되지 않고 과부하가 발생한다는 사실을 언급 해 주셔서 감사합니다.
Daniel Dinnyes

13

오버로드시 메소드는 이름은 같지만 매개 변수는 다릅니다.

재정의하면 기본 클래스에 제공된 구현이 하위 클래스의 구현으로 대체됩니다.


1
이것을 편집 / 확장하지 마십시오. 간결함이 포인트입니다.
NimChimpsky

7

질문하는 개념은 Java 학습서에서 다룹니다.

재정의대한 설명 은 다음과 같습니다.

수퍼 클래스의 인스턴스 메소드와 동일한 서명 (이름, 매개 변수의 수 및 유형) 및 리턴 유형을 가진 서브 클래스의 인스턴스 메소드 는 수퍼 클래스의 메소드를 대체 합니다.

서브 클래스가 메소드를 오버라이드 (override)하는 기능은, 클래스가 행동이 "충분한"수퍼 클래스로부터 상속 한 다음 필요에 따라 행동을 수정할 수있게합니다. 재정의 메소드는 이름, 번호 및 유형의 매개 변수 및 리턴 유형이 대체하는 메소드와 동일합니다. 재정의 메서드는 재정의 된 메서드에서 반환 한 형식의 하위 유형을 반환 할 수도 있습니다. 이를 공변량 반환 유형 이라고합니다 .

메소드 @Override를 대체 할 때 수퍼 클래스의 메소드를 대체하도록 컴파일러에 지시하는 어노테이션 을 사용할 수 있습니다 . 어떤 이유로 컴파일러에서 메소드가 수퍼 클래스 중 하나에 존재하지 않음을 발견하면 오류가 발생합니다. 에 대한 자세한 내용 @Override주석 ...을 참조하십시오 .

오버로드는 튜토리얼에서 다음과 같이 설명 됩니다 :

Java 프로그래밍 언어는 오버로드 메소드를 지원하며 Java는 다른 메소드 서명이있는 메소드를 구별 할 수 있습니다. 이는 클래스 내의 메소드가 다른 매개 변수 목록을 갖는 경우 동일한 이름을 가질 수 있음을 의미합니다 ( "인터페이스 및 상속"이라는 레슨에서 논의 될 자격이 있습니다).

서예를 사용하여 다양한 유형의 데이터 (문자열, 정수 등)를 그릴 수 있고 각 데이터 유형을 그리는 방법이 포함 된 클래스가 있다고 가정합니다. 각각의 방법 - 예를 들어, 새 이름을 사용하는 것이 번거 롭다 drawString, drawInteger, drawFloat, 등. Java 프로그래밍 언어에서는 모든 그리기 메소드에 동일한 이름을 사용할 수 있지만 각 메소드에 다른 인수 목록을 전달할 수 있습니다. 따라서 데이터 드로잉 클래스는라는 이름의 네 가지 메서드를 선언 할 수 draw있으며 각 메서드 에는 다른 매개 변수 목록이 있습니다.

오버로드 된 메소드는 메소드에 전달 된 인수의 수와 유형으로 구별됩니다.

컴파일러가 이름을 구별 할 수 없으므로 동일한 이름과 동일한 수 및 유형의 인수를 가진 둘 이상의 메소드를 선언 할 수 없습니다.

컴파일러는 메소드를 차별화 할 때 리턴 유형을 고려하지 않으므로 리턴 유형이 다른 경우에도 동일한 서명으로 두 메소드를 선언 할 수 없습니다.


참고 : 오버로드 된 메서드는 코드를 읽기 어렵게 만들 수 있으므로 드물게 사용해야합니다.


오버로드에 대한 위의 설명은 "인터페이스 및 상속" 단원에서 설명한 자격을 언급합니다 .

서브 클래스에서 수퍼 클래스로부터 상속 된 메소드를 오버로드 할 수 있습니다. 이러한 오버로드 된 메소드는 수퍼 클래스 메소드를 숨기거나 대체하지 않으며 서브 클래스에 고유 한 새로운 메소드입니다.


2

메소드의 오버로딩은 일반적으로 "입력 및 출력의 수와 유형에 따라 동일한 이름을 가진 여러 개의 사용 가능한 메소드를 제공"으로 정의됩니다. 개념은 일반적으로 다양한 입력 세트가 주어지면 동일한 기본 조작을 수행 할 수 있기를 원한다는 것입니다. 예를 들어 숫자 유형의 두 값을 "추가"할 수 있지만 일반적으로 정확한 유형이 무엇인지 아는 것이 중요합니다 값은 해당 유형의 특정 동작을 활용하거나 계획 할 수 있도록합니다. 따라서 지원하려는 숫자 유형 (또는 모음)의 각 조합에 대한 방법을 정의합니다. 이 모든 방법들은 이름은 같지만 "서명"은 다릅니다. 컴파일 타임에

메소드를 대체하는 것은 일반적으로 "기본 클래스에 정의 된 특정 서명을 사용하여 메소드의 파생 클래스에 다른 구현을 제공하는"것으로 정의됩니다. 메소드를 대체해야하는 많은 이유가 있습니다. 사실상 모든 파생 클래스에는 기본 클래스로는 알 수없는 수행해야 할 사항에 대한 추가 지식이 있다는 사실이 공통적으로 있습니다. 대부분의 OO 언어에는 두 가지 유형의 재정의가 있습니다. 재정의는 기본 클래스 메서드를 대체 하거나 확장 할 수 있습니다기본 클래스 메소드 차이점은 일반적으로 기본 클래스 구현을 확장하는 파생 클래스는 재정의 메서드를 실행하는 동안 특정 시점에서 기본 클래스의 재정의 된 버전의 메서드를 호출한다는 것입니다. 이를 통해 재정의 클래스가 기본 클래스에 포함 된 작업의 공통 영역을 "재사용"할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.