logo

Java의 다형성

다형성이라는 단어는 다양한 형태를 갖는다는 것을 의미합니다. 간단히 말해서 Java 다형성을 메시지가 두 가지 이상의 형식으로 표시되는 기능으로 정의할 수 있습니다. 이번 글에서는 다형성(Polymorphism)이 무엇인지, 그리고 그 유형에 대해 알아보겠습니다.

Java의 다형성에 대한 실제 그림 : 사람은 동시에 다른 특성을 가질 수 있습니다. 남자와 마찬가지로 아버지이자 남편이자 직원입니다. 따라서 같은 사람이라도 상황에 따라 다른 행동을 보입니다. 이것을 다형성이라고 합니다.

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

다형성은 객체지향 프로그래밍의 중요한 특징 중 하나로 간주됩니다. 다형성을 사용하면 단일 작업을 다양한 방식으로 수행할 수 있습니다. 즉, 다형성을 사용하면 하나의 인터페이스를 정의하고 여러 구현을 가질 수 있습니다. 폴리(poly)는 많다는 뜻이고 모프(morphs)는 형태를 의미하므로 많은 형태를 뜻한다.



Java 다형성의 유형

Java에서 다형성은 주로 두 가지 유형으로 나뉩니다.

  • 컴파일 타임 다형성
  • 런타임 다형성

Java의 컴파일 타임 다형성

정적 다형성이라고도 합니다. 이러한 유형의 다형성은 함수 오버로딩 또는 연산자 오버로딩을 통해 달성됩니다.

메모: 하지만 Java는 연산자 오버로딩을 지원하지 않습니다.

자바 다형성

메소드 오버로딩

이름은 같지만 매개변수가 다른 함수가 여러 개 있는 경우 이러한 함수를 다음과 같다고 합니다. 과부하 . 인수 개수 변경이나 인수 유형 변경으로 인해 함수가 오버로드될 수 있습니다.

예시 1:

자바




행운을 빌어요
// Java Program for Method overloading> // By using Different Types of Arguments> // Class 1> // Helper class> class> Helper {> >// Method with 2 integer parameters> >static> int> Multiply(>int> a,>int> b)> >{> >// Returns product of integer numbers> >return> a * b;> >}> >// Method 2> >// With same name but with 2 double parameters> >static> double> Multiply(>double> a,>double> b)> >{> >// Returns product of double numbers> >return> a * b;> >}> }> // Class 2> // Main class> class> GFG {> >// Main driver method> >public> static> void> main(String[] args)> >{> >// Calling method by passing> >// input as in arguments> >System.out.println(Helper.Multiply(>2>,>4>));> >System.out.println(Helper.Multiply(>5.5>,>6.3>));> >}> }>

>

>

산출

8 34.65>

예시 2:

자바




// Java program for Method Overloading> // by Using Different Numbers of Arguments> // Class 1> // Helper class> class> Helper {> >// Method 1> >// Multiplication of 2 numbers> >static> int> Multiply(>int> a,>int> b)> >{> >// Return product> >return> a * b;> >}> >// Method 2> >// // Multiplication of 3 numbers> >static> int> Multiply(>int> a,>int> b,>int> c)> >{> >// Return product> >return> a * b * c;> >}> }> // Class 2> // Main class> class> GFG {> >// Main driver method> >public> static> void> main(String[] args)> >{> >// Calling method by passing> >// input as in arguments> >System.out.println(Helper.Multiply(>2>,>4>));> >System.out.println(Helper.Multiply(>2>,>7>,>3>));> >}> }>

>

>

산출

8 42>

컴파일 타임 다형성의 하위 유형

1. 함수 오버로딩

이는 여러 함수가 이름은 같지만 매개변수 목록이 다를 수 있는 C++의 기능입니다. 컴파일러는 함수에 전달된 인수의 수와 유형에 따라 호출할 함수를 결정합니다.

