JAVA/Collection

제너릭(Generic)이란? 예시와 함께 배워보자

_DoYun 2022. 5. 17. 11:23

Generic을 있는 그대로 직역하자면 "일반적인" 이라는 뜻을 가지고 있습니다. 좀 더 이해하기 쉽게 풀이하자면 데이터 형식에 의존하지 않고 하나의 클래스 또는 메서드 등이 여러 데이터 타입을 가질 수 있는 것을 말합니다. 

 

# Generic

타입 설명
<T> Type
<E> Element
<K> Key
<V> Value
<R> Result

일반적으로 제너릭이 많이 사용하는 타입들입니다. 

 

물론 <FA>나 <PI> 처럼 자신이 생각하는 타입을 만들어서 사용할 수도 있습니다. 그러나 다수가 공유하는 코드일 수록 위와 같이 잘 알려진 타입들을 사용하는 것이 직관성을 높여줄 수 있습니다. 

 

제너릭은 다음과 같이 클래스를 통해 활용할 수 있습니다. 

public class Example <T> {...}

인터페이스 또한 활용이 가능합니다.

public interface SecondExample <T> {...}

 

더불어 타입을 두개 이상 설정하는 것 또한 가능합니다. 

public class Example <K,V> {...}

 

다음은 보다 완성된 코드로 Generic을 이해해 보겠습니다.

class Example<E> {
	
	E num;	
	
	Example(E num){
            this.num = num;
	}
}
 
class Main {
	public static void main(String[] args) {
		
	  Example<String> first = new Example<String>("Hello");
	  Example<Integer> second = new Example<Integer>(10);
		
	  System.out.println(a.num);
	  System.out.println(b.num);
		
	}
}
Hello
10

위 코드처럼 <E>타입의 변수 num에는 String 타입과 Integer 타입 모두 들어갈 수 있습니다. 여기서 주의해야 할 점은 제너릭 타입에 들어갈 수 있는 것은 참조 타입 뿐이라는 것입니다. int, double, char 등의 기본타입은 올 수 없습니다. 

 

Generic 타입은 클래스와 인터페이스 뿐만 아니라 메서드에도 사용할 수 있습니다.

class Example<E> {
	
	E num;	
	
	Example(E num){
            this.num = num;
	}
    
   	<T> T getReturn(T a){
    	  return a;
  	}
}
 
class Main {
	public static void main(String[] args) {
		
	  Example<String> first = new Example<String>("Hello");
	  Example<Integer> second = new Example<Integer>(10);
		
	  first.getReturn("hello");
     	  first.getReturn(10);
      
     	  first.getReturn("hi");
     	  first.getReturn(20);
		
	}
}
hello
10
hi
20

메서드 또한 사용 가능하다는 것을 확인할 수 있었습니다. 주의해야 할 점은 클래스가 특정 제너릭 타입이라고 해서 메서드 또한 그대로 따라가는 것은 아니라는 점입니다.