[java] 제네릭스 (generics) 사용법
List<데이터형>등은 보이는 일도 많을까 생각합니다
.
데이터형에는 Integer형이나 String형 등을 지정할 수 있어, 다양한 데이터형에서도 똑같이 처리할 수 있어 편리합니다.
이 기능을 제네릭스라고 부르며, 자작의 클래스나 메소드에서도 이용할 수 있습니다.
제네릭스(Generics·총칭형)이란
제네릭스란 「<>」기호로 둘러싸인 데이터형명을 클래스나 메소드에 붙이는 것으로, Integer형이나 String형등의 다양한 형태에 대응하는 범용적인 클래스나 메소드를 만드는 기능입니다.
제네릭을 사용하지 않으면 데이터 형식 불일치로 인해 런타임에 오류가 발생할 수 있습니다.
예)
class ClassSample {
private Object o ;
public ClassSample ( Object o ){
this . o = o ;
}
public Object getO () {
return o ;
}
}
public class Main {
public static void main ( String [] args ) {
ClassSample cs = new ClassSample ( "Hello" );
Integer i = ( Integer ) cs . getO ();
System . out . println ( i );
}
}
실행 결과:
Exception in thread "main" java . lang . ClassCastException : java . lang . String
cannot be cast to java . lang . Integer at Main . main ( Main . java : 18 )
이 예제는 컴파일 할 수 있지만 런타임에 오류가 발생합니다.
이 예제와 같은 런타임 오류를 방지할 수 있는 기능은 제네릭입니다.
클래스에서 제네릭을 사용하는 방법
이전 예제의 문제는 클래스에서 제네릭스를 사용하면 해결됩니다.
이제 제네릭을 사용하는 방법을 살펴 보겠습니다.
class ClassSample < T >{
private T t ;
public ClassSample ( T t ){
this . t = t ;
}
public T getT () {
return t ;
}
}
public class Main {
public static void main ( String [] args ) {
// String 타입으로 사용 가능
ClassSample < String > cs1 = new ClassSample < String >( "Hello" );
String str = cs1 . getT ();
System . out . println ( str );
// Integer 형식으로 사용 가능
ClassSample < Integer > cs2 = new ClassSample < Integer >( 1 );
Integer i = cs2 . getT ();
System . out . println ( i );
}
}
실행 결과:
Hello
1
이 예제에서는 ClassSample 클래스 이름 뒤에 '<T>'를 씁니다.
이 「<T>」를 기술하는 것으로, 데이터형의 지정이 Object형으로부터 T형(형 변수)으로 변경됩니다.
Main 클래스의 main 메소드로 ClassSample 클래스를 인스턴스화할 때는, 데이터형을 「<>」기호로 지정할 필요가 있습니다.
제네릭스의 기능을 사용하는 것으로, ClassSample 클래스의 오브젝트를 호출하는 getT 메소드는 캐스트 하지 않고, 지정한 형태에 값을 대입할 수가 있습니다 .
이것에 의해 실행시에 데이터형의 불일치로 에러가 발생하는 일 없이, String형이나 Integer형 등 다양한 형태로 사용할 수가 있습니다.
메서드에서 제네릭을 사용하는 방법
제네릭스는 메소드에 대해서도 사용할 수 있습니다.
메소드를 정의할 때 리턴값의 유형 이름인 T 앞에 '<T>' 절을 작성해야 합니다.
이쪽도 샘플 코드로 봅시다.
public class Main {
public static void main ( String [] args ) {
String str = getT ( "Hello" );
System . out . println ( str );
Integer i = getT ( 1 );
System . out . println ( i );
}
private static < T > T getT ( T t ){
return t ;
}
}
실행 결과:
Hello
1
요약
여기에서는 제네릭스에 대해 클래스나 메소드에서의 사용법에 대해 설명했습니다.
Integer형이나 String형과 같이 다양한 데이터형으로 같은 처리를 하고 싶은 경우에 데이터형마다 각각 처리를 기술할 필요가 없어집니다.
또한 런타임 오류가 발생할 위험이 없습니다.