2. 연산자 오버로딩

+, -, * 등과 같은 연산자를 사용자 정의 데이터 유형에 적용할 때 추가적인 의미를 부여할 수 있는 C++의 기능입니다.

3. 템플릿

이는 일반 함수와 클래스를 작성할 수 있게 해주는 C++의 강력한 기능입니다. 템플릿은 함수 또는 클래스 제품군을 만들기 위한 청사진입니다.

Java의 런타임 다형성

이는 동적 메소드 디스패치라고도 합니다. 오버라이드된 메소드에 대한 함수 호출을 런타임 시 해결하는 과정입니다. 이러한 유형의 다형성은 메서드 재정의를 통해 달성됩니다. 메소드 재정의 반면에 파생 클래스에 기본 클래스의 멤버 함수 중 하나에 대한 정의가 있을 때 발생합니다. 그 기본 기능은 다음과 같습니다. 재정의됨 .

자바




// Java Program for Method Overriding> // Class 1> // Helper class> class> Parent {> >// Method of parent class> >void> Print()> >{> >// Print statement> >System.out.println(>'parent class'>);> >}> }> // Class 2> // Helper class> class> subclass1>extends> Parent {> >// Method> >void> Print() { System.out.println(>'subclass1'>); }> }> // Class 3> // Helper class> class> subclass2>extends> Parent {> >// Method> >void> Print()> >{> >// Print statement> >System.out.println(>'subclass2'>);> >}> }> // Class 4> // Main class> class> GFG {> >// Main driver method> >public> static> void> main(String[] args)> >{> >// Creating object of class 1> >Parent a;> >// Now we will be calling print methods> >// inside main() method> >a =>new> subclass1();> >a.Print();> >a =>new> subclass2();> >a.Print();> >}> }>

>

>

산출

subclass1 subclass2>

위 코드에 대한 설명:

이 프로그램에서는 자식 클래스의 객체가 생성되면 자식 클래스 내부의 메서드가 호출됩니다. 이는 상위 클래스의 메소드가 하위 클래스에 의해 재정의되기 때문입니다. 메서드가 재정의되었으므로 이 메서드는 자식 클래스 내의 부모 메서드보다 우선순위가 높습니다. 따라서 자식 클래스 내부의 몸체가 실행됩니다.

런타임 다형성의 하위 유형

나. 가상 기능

파생 클래스의 객체가 기본 클래스의 객체인 것처럼 동작하도록 허용합니다. 파생 클래스는 기본 클래스의 가상 함수를 재정의하여 자체 구현을 제공할 수 있습니다. 함수 호출은 객체의 실제 유형에 따라 런타임에 해결됩니다.

다이어그램 -

Java의 다형성 유형

Java의 다형성은 서로 다른 클래스의 객체를 공통 클래스의 객체로 처리할 수 있도록 하는 개념입니다. 이를 통해 객체는 특정 클래스 유형에 따라 다르게 동작할 수 있습니다.

Java의 다형성의 장점

  1. 서로 다른 클래스의 개체를 공통 클래스의 개체로 처리할 수 있도록 하여 코드 재사용성을 높입니다.
  2. 작성하고 유지 관리해야 하는 코드의 양을 줄여 코드의 가독성과 유지 관리성을 향상시킵니다.
  3. 동적 바인딩을 지원하여 개체의 실제 클래스를 기반으로 런타임에 올바른 메서드를 호출할 수 있습니다.
  4. 개체를 단일 유형으로 처리할 수 있으므로 다양한 유형의 개체를 처리할 수 있는 일반 코드를 더 쉽게 작성할 수 있습니다.

Java의 다형성의 단점

  1. 특히 코드가 복잡한 경우 개체의 동작을 이해하기가 더 어려워질 수 있습니다.
  2. 다형성 동작에는 런타임 시 추가 계산이 필요할 수 있으므로 이로 인해 성능 문제가 발생할 수 있습니다.