[java] 제네릭 타입의 비교와 정렬

자바에서 제네릭(Generics)은 타입 안정성을 제공하며, 컴파일 시간에 타입 검사를 할 수 있게 해줍니다. 하지만 제네릭 타입끼리의 비교 및 정렬은 몇 가지 주의해야 할 점이 있습니다.

제네릭 비교

제네릭 타입은 코드를 보다 일반화하고 유연하게 작성할 수 있게 도와줍니다. 하지만 제네릭 타입 간 비교 시에는 타입 소거(Type erasure)로 인해 몇 가지 문제가 발생할 수 있습니다. 타입 소거는 컴파일 시에만 사용되고, 런타임에는 해당 정보가 없어지는 현상을 말합니다.

예를 들어, List<String>List<Integer>이 서로 같은지 비교하려고 하면, 제네릭 타입 소거로 인해 컴파일러는 이를 서로 다른 타입으로 간주합니다. 때문에 컴파일 시에는 이런 비교를 할 수 없다는 컴파일 오류가 발생합니다.

제네릭 정렬

제네릭 타입의 정렬은 Comparator 인터페이스를 이용하여 비교를 수행할 수 있습니다.

제네릭 클래스의 객체를 정렬하기 위해서는 Comparator를 통해 compare 메서드를 구현해야 합니다.

public class MyObject implements Comparable<MyObject> {
    // ...

    @Override
    public int compareTo(MyObject other) {
        // compare this object with other object
    }
}

이때 주의할 점은 Comparable 인터페이스를 구현하는 클래스 내에서 타입을 명시해야 한다는 것입니다.

결론

제네릭 타입의 비교 및 정렬은 타입 소거로 인한 제약사항이 있긴 하지만, 적절한 방법으로 해결하면 문제 없이 사용할 수 있습니다.

더 나아가서, 자바 8부터는 제네릭을 더욱 효과적으로 처리할 수 있는 기능이 많이 추가되었으니, 해당 기능들을 적극 활용하면 더 우수한 제네릭 타입의 비교 및 정렬이 가능할 것입니다.

참고 문헌: https://docs.oracle.com/javase/tutorial/java/generics/types.html