개발/JAVA

[java] 제네릭스 (generics) 사용법

외노자개발 2022. 10. 31. 16:41
반응형

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형과 같이 다양한 데이터형으로 같은 처리를 하고 싶은 경우에 데이터형마다 각각 처리를 기술할 필요가 없어집니다.

 

또한 런타임 오류가 발생할 위험이 없습니다.

반응형