예를 사용한 Java OOP의 다형성: 동적이란 무엇입니까?

Java에서 다형성이란 무엇입니까?

다형성 Java에서는 상속을 통해 서로 관련된 하나 이상의 클래스나 객체가 있을 때 발생합니다. 다양한 형태를 취하는 것은 물체의 능력입니다. 상속을 통해 사용자는 속성과 메서드를 상속할 수 있으며 다형성은 이러한 메서드를 사용하여 다양한 작업을 수행합니다. 그래서 목표는 소통이지만 접근 방식은 다릅니다.

예를 들어, 통신을 위해 스마트폰이 있습니다. 당신이 선택하는 통신 모드는 무엇이든 될 수 있습니다. 전화가 될 수도 있고, 문자 메시지가 될 수도 있고, 사진 메시지가 될 수도 있고, mail, 등등. 그래서 목표는 소통이라는 공통점이 있지만 접근 방식은 다릅니다. 이것은 ... 불리운다 다형성. 이제 예제를 통해 Java의 다형성을 배워보겠습니다.

이번에 자바 튜토리얼, 당신은 배울 것이다-




여기를 눌러 더 많은 정보를 찾으세요. 비디오에 접근할 수 없는 경우

예제가 포함된 OOP의 Java 다형성

입금 및 출금 기능을 갖춘 'Account'라는 상위 클래스가 하나 있습니다. 계정에는 2개의 하위 클래스가 있습니다.

입출금의 운영은 적금계좌와 당좌예금계좌 모두 동일합니다. 따라서 Account 클래스에서 상속된 메서드가 작동합니다.

Java의 단일 상속
Java 다형성 예

소프트웨어 요구사항 변경

요구 사항 사양에 변화가 있는데, 이는 소프트웨어 업계에서 흔히 볼 수 있는 일입니다. 초과인월 기능을 갖춘 권한 있는 은행 계좌 기능을 추가해야 합니다.

기본적으로 당좌인월은 귀하의 계좌 잔고보다 더 많은 금액을 인출할 수 있는 기능입니다.

따라서 특권에 대한 철회 방법이 새로 구현되어야 합니다. 그러나 Savings and Checking 계좌에서는 테스트된 코드 부분을 변경하지 않습니다. 이것이 장점이다 웁스

자바 다형성

단계 1) 계정 저장을 위한 "철회" 메소드가 호출되면 상위 계정 클래스의 메소드가 실행됩니다.

자바 다형성

단계 2) 그러나 특권계좌(초과대월 시설)에 대한 “Withdraw” 방법이 호출되면 특권 클래스에 정의된 철회 방법이 실행됩니다. 이것은 OOP의 다형성.

자바 다형성

Java의 메소드 재정의

메소드 오버라이딩(Method Overriding)은 하위 클래스에서 상위 클래스 메소드를 재정의하는 것입니다.

메서드 재정의 규칙

  • 메소드 서명, 즉 메소드 이름, 매개변수 목록 및 반환 유형이 정확히 일치해야 합니다.
  • 재정의된 메서드는 접근성을 넓힐 수 있지만 좁힐 수는 없습니다. 즉, 기본 클래스에서 비공개인 경우 하위 클래스는 이를 공개로 설정할 수 있지만 그 반대는 불가능합니다.

Java의 메소드 재정의 규칙

class Doctor{
  public void treatPatient(){
  // treatPatient method
  
}
class Surgeon extends Doctor{
  public void treatPatient(){
  // treatPatient method
  }
}
Class run{
  public static void main (String args[]){
    Doctor doctorObj = new Doctor()
	// treatPatient method in class Doctor will be executed
    doctorObj.treatPatient();
   
    Surgeon surgeonObj = new Surgeon();
    // treatPatient  method in class Surgeon  will be executed
    surgeonObj.treatPatient();
  }
}

오버로딩과 재정의의 차이점

메서드 오버로딩
메서드 재정의
메소드 오버로딩은 동일한 클래스에 있으며, 둘 이상의 메소드가 이름은 동일하지만 서명이 다릅니다. 메소드 오버라이딩(Method Overriding)은 상위 클래스의 메소드 중 하나를 하위 클래스에서 재정의하는 것입니다. 이 경우 메서드의 시그니처는 동일하게 유지됩니다.
예 :

void sum (int a , int b);
void sum (int a , int b, int c);
void sum (float a, double b);
예 :

class X{
  public int sum(){
     // some code
  }
}
class Y extends X{
  public int sum(){
    //overridden method
   //signature is same
 }
}

동적 다형성이란 무엇입니까?

OOP의 동적 다형성은 슈퍼클래스와 서브클래스에서 동일한 이름과 서명을 사용하여 여러 메서드를 정의할 수 있는 메커니즘입니다. 재정의된 메서드에 대한 호출은 런타임에 해결됩니다.

동적 다형성 예:

슈퍼 클래스의 참조 변수는 하위 클래스 객체를 참조할 수 있습니다.

