[Java 활용] 3.1 제네릭(Generic)

제네릭(Generic)은 여러 형식에 맞게 재사용할 수 있는 코드를 정의하는 기술을 말합니다. 제네릭 코드를 정의할 때는 가상의 형식 이름을 <가상 형식 이름> 처럼 정의하고 사용하는 곳에서 어떠한 형식에 관한 코드를 사용할 것인지 명시하여 사용하는 기법입니다.

 

먼저 제네릭 클래스를 정의할 때는 클래스명 뒤에 <가상 형식 이름>을 명시하여 만들 수 있습니다.

class 클래스명<가상 형식 이름>{

}

 

사용하는 곳에서는 가상 형식 이름 대신 구체적으로 사용할 형식을 결정하여 <사용할 형식 이름>을 명시하여 사용합니다.

클래스명<사용할 형식 이름> 변수명 = new 클래스명<사용할 형식 이름>();

 

다음은 정수 형식을 보관하는 정수 적 배열 클래스와 제네릭 형식으로 원하는 형식을 사용자가 결정할 수 있는 제네릭 동적 배열 클래스를 정의한 것입니다.

 

▷ 소스 3.1 정수 동적 배열과 제네릭 동적 배열 예

▷ 소스 3.1 실행 결과

 

또한 메소드의 특정 인자 형식을 제네릭 형태로 표현할 수도 있습니다. 이 때 메소드 리턴 형식 이름 앞에 <가상 형식 이름>으로 명시하여 작성합니다. 이러한 메서드를 제네릭 메서드라 부르며 호출하는 곳에서는 실제 값 형식을 알고 있기 때문에 형식 이름을 명시할 필요가 없습니다.

 

다음은 제네릭 메서드를 정의하여 사용한 예입니다. 여기서 제네릭 메서드는 전달받은 값을 출력한 후에 다시 그 값을 반환하는 메서드로 큰 의미는 없습니다. 단지 제네릭 메서드를 보여주기 위함입니다.

 

▷ 소스 3.2 제네릭 메서드

▷ 소스 3.2 실행 결과

 

제네릭을 표현할 때 특정한 규약을 따르는 형식만 사용할 때도 있습니다. 만약 정렬 메서드를 제공하려면 개체의 값을 비교할 수 있어야 할 것입니다. Java 라이브러리에는 Comparable 인터페이스를 정의하고 있고 비교할 수 있는 형식을 정의할 때 Comparable 인터페이스를 기반으로 구현 클래스를 정의하는 것을 권장합니다. 따라서 정렬 메서드를 제공할 때 최소한 Comparable 인터페이스를 기반의 구현 클래스로 한정할 필요가 있습니다. 주의할 점은 인터페이스일 때도 <가상 형식 이름 extends 특정 형식 이름> 형태로 표현해야 합니다.

 

다음은 정적 메서드 Sort의 입력 매개 변수로 Comparable 인터페이스로 한정한 제네릭 메서드를 구현한 예제입니다.

 

▷ 소스 3.3 Comparable 인터페이스로 한정한 제네릭 메서드 Sort

▷ 소스 3.3 실행 결과