자바의 제네릭스(Generics) 장단점 과 특징

메서드, 클래스, 인터페이스 등 여러가지 타입들이 담길수있는곳에 컴파일 시 타입체크를 해주는 기능이 제네릭스(Generics)라고 부른다

 

주로 List, Set, Map 컬렉션에서 흔하게 볼수있으며 제네릭스를 사용시 얻을수있는 장점과 단점 그리고 특징에 대해서 알아보도록 하자

 

 

 

 

 

 

 

제네릭스(Generics)의 특징


List<String> list = new ArrayList<String>();
Map<String, Integer> map = new HashMap<String, Integer>();

 

 

제네릭스는 < > 안에 타입을 명시함으로써 해당타입이외에 다른 타입이 들어오지 못하게 컴파일 시점에 타입체크를 한다

즉 list 안에는 String 타입만 들어올수있으며, Map에는 String과 Integer타입이 들어올수있다.

 

물론 만들어진 객체를 넣는것도 가능하다

 

클래스 및 인터페이스는 제네릭스를 사용하게되면 객체생성시 타입이 결정되며 메서드는 메서드 사용시 타입이 결정된다

 

 

 

List list = new ArrayList();
Map> map = new HashMap();

 

따로 정의해주지 않을경우 가장 상위 객체타입인 Object타입으로 결정되게 된다

바로 타입을 정의하는 방법도있지만 좀더 유연한 설계를 하기위해 <T> 타입변수를 붙힐수있다

 

 

public class Computer<T> {
	
    T name;
    
    void setComputerName(T name) {
    	this.name = name;
    }

}

 

클래스에 붙은 <T> 타입변수는 타입을 정해놓는게 아니라 객체의 생성시점에서 타입을 넣어줄수있다

 

 

Computer<String> computer = new Computer<String>();
computer.setComputerName("REGION");

 

<T>의 타입변수는 당연하겠지만 static이 붙은곳에서는 사용할수없다

타입변수를 객체별로 들어오는 타입을 유동적으로 사용할수 있게 만든것인데 당연히 static이 붙은곳에서는 사용할수없다

 

static은 따로 힙영역에 하나만 보관되기 때문에 하나의 타입만 존재할수있다

또한 제네릭스는 참조형만 가능하며, 기본형은 불가능하다

 

 

 

Computer<int> computer = new Computer<String>(); 
Computer<boolean> computer = new Computer<String>(); 
불가능

 

 

 

 

 

 

제네릭스(Generics)의 장단점


위에서 봤듯이 제네릭스를 선언해줌에 따라서 컴파일 시점에서 타입을 체크해줄수 있기때문에 객체나 클래스, 인터페이스 등 다양한 타입이 담길수있는곳에 다른타입이 담기는 것을 방지해준다

즉 안정성을 높혀준다고 생각하면 될것이다

 

두번째로 형변환을 해야하는 경우 개발자의 번거로움을 덜해줄수있다

 

 

Computer<String> computer = new Computer<String>();
computer.setComputerName("REGION");
String name = (String) <- 생략가능 computer.getComputerName();

 

 

타입변수 <T>를 이용하고 객체생성 시점에 타입을 명시해줬기때문에 자바에서 어떤타입이 들어가야하는지 추론이 가능해진다

그로인해 형변환을 해야하는 번거로움을 덜해줄수있다