logo

Java의 제네릭

그만큼 자바 제네릭 프로그래밍은 유형이 안전한 객체를 처리하기 위해 J2SE 5에 도입되었습니다. 컴파일 타임에 버그를 감지하여 코드를 안정적으로 만듭니다.

파이썬 경로 설정

제네릭 이전에는 컬렉션에 모든 유형의 개체, 즉 제네릭이 아닌 개체를 저장할 수 있습니다. 이제 제네릭은 Java 프로그래머가 특정 유형의 객체를 저장하도록 강제합니다.

Java Generics의 장점

제네릭의 장점은 크게 3가지입니다. 그것들은 다음과 같습니다:

1) 유형 안전성: 제네릭에서는 단일 유형의 객체만 보유할 수 있습니다. 다른 개체를 저장할 수 없습니다.

Generics가 없으면 모든 유형의 객체를 저장할 수 있습니다.

 List list = new ArrayList(); list.add(10); list.add('10'); With Generics, it is required to specify the type of object we need to store. List list = new ArrayList(); list.add(10); list.add('10');// compile-time error 

2) 유형 캐스팅이 필요하지 않습니다. 객체를 형변환할 필요가 없습니다.

Generics 이전에 Cast를 입력해야 합니다.

 List list = new ArrayList(); list.add('hello'); String s = (String) list.get(0);//typecasting After Generics, we don't need to typecast the object. List list = new ArrayList(); list.add('hello'); String s = list.get(0); 

3) 컴파일 시간 확인: 컴파일 타임에 검사되므로 런타임에 문제가 발생하지 않습니다. 좋은 프로그래밍 전략은 런타임보다 컴파일 타임에 문제를 처리하는 것이 훨씬 낫다는 것을 의미합니다.

 List list = new ArrayList(); list.add('hello'); list.add(32);//Compile Time Error 

통사론 일반 컬렉션을 사용하려면

 ClassOrInterface 

Java에서 Generics를 사용하려면

 ArrayList 

Java의 제네릭 전체 예