 Doctor obj = new Surgeon();

진술을 고려하십시오

obj.treatPatient();

여기서 참조 변수 "obj"는 상위 클래스에 속하지만 이것이 가리키는 객체는 하위 클래스에 속합니다(아래 다이어그램의 다형성 예에 표시된 대로).

obj.treatPatient()는 하위 클래스의 treatPatient() 메소드를 실행합니다 – Surgeon

기본 클래스 참조를 사용하여 메소드를 호출하는 경우 호출할 메소드는 참조가 가리키는 객체에 따라 JVM에 의해 결정됩니다.

예를 들어, obj가 Doctor에 대한 참조이더라도 Surgeon 개체를 가리키므로 Surgeon의 메서드를 호출합니다.

이는 런타임 중에 결정되므로 이를 이라고 합니다. 동적 or 런타임 다형성

정적 다형성과 동적 다형성의 차이점

정적 다형성 자바 컴파일 타임에 메서드를 호출하기 위한 정보를 수집하는 다형성 유형인 반면, 동적 다형성은 런타임에 메서드 호출에 대한 정보를 수집하는 다형성 유형입니다.

정적 다형성
동적 다형성
메소드 오버로딩과 관련이 있습니다. 메서드 재정의와 관련이 있습니다.
오류가 있는 경우 컴파일 타임에 해결됩니다. 컴파일 중에는 코드가 실행되지 않으므로 이름이 static입니다.

예 :

void sum (int a , int b);
void sum (float a, double b);
int sum (int a, int b); //compiler gives error.

참조 변수가 재정의된 메서드를 호출하는 경우 호출할 메서드는 참조 변수가 가리키는 객체에 의해 결정됩니다. 이는 코드가 실행 중인 런타임에만 결정될 수 있으므로 이름은 동적입니다.

예 :

//reference of parent pointing to child object
 Doctor obj = new Surgeon();
// method of child called
obj.treatPatient();

자바의 슈퍼 키워드

Surgeon 클래스의 treatPatient 메서드가 Doctor 클래스에 정의된 기능을 실행한 다음 고유한 특정 기능을 수행하려는 경우 어떻게 해야 합니까?

이 경우 키워드는 super하위 클래스에서 상위 클래스의 메소드에 액세스하는 데 사용할 수 있습니다.

Surgeon 클래스의 treatPatient 메소드는 다음과 같이 작성할 수 있습니다.

treatPatient(){
   super.treatPatient();
     //add code specific to Surgeon
}

super 키워드는 하위 클래스에 있는 슈퍼 클래스의 모든 데이터 멤버나 메서드에 액세스하는 데 사용할 수 있습니다.

다음으로 Super 키워드에 대해 알아보겠습니다. 계승 예제 프로그램을 사용한 Java의 다형성.

예:-상속, 다형성 및 슈퍼 키워드를 배우려면

단계 1) 팔로우 복사wing 편집기에 코드 넣기

public class Test{
     public static void main(String args[]){
        X x= new X();
       Y y = new  Y();
       y.m2();
      //x.m1();
      //y.m1();
     //x = y;// parent pointing to object of child
     //x.m1() ;
     //y.a=10;
   }
}
class X{
   private int a;
   int b;
      public void m1(){
       System.out.println("This is method m1 of class X");
     }
}
class Y extends X{
      int c; // new instance variable of class Y
         public void m1(){
            // overriden method
            System.out.println("This is method m1 of class Y");
        }
       public void m2(){
           super.m1();
           System.out.println("This is method m2 of class Y");
      }
}

단계 2) 코드를 저장하고, 컴파일하고, 실행하세요. 출력을 관찰하십시오.

단계 3) # 6-9 줄의 주석 처리를 해제합니다. 코드를 저장하고, 컴파일하고, 실행하세요. 출력을 관찰합니다.

단계 4) #10행의 주석 처리를 해제합니다. 코드를 저장하고 컴파일하십시오.

단계 5) 오류 = ? 이는 하위 클래스가 상위 클래스의 비공개 멤버에 접근할 수 없기 때문입니다.

요약

  • 객체 지향 프로그래밍의 다형성은 상속을 통해 서로 관련된 하나 이상의 클래스나 객체가 있을 때 발생합니다. 다양한 형태를 취하는 것은 물체의 능력입니다.
  • 메소드 오버라이딩(Method Overriding)은 하위 클래스에서 상위 클래스 메소드를 재정의하는 것입니다.
  • Java의 동적 다형성은 슈퍼클래스와 서브클래스에서 동일한 이름과 서명을 사용하여 여러 메서드를 정의할 수 있는 메커니즘입니다.
  • Java의 정적 다형성은 컴파일 타임에 메서드를 호출하기 위한 정보를 수집하는 다형성 유형인 반면, 동적 다형성은 런타임에 메서드 호출에 대한 정보를 수집하는 다형성 유형입니다.
  • 감독자 키워드는 하위 클래스에서 상위 클래스의 메소드에 액세스하는 데 사용할 수 있습니다.