> Java > java지도 시간 > 본문

다형성: Java의 디코딩 메서드 재정의

Mary-Kate Olsen
풀어 주다: 2024-11-02 18:14:02
원래의
930명이 탐색했습니다.

Polymorphism: Decoding Method Overriding in Java

메서드 재정의는 Java 다형성의 핵심 개념 중 하나이며, 하위 클래스가 상위 클래스에 이미 정의된 메서드의 특정 구현을 제공할 수 있도록 합니다. 이 강력한 기능은 런타임 다형성을 달성하는 데 도움이 되며 동적 메서드 디스패치를 가능하게 합니다. 이번 게시물에서는 메서드 재정의를 철저하게 이해하기 위해 필수 개념, 규칙 및 실제 사례를 자세히 살펴보겠습니다.


메소드 재정의란 무엇인가요?

메서드 재정의는 하위 클래스가 동일한 메서드 시그니처(동일한 이름, 매개변수 및 반환 유형 또는 공변 반환 유형)를 사용하여 상위 클래스의 메서드를 재정의할 때 발생합니다. 컴파일 타임에 해결되는 메서드 오버로딩과 달리 메서드 재정의는 런타임 다형성을 달성합니다. 여기서 호출되는 실제 메서드는 객체의 런타임 유형에 따라 다릅니다.


1. 메서드 재정의 규칙

1. 메소드 서명 일관성:

  • 하위 클래스의 메소드 이름과 매개변수 목록은 슈퍼클래스의 메소드와 정확히 일치해야 합니다.

2. 반환 유형 및 공변 반환 유형:

  • 반환 유형은 동일하거나 공변 유형(수퍼클래스에 있는 원래 반환 유형의 하위 유형)이어야 합니다.

3. 접근 수정자:

  • 하위 클래스의 메소드는 슈퍼클래스의 메소드보다 더 제한적인 액세스 수준을 가질 수 없습니다(예: 슈퍼클래스 메소드가 보호되는 경우 서브클래스는 이를 비공개로 설정할 수 없습니다).

공개 > 보호됨 > 기본값(Package-Private) > 비공개

4. 방법 가시성:

  • 개인 메소드는 재정의될 수 없습니다. 대신 하위 클래스에서 재정의되면 완전히 새로운 메서드로 처리됩니다.

예: 기본 메소드 재정의

package oops.polymorphism;

// Base class
public class MethodOverridingParent {

    // Private Methods CANNOT be overridden
    private String getName() {
        return "Hello";
    }

    // Display method to be overridden (Access Modifier: default)
    void display() {
        System.out.println("Parent Method Called");
    }

    // Return type is Number (parent class of Integer, Double, etc.)
    public Number getCount() {
        return 20;
    }
}
로그인 후 복사
로그인 후 복사

MethodOverridingParent에서는 상위 클래스 외부에서 액세스할 수 있는 display() 및 getCount()만 하위 클래스로 재정의할 수 있습니다. 그러나 getName()은 비공개이므로 하위 클래스에서 상속되지 않으므로 재정의할 수 없습니다.


2. 하위 클래스의 메소드 재정의

package oops.polymorphism;

public class MethodOverridingChild extends MethodOverridingParent {

    // Access Level Increased; Default -> Protected
    @Override
    protected void display() {
        System.out.println("Child Method Called");
    }

    public static void main(String[] args) {

        // Calling Parent Class Method
        MethodOverridingParent parent = new MethodOverridingParent();
        parent.display(); // Output: Parent Method Called

        // Calling Child Class Overridden Method - Runtime Polymorphism
        MethodOverridingParent child = new MethodOverridingChild();
        child.display(); // Output: Child Method Called
    }
}
로그인 후 복사

설명: 하위 클래스 MethodOverridingChild에서 display()가 재정의되었으므로 MethodOverridingChild 인스턴스에서 display()를 호출하면 하위 버전이 호출됩니다. 이것이 런타임 다형성이 실제로 실행되는 모습입니다.


3. 공변 반환 유형: 실제 예

Java의 공변 반환 유형 지원을 통해 하위 클래스는 상위 클래스의 반환 유형보다 더 구체적인 유형을 반환할 수 있습니다. 이 접근 방식은 SOLID 원칙의 리스코프 대체 원칙을 따르며 코드 유연성을 향상시킵니다.

package oops.polymorphism;

// Base class
public class MethodOverridingParent {

    // Private Methods CANNOT be overridden
    private String getName() {
        return "Hello";
    }

    // Display method to be overridden (Access Modifier: default)
    void display() {
        System.out.println("Parent Method Called");
    }

    // Return type is Number (parent class of Integer, Double, etc.)
    public Number getCount() {
        return 20;
    }
}
로그인 후 복사
로그인 후 복사

설명: CovariantReturnType에서 getCount()는 Number의 하위 유형인 Integer를 반환하여 공변 반환 유형을 보여줌으로써 상위 메서드를 재정의합니다. Java에서는 재정의된 메서드의 액세스 수준을 줄일 수 없도록 요구하므로 메서드는 공개 상태로 유지됩니다.


메서드 오버라이딩과 메소드 오버로딩

  • 메서드 재정의는 동적 다형성을 가능하게 하며 상속 계층에서 작동합니다.
  • 메서드 오버로딩은 동일한 클래스 내에서 서로 다른 매개변수 유형이나 숫자를 사용하여 달성되는 정적 다형성의 한 형태입니다.

메서드 재정의를 사용하는 경우

  1. 동적 메서드 확인: 재정의 메서드는 개체 유형에 따라 런타임에 확인되므로 더 큰 유연성을 제공합니다.
  2. 동작 확장: 서브클래스는 슈퍼클래스 메서드의 기능을 수정하거나 확장할 수 있습니다.

결론

메서드 재정의를 이해하고 적용함으로써 객체 지향 프로그래밍 원칙

을 준수하는 보다 유연하고 재사용 가능하며 다형성적인 Java 애플리케이션을 구축할 수 있습니다.

관련 게시물

  • Java 기초

  • 어레이 인터뷰 필수

  • Java 메모리 필수

  • Java 키워드 필수

  • 컬렉션 프레임워크 필수

즐거운 코딩하세요!

위 내용은 다형성: Java의 디코딩 메서드 재정의의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!