java override method overriding
이 자습서에서는 간단한 예제와 함께 메서드 재정의 및 @override 주석을 사용하여 Java에서 런타임 다형성을 달성하는 방법을 설명합니다.
이미 다형성 개념과 컴파일 타임 다형성에 대해 자세히 논의했습니다. 이 튜토리얼에서는 Java의 런타임 다형성에 대해 설명합니다.
메서드 호출이 컴파일 타임에 해결되는 컴파일 타임 다형성과 달리 런타임 다형성에서는 메서드 호출이 런타임에 해결됩니다.
학습 내용 :
자바의 런타임 다형성
다음으로도 알려진 런타임 다형성 동적 다형성 또는 동적 메서드 디스패치 이다 재정의 된 메서드 호출이 런타임에 동적으로 확인되는 기술입니다.
Java의 런타임 다형성은“ 메서드 재정의 ”. 메서드 재정의는 부모 클래스의 메서드가 자식 클래스에서 재정의되거나 재정의되는 기술입니다.
메서드가 클래스에서 재정의되면 동적 메서드 디스패치 기술은 컴파일 타임이 아닌 런타임에 재정의 된 메서드 호출을 해결합니다.
Java에서 런타임 다형성 달성 – 메서드 재정의
메서드 재정의는 Java에서 런타임 다형성을 달성하기 위해 사용하는 접근 방식입니다. 이미 언급했듯이 메서드 재정의는 하위 클래스가 부모 클래스에 이미있는 메서드를 추가하고이 메서드에 새 기능을 추가하는 기술입니다. 그런 다음 기본 클래스 메서드가 재정의되었다고 말합니다.
부모 클래스의 메서드와 동일한 프로토 타입을 사용하지만 구현이 다른 하위 클래스에서 정의한 새 메서드를 ' 재정의 방법” . 부모 클래스의 메서드는 ' 재정의 된 메서드 ”.
최고의 외장 하드 드라이브 복구 소프트웨어
메서드가 재정의되면이 재정의 된 메서드에 대한 호출이 어떻게 해결되는지에 대한 질문이 남아 있습니까?
일반적으로 기본 클래스의 참조를 통해 재정의 된 메서드를 호출합니다. base 유형의 참조를 만든 다음 new 키워드를 사용하여 자식 클래스 개체를 할당합니다.
따라서 참조 변수의 내용 또는 호출 할 메서드를 결정하는 기본 클래스 참조가 참조하는 개체에 따라 다릅니다. 따라서 참조 개체가 자식 클래스의 개체를 가리키면 재정의 메서드가 호출됩니다.
그렇지 않고 참조 개체에 기본 클래스 개체가 포함되어 있으면 재정의 된 메서드가 호출됩니다. 특히 동적 메서드 디스패치를위한 런타임 다형성에서 명확해야 할 한 가지 주제는 아래에 설명 된 '업 캐스팅'입니다.
업 캐스팅
위에서 논의한 상위 클래스의 참조 객체가 하위 클래스의 객체를 가리 키거나 참조 할 때이를 업 캐스팅이라고합니다.
간단한 예를 사용하여 업 캐스팅을 이해합시다.
'BaseClass'클래스가 있고이 BaseClass를 확장하여 새 클래스 DerivedClass를 생성한다고 가정합니다. 이 구조는 아래와 같습니다.
class BaseClass { ….//BaseClass code here } class DerivedClass extends BaseClass{ ….//DerivedClass code here }
이제 업 캐스팅을 구현하기 위해 BaseClass 유형의 참조 변수를 선언합니다. 다음으로 DerivedClass의 객체를 BaseClass 클래스의 참조에 할당합니다.
BaseClass base = new DerivedClass (); //Upcasting
그래서 여기서 우리는 DerivedClass 객체를 BaseClass로 업 캐스트했다고 말할 수 있습니다. 런타임 다형성에 관한 한 업 캐스팅의 개념은 매우 중요합니다.
따라서 일반적으로 업 캐스팅은 하위 또는 하위 클래스 객체를 상위 또는 수퍼 클래스의 참조에 할당하는 프로세스입니다.
SuperClass reference = new Subclass Object;
아래의 Java 프로그램은 메서드 재정의를 보여주고 런타임에 재정의 된 메서드 호출을 해결하기 위해 업 캐스팅이 수행되는 방법도 보여줍니다.
//base/parent class class Parent { void Print() //print method { System.out.println('Parent::Print() method'); } } //child class 1 inheriting from Parent class child1 extends Parent { void Print() //overridden print method { System.out.println('child1::Print() method'); } } //child class 2 inheriting from Parent class child2 extends Parent { void Print() //overridden print method { System.out.println('child2::Print() method'); } } class Main { public static void main(String() args) { Parent parent = new Parent(); parent.Print(); //executes parent Print () method parent = new child1(); //upcasting parent.Print(); //executes child1 Print () method parent = new child2(); //upcasting parent.Print(); //executes child2 Print () method
산출:
위의 프로그램에는 두 개의 클래스 즉, 'Parent'클래스에서 파생 된 child1과 child2가 있습니다. 부모 클래스에는 child1 및 child2 클래스 모두에서 재정의되는 'Print'메서드가 있습니다. 그런 다음 main 메서드에서 'parent'라는 Parent 클래스의 참조 개체를 만듭니다.
먼저 Parent 클래스의 객체를 할당 한 다음 'Print ()'메서드를 호출합니다. 그런 다음 먼저 child1 객체를 할당 한 다음 child2 객체를 Parent 참조에 할당하여이를 반복합니다.
Windows 10에서 .eps 파일을 여는 방법
출력은 상위 참조의 내용에 따라 표시되며 적절한 Print 메서드가 호출됩니다.
동적 / 런타임 다형성의 장점
- 동적 다형성을 사용하면 프로그래머가 메서드를 재정의 할 수 있습니다.
- 이를 통해 클래스는 파생물이 특정 구현을 재정의하고 제공 할 수있는 일반 구현으로 메서드를 정의 할 수 있습니다.
- 동적 메서드 디스패치를 사용하면 컴파일 타임에 결정되는 오버로딩과 달리 메서드 호출이 런타임에 해결됩니다. 이것은 프로그래머에게 더 많은 유연성을 제공합니다.
런타임 다형성이 적절한 메서드를 런타임에 호출에 바인딩하므로이를 호출합니다. 동적 바인딩 또는 후기 바인딩 . 반면에 컴파일 타임 다형성은 정적 바인딩 또는 초기 바인딩 .
정적 바인딩과 동적 바인딩
정적 바인딩 | 동적 바인딩 |
---|---|
컴파일 타임에 해결 된 메서드 호출은 정적 바인딩입니다. | 런타임시 해결되는 메서드 호출은 동적 바인딩입니다. |
메서드 오버로딩은 정적 바인딩의 한 예입니다. | 메서드 재정의는 동적 바인딩의 예입니다. |
클래스 및 필드 유형은 정적 바인딩에 사용됩니다. | 개체는 동적 바인딩에 사용됩니다. |
비공개, 최종 및 정적 엔티티는 정적 바인딩을 사용합니다. | 가상 메서드는 동적 바인딩을 사용합니다. |
Java의 가상 기능 / 방법
Java의 가상 함수 또는 메소드는 런타임 다형성과 함께 사용되는 기능입니다. C ++와 달리 Java에는 특별한 '가상'키워드가 없습니다. 메서드가 가상임을 나타냅니다. 기본 클래스에 정의되고 파생 클래스에서 재정의 된 메서드는 가상입니다.
Java에서 기본적으로 private 및 final을 제외한 모든 비 정적 메서드는 가상 기능입니다. 따라서 위에서 설명한 런타임 다형성을 구현하기 위해 재정의 한 메서드는 가상 메서드이기도합니다.
정적 메서드는 Class에 바인딩되어 있으며 객체를 사용하여 호출 할 수 없기 때문에 런타임 다형성과 함께 사용할 수 없으며 가상 함수도 아닙니다.
Java의 인터페이스는 기본적으로 가상입니다. 인터페이스를 구현하는 클래스는 인터페이스 메서드에 대한 구현을 제공합니다. 런타임 다형성에서와 마찬가지로 인터페이스 메서드에 대한 호출도 런타임에 해결됩니다.
인터페이스의 메서드는 재정의되도록 설계되었으므로 모든 인터페이스 메서드는 가상 기능입니다.
예를 들어 다음 코드를 고려하십시오.
interface car{ void accelerate(); } class Maruti implements car{ void accelerate () { System.out.println(“Maruti car accelerated!!”); } }
위 코드에서 Acceleration () 메서드는 인터페이스 카의 일부이며 재정의되도록 설계되었으므로 가상 함수입니다.
자바에서 @override 주석
@override 주석은 Java의 기본 주석입니다. 이 주석은 Java 1.5에서 도입되었습니다. @override 어노테이션은 서브 클래스 메소드가 수퍼 클래스 메소드를 대체 할 때 사용됩니다.
Java @override 어노테이션을 사용하여 메소드가 상위 클래스 메소드를 대체하고 있음을 표시하면 어노테이션이있는 메소드가 대체되지 않으면 컴파일러가 경고를 발행합니다. 따라서 @override 주석을 사용할 때 메서드를 재정의해야합니다.
둘째, @override 주석을 사용하여 코드를 더 읽기 쉽게 만듭니다. 선언되는 메서드가 재정의된다는 것을 즉시 알 수 있습니다.
Java @override 주석의 일반적인 구문은 다음과 같습니다.
public @interface override
아래 Java 프로그램은 @override 주석의 사용법을 보여줍니다.
//base class definition class BaseClass { public void display() { System.out.println('BaseClass::display () method'); } } //derived class inheriting base class class DerivedClass extends BaseClass { @Override //indicates the display method being overridden public void display() { System.out.println('DerivedClass::display () method'); } } // main class public class Main { public static void main(String args()) { System.out.println('@Override Example'); //BaseClass type object;contain child object BaseClass testObj = new DerivedClass(); //call display method based on contents of object i.e. derived class display () testObj.display(); } }
산출:
위의 프로그램에는 표시 방법을 정의하는 BaseClass가 있습니다. 그런 다음이 BaseClass에서 DerivedClass 클래스를 파생시키고 @override 어노테이션으로 표시 메소드를 표시합니다. 이 메서드는 DerivedClass에서 재정의됩니다.
기본 메서드에서 BaseClass 개체 참조를 만들고 참조가 DerivedClass 표시 메서드를 호출하도록하는 DerivedClass 개체를 가리 킵니다.
Derived 클래스에서 display () 메서드를 구현하지 않았다면 컴파일러는 @override 주석으로 표시되어 있으므로 컴파일러 경고를 제공했을 것입니다.
자바에서 오버로딩 및 오버라이드
Java에서 오버로딩과 오버라이드를 모두 논의 했으므로 이제이 두 개념을 요약 해 보겠습니다.
오버로딩은 컴파일 타임 다형성과 관련이 있습니다. 즉, 오버로딩을 사용하여 컴파일 타임 다형성을 구현합니다. 오버로딩은 메서드 오버로딩과 연산자 오버로딩의 두 가지 방법으로 수행됩니다.
메서드 오버로딩은 이름은 같지만 매개 변수 목록이 다른 메서드가 두 개 이상있는 기술입니다. 매개 변수 목록은 매개 변수 수, 매개 변수 유형 또는 매개 변수 시퀀스에 따라 구분됩니다.
Java에서 연산자 오버로딩은 제한적이며 두 개의 숫자를 더하고 두 개의 String 객체를 연결하는 데 사용되는 '+'연산자 만 오버로드 할 수 있습니다.
오버로딩은 컴파일 타임에 해결되며 정적입니다. 그것은 또한 불린다 ‘조기 바인딩’ .
메서드 재정의는 런타임 다형성을 구현하는 데 사용하는 기능입니다. 메서드 재정의에서 부모 클래스의 메서드는 자식 클래스에서 재정의됩니다. 즉, 수퍼 클래스와 하위 클래스의 메서드 프로토 타입은 동일하게 유지되지만 구현이 다릅니다.
메서드 재정의는 동적 메서드 디스패치 기술을 사용하여 메서드 호출을 해결하고 수퍼 클래스 또는 하위 클래스 메서드를 호출할지 여부를 결정하며 이는 런타임에 수행됩니다.
따라서 런타임 다형성은 동적 다형성 또는 후기 바인딩이라고도합니다.
다음으로 Java에서 오버로딩과 오버라이드의 차이점을 표로 만들어 보겠습니다.
Java에서 오버로딩 대 오버라이드
과부하 | 재정의 |
---|---|
오버로딩은 컴파일 타임 다형성에 사용됩니다. | 재정의는 런타임 다형성에서 구현됩니다. |
같은 수업에서 할 수 있습니다. 상속이 필요할 수도 있고 필요하지 않을 수도 있습니다. | 재정의에는 항상 상속이 필요합니다. |
메서드는 동일한 메서드 이름과 다른 매개 변수 목록으로 오버로드됩니다. | 재정의 된 메서드에는 동일한 프로토 타입이 있습니다. |
반환 형식은 메서드 오버로딩에서 고려되지 않습니다. | 반환 유형은 재정의 된 메서드와 재정의하는 메서드에서 동일해야합니다. |
프로그램의 가독성을 향상시킵니다. | 재정의하면 특정 구현 클래스를 현명하게 가질 수 있습니다. |
자주 묻는 질문
Q # 1) 정적 메서드를 재정의 할 수 있습니까?
대답: 아니요. 정적 메서드는 Java에서 재정의 할 수 없습니다. 이는 정적 메서드가 클래스 기반이고 클래스에서 직접 호출되기 때문입니다. 런타임에 호출 할 개체가 필요하지 않습니다. 따라서 정적 메서드 디스패치는 컴파일러에 의해 결정됩니다.
Q # 2) 생성자를 재정의 할 수 있습니까?
대답: 아니요, 생성자를 재정의 할 수 없습니다. 생성자는 객체가 생성 될 때 호출됩니다. 객체라고 부르지 않습니다. 또한 재정의의 요구 사항 중 하나는 재정의 된 메서드이며 재정의 메서드는 생성자의 경우 불가능한 동일한 메서드 서명을 가져야합니다.
Q # 3) 메서드 재정의가 Dynamic Polymorphism이라고하는 이유는 무엇입니까?
대답: 메서드 재정의의 경우 메서드 호출은 런타임에 동적으로 확인됩니다. 따라서이를 동적 다형성이라고합니다.
Q # 4) Java에서 Dynamic Polymorphism을 사용하는 것은 무엇입니까?
대답: 동적 다형성은 하위 클래스가 재정의 된 메서드에 특정 구현을 제공 할 수 있도록 메서드 재정의를 지원하는 동적 메서드 디스패치 기술을 사용합니다. 이렇게하면 효율적인 프로그램을 작성할 수있는 특정 기능을 구현할 수 있습니다.
둘째, 동적 메서드 디스패치가 호출 할 메서드를 결정하므로 메서드 호출 해결에 대해 걱정할 필요가 없습니다.
Q # 5) 정적 바인딩과 동적 바인딩의 차이점은 무엇입니까?
대답: 메서드 호출과 해당 구현 간의 연결을 바인딩이라고합니다. 이 연결이 컴파일 타임에 해결되면이를 정적 바인딩이라고합니다. 바인딩이 런타임에 동적으로 수행되면이를 동적 바인딩이라고합니다.
정적 바인딩은 클래스 및 필드의 데이터 유형을 사용하여 메서드 호출을 확인합니다. 동적 바인딩은 개체를 사용하여 메서드 호출을 확인합니다. 정적 바인딩은 컴파일 타임 다형성이라고도하며 동적 바인딩은 런타임 다형성이라고도합니다.
결론
이 튜토리얼에서는 Java의 런타임 다형성에 대해 자세히 설명했습니다.
런타임 다형성은 메서드 재정의를 사용하여 구현됩니다. 메서드 재정의는 수퍼 클래스에 정의 된 메서드가 하위 클래스에서 재정의되거나 재정의되는 하위 클래스에서 수행됩니다. 메서드 시그니처는 수퍼 클래스와 하위 클래스에서 동일하게 유지됩니다.
수동 테스트 인터뷰 질문 및 답변 pdf
메서드 재정의를 사용하여 하위 클래스의 동일한 메서드에 특정 구현을 제공 할 수 있습니다. 이렇게하면 상속과 관련된보다 효율적인 프로그램을 작성할 수 있습니다. Java는 메소드가 대체 될 것임을 나타내는 @override 어노테이션을 제공합니다.
기본적으로 최종적이지 않은 모든 비 정적 메서드는 Java에서 가상입니다. 모든 가상 메서드를 재정의 할 수 있습니다.