산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> java

자바 - 다형성

다형성은 다양한 형태를 취할 수 있는 개체의 능력입니다. OOP에서 다형성의 가장 일반적인 사용은 부모 클래스 참조가 자식 클래스 개체를 참조하는 데 사용될 때 발생합니다.

둘 이상의 IS-A 테스트를 통과할 수 있는 모든 Java 객체는 다형성으로 간주됩니다. 자바에서 모든 자바 객체는 다형성입니다. 어떤 객체도 자신의 유형과 객체 클래스에 대한 IS-A 테스트를 통과할 것이기 때문입니다.

개체에 액세스할 수 있는 유일한 방법은 참조 변수를 통해서라는 것을 아는 것이 중요합니다. 참조 변수는 한 가지 유형일 수 있습니다. 한 번 선언된 참조 변수의 유형은 변경할 수 없습니다.

참조 변수는 final로 선언되지 않은 경우 다른 개체에 다시 할당할 수 있습니다. 참조 변수의 유형은 개체에서 호출할 수 있는 메서드를 결정합니다.

참조 변수는 선언된 유형의 모든 개체 또는 선언된 유형의 하위 유형을 참조할 수 있습니다. 참조 변수는 클래스 또는 인터페이스 유형으로 선언할 수 있습니다.

예시

예를 살펴보겠습니다.

public interface Vegetarian{}
public class Animal{}
public class Deer extends Animal implements Vegetarian{}

이제 Deer 클래스는 다중 상속이 있기 때문에 다형성으로 간주됩니다. 다음은 위의 예에 해당합니다. -

참조 변수 사실을 Deer 개체 참조에 적용할 때 다음 선언은 유효합니다. −

예시

Deer d = new Deer();
Animal a = d;
Vegetarian v = d;
Object o = d;

모든 참조 변수 d, a, v, o는 힙에서 동일한 Deer 개체를 참조합니다.

가상 방법

이 섹션에서는 Java에서 재정의된 메서드의 동작을 통해 클래스를 디자인할 때 다형성을 활용할 수 있는 방법을 보여 드리겠습니다.

우리는 이미 자식 클래스가 부모의 메서드를 재정의할 수 있는 메서드 재정의에 대해 논의했습니다. 재정의된 메서드는 기본적으로 부모 클래스에 숨겨져 있으며 자식 클래스가 재정의 메서드 내에서 super 키워드를 사용하지 않는 한 호출되지 않습니다.

예시

/* File name : Employee.java */
public class Employee {
   private String name;
   private String address;
   private int number;

   public Employee(String name, String address, int number) {
      System.out.println("Constructing an Employee");
      this.name = name;
      this.address = address;
      this.number = number;
   }

   public void mailCheck() {
      System.out.println("Mailing a check to " + this.name + " " + this.address);
   }

   public String toString() {
      return name + " " + address + " " + number;
   }

   public String getName() {
      return name;
   }

   public String getAddress() {
      return address;
   }

   public void setAddress(String newAddress) {
      address = newAddress;
   }

   public int getNumber() {
      return number;
   }
}

이제 다음과 같이 Employee 클래스를 확장한다고 가정합니다. -

/* File name : Salary.java */
public class Salary extends Employee {
   private double salary; // Annual salary
   
   public Salary(String name, String address, int number, double salary) {
      super(name, address, number);
      setSalary(salary);
   }
   
   public void mailCheck() {
      System.out.println("Within mailCheck of Salary class ");
      System.out.println("Mailing check to " + getName()
      + " with salary " + salary);
   }
   
   public double getSalary() {
      return salary;
   }
   
   public void setSalary(double newSalary) {
      if(newSalary >= 0.0) {
         salary = newSalary;
      }
   }
   
   public double computePay() {
      System.out.println("Computing salary pay for " + getName());
      return salary/52;
   }
}

이제 다음 프로그램을 주의 깊게 연구하고 결과를 결정하려고 합니다.

/* File name : VirtualDemo.java */
public class VirtualDemo {

   public static void main(String [] args) {
      Salary s = new Salary("Mohd Mohtashim", "Ambehta, UP", 3, 3600.00);
      Employee e = new Salary("John Adams", "Boston, MA", 2, 2400.00);
      System.out.println("Call mailCheck using Salary reference --");   
      s.mailCheck();
      System.out.println("\n Call mailCheck using Employee reference--");
      e.mailCheck();
   }
}

이것은 다음 결과를 생성합니다 -

출력

Constructing an Employee
Constructing an Employee

Call mailCheck using Salary reference --
Within mailCheck of Salary class
Mailing check to Mohd Mohtashim with salary 3600.0

Call mailCheck using Employee reference--
Within mailCheck of Salary class
Mailing check to John Adams with salary 2400.0

여기서는 두 개의 Salary 개체를 인스턴스화합니다. 급여 참조 사용 , 다른 하나는 직원 참조 e를 사용합니다. .

s.mailCheck()를 호출하는 동안 , 컴파일러는 컴파일 시 Salary 클래스의 mailCheck()를 보고 JVM은 런타임 시 Salary 클래스의 mailCheck()를 호출합니다.

e의 mailCheck() 때문에 상당히 다릅니다. 직원 참조입니다. 컴파일러가 e.mailCheck()를 볼 때 , 컴파일러는 Employee 클래스의 mailCheck() 메서드를 봅니다.

여기에서 컴파일 시간에 컴파일러는 Employee의 mailCheck()를 사용하여 이 명령문의 유효성을 검사합니다. 그러나 런타임에 JVM은 Salary 클래스에서 mailCheck()를 호출합니다.

이 동작을 가상 메서드 호출이라고 하며 이러한 메서드를 가상 메서드라고 합니다. 재정의된 메서드는 컴파일 시간에 소스 코드에서 사용된 참조 데이터 유형에 관계없이 런타임에 호출됩니다.


java

  1. 자바 연산자
  2. 자바 주석
  3. 자바 for-each 루프
  4. 자바 문자열
  5. 자바 인터페이스
  6. 자바 익명 클래스
  7. 자바 리소스 사용
  8. 자바 주석
  9. 자바 어설션
  10. 자바 벡터