컴파일 시점에 타입 안정성 보장이 가능. 타입 파라미터를 사용하여 다양한 타입을 처리할 수 있으며, 컴파일러는 이를 검사하여 불일치하는 타입이 사용되는 경우 컴파일 오류를 발생시켜 런타임 시에 발생할 수 있는 오류를 사전에 방지 가능.
타입 파라미터를 사용하여 코드를 작성하면, 각각의 타입에 대해 별도로 작성할 필요 없이, 하나의 코드로 다양한 타입을 처리 가능.
타입이 명시되어 코드를 읽는 사람이 해당 코드를 어떤 타입으로 사용하는지 쉽게 파악 가능.
컴파일 시점에 타입 안정성을 보장하므로, 런타임에 예기치 않은 오류가 발생할 가능성이 감소.
코드의 재사용성이 높아지고 타입을 변경할 때 해당 타입을 사용하는 모든 코드를 일일이 수정할 필요 없이, 하나의 코드만 수정하면 되므로 유지 보수 비용 감소.
제네릭 코드는 일반적으로 타입을 명시하는 코드와 타입 추론을 사용하는 코드로 구성되어 있어 제네릭 코드를 작성할 때는 코드의 가독성과 유지보수성을 고려해야 합니다.
자바에서는 제네릭 타입을 사용할 때, 상속 계층 구조나 인터페이스를 활용하여 타입 제약을 둘 수 있으나 이 경우에도, 모든 타입 제약이 표현 가능하지 않음. 제네릭 타입에 대한 제약을 둘 때는 제약 조건을 표현하기 어려운 경우가 있음.
제네릭 코드를 작성할 때, 컴파일러는 내부에서 자동으로 형변환 코드를 생성하는데 이 과정에서 불필요한 메모리 할당이 발생할 수 있음. 이러한 경우를 방지하기 위해서는, 가능한 한 타입 안정성을 보장하면서도, 불필요한 형변환을 최소화하는 코드를 작성해야 함.
제네릭을 사용하지 않을 경우 Object 타입으로 요소를 처리해야 하기 때문에, 런타임 시에 타입 불일치 오류가 발생할 수 있지만 제네릭을 사용할 경우 컴파일 시점에서 타입 불일치 오류를 검출할 수 있음.
제네릭을 사용하지 않을 경우 타입 변환 코드를 직접 작성해야 하기 때문에, 코드가 복잡해질 수 있으나 제네릭을 사용하면, 코드가 더 간결하고 명확함.
제네릭 코드는 다양한 타입에 대해서 동일한 동작을 수행할 수 있기 때문에, 다른 프로젝트에서도 재사용이 가능.
제네릭을 사용하지 않을 경우 컬렉션 클래스에 요소를 추가할 때마다 타입 변환을 수행해야 하지만 제네릭을 사용할 경우 컴파일 시점에 타입 변환 코드를 자동으로 생성하기 때문에, 불필요한 성능 저하를 방지할 수 있음.