Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++의 템플릿과 Java의 제네릭

<시간/>

템플릿은 특정 유형과 독립적인 방식으로 코드를 작성하는 일반 프로그래밍의 기초입니다.

템플릿은 일반 클래스 또는 함수를 만들기 위한 청사진 또는 공식입니다. 반복자 및 알고리즘과 같은 라이브러리 컨테이너는 일반 프로그래밍의 예이며 템플릿 개념을 사용하여 개발되었습니다.

벡터와 같은 각 컨테이너에 대한 단일 정의가 있지만 vector 또는 vector 과 같은 다양한 종류의 벡터를 정의할 수 있습니다.

예시 코드

#include <iostream>
#include <string>
using namespace std;
template <typename T>
inline T const& Max (T const& a, T const& b) {
   return a < b ? b:a;
}
int main () {
   int i = 39;
   int j = 20;
   cout << "Max(i, j): " << Max(i, j) << endl;
   double f1 = 13.5;
   double f2 = 20.7;
   cout << "Max(f1, f2): " << Max(f1, f2) << endl;
   string s1 = "Hello";
   string s2 = "World";
   cout << "Max(s1, s2): " << Max(s1, s2) << endl;
   return 0;
}

출력

Max(i, j): 39
Max(f1, f2): 20.7
Max(s1, s2): World

반면에 Java는 Generics로 사용됩니다.

Java 일반 메서드 및 일반 클래스를 사용하면 프로그래머가 단일 메서드 선언으로 관련 메서드 집합을 지정하거나 단일 클래스 선언으로 관련 유형 집합을 지정할 수 있습니다.

제네릭은 또한 프로그래머가 컴파일 시간에 잘못된 형식을 잡을 수 있도록 컴파일 시간 형식 안전성을 제공합니다.

Java Generic 개념을 사용하여 객체 배열을 정렬하기 위한 일반 메서드를 작성한 다음 Integer 배열, Double 배열, String 배열 등으로 일반 메서드를 호출하여 배열 요소를 정렬할 수 있습니다.

일반 방법

다른 유형의 인수로 호출할 수 있는 단일 제네릭 메서드 선언을 작성할 수 있습니다. 제네릭 메서드에 전달된 인수 유형에 따라 컴파일러는 각 메서드 호출을 적절하게 처리합니다. 다음은 일반 메서드를 정의하는 규칙입니다 -

  • 모든 일반 메서드 선언에는 메서드의 반환 유형(다음 예제에서는 ) 앞에 꺾쇠 괄호(<및>)로 구분된 형식 매개 변수 섹션이 있습니다.

  • 각 유형 매개변수 섹션에는 쉼표로 구분된 하나 이상의 유형 매개변수가 있습니다. 유형 변수라고도 하는 유형 매개변수는 일반 유형 이름을 지정하는 식별자입니다.

  • 유형 매개변수는 반환 유형을 선언하고 실제 유형 인수라고 하는 제네릭 메서드에 전달된 인수 유형에 대한 자리 표시자 역할을 하는 데 사용할 수 있습니다.

  • 제네릭 메서드의 본문은 다른 메서드와 마찬가지로 선언됩니다. 유형 매개변수는 기본 유형(예:int, double 및 char)이 아닌 참조 유형만 나타낼 수 있습니다.

예시 코드

public class GenericMethodTest {
   // generic method printArray
   public static < E > void printArray( E[] inputArray ) {
      // Display array elements
      for(E element : inputArray) {
         System.out.printf("%s ", element);
      }
      System.out.println();
   }
   public static void main(String args[]) {
      // Create arrays of Integer, Double and Character
      Integer[] intArray = { 1, 2, 3, 4, 5 };
      Double[] doubleArray = { 1.1, 2.2, 3.3, 4.4 };
      Character[] charArray = { 'H', 'E', 'L', 'L', 'O' };
      System.out.println("Array integerArray contains:");
      printArray(intArray); // pass an Integer array
      System.out.println("\nArray doubleArray contains:");
      printArray(doubleArray); // pass a Double array
      System.out.println("\nArray characterArray contains:");
      printArray(charArray); // pass a Character array
   }
}

출력

Array integerArray contains:
1 2 3 4 5
Array doubleArray contains:
1.1 2.2 3.3 4.4
Array characterArray contains:
H E L L O

이제 템플릿과 제네릭의 차이점을 살펴보겠습니다. 차이점은 아래와 같습니다 -

  • Type-Erasure를 사용합니다. 이것은 컴파일 시간에 더 엄격한 유형 검사를 보장합니다. Java의 제네릭은 컴파일 시간 안전성을 제공하고 유형 변환의 필요성을 제거합니다. 이것은 이러한 유형의 삭제가 완료되도록 하기 위해 Java 컴파일러 프론트 엔드에 직접 존재합니다.

  • C++에서 템플릿이 사용되면 컴파일러는 템플릿의 일반 매개변수를 주어진 유형으로 교체한 후 템플릿 코드를 다시 내보냅니다.

  • Java에서는 어떤 객체를 사용하여 함수를 호출하는 데이터 유형을 지정해야 하는 경우에도 필요한 작업을 수행하는 래퍼 클래스가 아니라 실제 데이터 유형을 사용하여 C++의 데이터 유형과 유사하게 유형 변환할 필요가 없습니다.

  • Java 제네릭은 초기화 시 유형 검사를 사용하고 제네릭이 아닌 코드에 해당하는 바이트 코드를 생성합니다. C++에는 "Latern Typing" 및 템플릿 메타 프로그래밍이 있으며 각 인스턴스화에 대해 새 클래스를 생성합니다.