여기서는 ArrayList 클래스를 사용하고 있지만 ArrayList, LinkedList, HashSet, TreeSet, HashMap, Comparator 등과 같은 컬렉션 클래스를 사용할 수 있습니다.

 import java.util.*; class TestGenerics1{ public static void main(String args[]){ ArrayList list=new ArrayList(); list.add('rahul'); list.add('jai'); //list.add(32);//compile time error String s=list.get(1);//type casting is not required System.out.println('element is: '+s); Iterator itr=list.iterator(); while(itr.hasNext()){ System.out.println(itr.next()); } } } 

 import java.util.*; class TestGenerics1{ public static void main(String args[]){ ArrayList list=new ArrayList(); list.add('rahul'); list.add('jai'); //list.add(32);//compile time error String s=list.get(1);//type casting is not required System.out.println('element is: '+s); Iterator itr=list.iterator(); while(itr.hasNext()){ System.out.println(itr.next()); } } } 
지금 테스트해보세요

산출:

 element is: jai rahul jai 

Map을 사용한 Java Generics의 예

이제 제네릭을 사용하여 지도 요소를 사용하겠습니다. 여기서는 키와 값을 전달해야 합니다. 간단한 예를 통해 이해해 보겠습니다.

 import java.util.*; class TestGenerics2{ public static void main(String args[]){ Map map=new HashMap(); map.put(1,&apos;vijay&apos;); map.put(4,&apos;umesh&apos;); map.put(2,&apos;ankit&apos;); //Now use Map.Entry for Set and Iterator Set<map.entry> set=map.entrySet(); Iterator<map.entry> itr=set.iterator(); while(itr.hasNext()){ Map.Entry e=itr.next();//no need to typecast System.out.println(e.getKey()+&apos; &apos;+e.getValue()); } }} </map.entry></map.entry>
지금 테스트해보세요

산출

리눅스의 grep 명령
 1 vijay 2 ankit 4 umesh 

일반 클래스

모든 유형을 참조할 수 있는 클래스를 제네릭 클래스라고 합니다. 여기서는 T 유형 매개변수를 사용하여 특정 유형의 일반 클래스를 생성합니다.

일반 클래스를 만들고 사용하는 간단한 예를 살펴보겠습니다.

일반 클래스 만들기:

 class MyGen{ T obj; void add(T obj){this.obj=obj;} T get(){return obj;} } 

T 유형은 모든 유형(예: String, Integer 및 Employee)을 참조할 수 있음을 나타냅니다. 클래스에 대해 지정한 유형은 데이터를 저장하고 검색하는 데 사용됩니다.

일반 클래스 사용:

제네릭 클래스를 사용하는 코드를 살펴보겠습니다.

 class TestGenerics3{ public static void main(String args[]){ MyGen m=new MyGen(); m.add(2); //m.add(&apos;vivek&apos;);//Compile time error System.out.println(m.get()); }} 
지금 테스트해보세요

산출

 2 

유형 매개변수

제네릭을 철저하게 배우려면 유형 매개변수 명명 규칙이 중요합니다. 일반적인 유형 매개변수는 다음과 같습니다.

60의 10%
  1. T - 유형
  2. E - 요소
  3. K - 열쇠
  4. N - 숫자
  5. V - 가치

일반 방법

제네릭 클래스와 마찬가지로 모든 유형의 인수를 받아들일 수 있는 제네릭 메서드를 만들 수 있습니다. 여기서 인수의 범위는 인수가 선언된 메서드로 제한됩니다. 정적 메서드와 비정적 메서드를 모두 허용합니다.

배열 요소를 인쇄하는 Java 일반 메소드의 간단한 예를 살펴보겠습니다. 우리는 여기를 사용하고 있습니다 그리고 요소를 나타냅니다.

 public class TestGenerics4{ public static void printArray(E[] elements) { for ( E element : elements){ System.out.println(element ); } System.out.println(); } public static void main( String args[] ) { Integer[] intArray = { 10, 20, 30, 40, 50 }; Character[] charArray = { &apos;J&apos;, &apos;A&apos;, &apos;V&apos;, &apos;A&apos;, &apos;T&apos;,&apos;P&apos;,&apos;O&apos;,&apos;I&apos;,&apos;N&apos;,&apos;T&apos; }; System.out.println( &apos;Printing Integer Array&apos; ); printArray( intArray ); System.out.println( &apos;Printing Character Array&apos; ); printArray( charArray ); } } 
지금 테스트해보세요

산출

 Printing Integer Array 10 20 30 40 50 Printing Character Array J A V A T P O I N T 

Java Generics의 와일드카드

? (물음표) 기호는 와일드카드 요소를 나타냅니다. 모든 유형을 의미합니다. 이라고 쓴다면 이는 Number의 하위 클래스(예: Integer, Float 및 double)를 의미합니다. 이제 모든 하위 클래스 객체를 통해 Number 클래스의 메서드를 호출할 수 있습니다.

와일드카드를 다음과 같이 사용할 수 있습니다. 매개변수 유형, 필드, 반환 유형 또는 지역 변수입니다. 그러나 제네릭 메서드 호출, 제네릭 클래스 인스턴스 생성 또는 상위 유형에 대한 유형 인수로 와일드카드를 사용할 수는 없습니다. .

아래의 예를 통해 이해해 봅시다.

 import java.util.*; abstract class Shape{ abstract void draw(); } class Rectangle extends Shape{ void draw(){System.out.println(&apos;drawing rectangle&apos;);} } class Circle extends Shape{ void draw(){System.out.println(&apos;drawing circle&apos;);} } class GenericTest{ //creating a method that accepts only child class of Shape public static void drawShapes(List lists){ for(Shape s:lists){ s.draw();//calling method of Shape class by child class instance } } public static void main(String args[]){ List list1=new ArrayList(); list1.add(new Rectangle()); List list2=new ArrayList(); list2.add(new Circle()); list2.add(new Circle()); drawShapes(list1); drawShapes(list2); }} 

산출

 drawing rectangle drawing circle drawing circle 

상한 와일드카드

상한 와일드카드의 목적은 변수에 대한 제한을 줄이는 것입니다. 알 수 없는 유형을 특정 유형 또는 해당 유형의 하위 유형으로 제한합니다. 와일드카드 문자('?'), 확장(클래스의 경우) 또는 구현(인터페이스의 경우) 키워드, 상한이 뒤따르는 방식으로 사용됩니다.

통사론

 List 

여기,

? 와일드카드 문자입니다.

연장하다 , 은(는) 키워드입니다.

숫자 , java.lang 패키지에 있는 클래스입니다.

Number 및 해당 하위 유형(예: Integer, Double) 목록에 대한 메서드를 작성한다고 가정해 보겠습니다. 사용 목록 Number 유형 또는 해당 하위 클래스 목록에 적합합니다. 목록 숫자 유형 목록에서만 작동합니다. 그래서, 목록 보다 덜 제한적입니다. 목록 .

상한 와일드카드의 예

이 예에서는 상한 와일드카드를 사용하여 List 및 List에 대한 메서드를 작성합니다.

 import java.util.ArrayList; public class UpperBoundWildcard { private static Double add(ArrayList num) { double sum=0.0; for(Number n:num) { sum = sum+n.doubleValue(); } return sum; } public static void main(String[] args) { ArrayList l1=new ArrayList(); l1.add(10); l1.add(20); System.out.println(&apos;displaying the sum= &apos;+add(l1)); ArrayList l2=new ArrayList(); l2.add(30.0); l2.add(40.0); System.out.println(&apos;displaying the sum= &apos;+add(l2)); } } 
지금 테스트해보세요

산출

 displaying the sum= 30.0 displaying the sum= 70.0 

무제한 와일드카드

제한되지 않은 와일드카드 유형은 List와 같은 알 수 없는 유형의 목록을 나타냅니다. 이 접근 방식은 다음과 같은 시나리오에서 유용할 수 있습니다.

지도 자바
  • Object 클래스에서 제공하는 기능을 사용하여 지정된 메소드를 구현하는 경우.
  • 제네릭 클래스에 유형 매개변수에 의존하지 않는 메서드가 포함되어 있는 경우.

무제한 와일드카드의 예

 import java.util.Arrays; import java.util.List; public class UnboundedWildcard { public static void display(List list) { for(Object o:list) { System.out.println(o); } } public static void main(String[] args) { List l1=Arrays.asList(1,2,3); System.out.println(&apos;displaying the Integer values&apos;); display(l1); List l2=Arrays.asList(&apos;One&apos;,&apos;Two&apos;,&apos;Three&apos;); System.out.println(&apos;displaying the String values&apos;); display(l2); } } 
지금 테스트해보세요

산출

 displaying the Integer values 1 2 3 displaying the String values One Two Three 

하한 경계의 와일드카드

하한 경계 와일드카드의 목적은 알 수 없는 유형을 특정 유형 또는 해당 유형의 상위 유형으로 제한하는 것입니다. 와일드카드 문자('?'), super 키워드, 하한값을 차례로 선언하여 사용됩니다.

통사론

 List 

여기,

? 와일드카드 문자입니다.

감독자 , 은(는) 키워드입니다.

정수 는 래퍼 클래스입니다.

CSS 코멘트

Integer 목록과 해당 상위 유형(예: Number, Object)에 대한 메서드를 작성한다고 가정해 보겠습니다. 사용 목록 Integer 유형 또는 해당 상위 클래스 목록에 적합합니다. 목록 Integer 유형 목록에서만 작동합니다. 그래서, 목록 보다 덜 제한적입니다. 목록 .

하한 와일드카드의 예

이 예에서는 하한 와일드카드를 사용하여 List 및 List에 대한 메서드를 작성합니다.

 import java.util.Arrays; import java.util.List; public class LowerBoundWildcard { public static void addNumbers(List list) { for(Object n:list) { System.out.println(n); } } public static void main(String[] args) { List l1=Arrays.asList(1,2,3); System.out.println(&apos;displaying the Integer values&apos;); addNumbers(l1); List l2=Arrays.asList(1.0,2.0,3.0); System.out.println(&apos;displaying the Number values&apos;); addNumbers(l2); } } 
지금 테스트해보세요

산출

 displaying the Integer values 1 2 3 displaying the Number values 1.0 2.0 3.0