Topic
Generic
What I Learned
제네릭(Generic)
정의
- 특정 클래스나 메소드 내부에서 사용할 데이터 타입을 외부에서 지정하는 기법
- 클래스와 인터페이스, 메소드를 정의할 때 타입을 파라미터로 사용할 수 있어 외부에서 Type을 전달
- 특정 데이터 형식에 의존하지 않고, 하나의 값이 여러 다른 데이터 타입들을 가질 수 있는 기술에 중점을 두어 재사용성을 높일 수 있는 프로그래밍 방식
특징
- 타입 안정성(Type Safety): 컴파일 시점에 타입을 체크하여 런타임 오류 예방
- 형 변환 제거(No Casting): 타입이 고정되어 있어 명시적 형 변환이 필요 없음
- 재사용성(Reusability): 하나의 클래스나 메소드로 여러 타입 처리 가능
- 가독성 향상(Readability): 코드의 의미가 명확해져 유지보수에 용이
- 제한된 타입 사용(Bounded Type Parameters):
T extends Number처럼 제한 가능
- 와일드카드 지원(?):
?, ? extends, ? super로 타입 유연성 제공
- 타입 소거(Type Erasure): 컴파일 후에는 제네릭 타입 정보가 제거됨
선언 방법
- 클래스나 인터페이스 이름 뒤에 <Type> 기호를 추가하여 타입을 파라미터로 지정합니다.
- 타입 파라미터는 변수와 동일한 규칙에 따라 작성되고 일반적으로 대문자 한 글자로 표현합니다.
public class SampleClass<T> { ... }
public intreface SampleInterface<T> { ... }
SampleClass<String> sampleClass1 = new SampleClass<String>();
SampleClass<String> sampleClass2 = new SampleClass();
멀티 타입 파라미터
- 제네릭은 두 개 이상의 멀티 타입 파라미터 사용이 가능합니다.
- 각각 타입 파라미터를 콤마로 구분하여 선언합니다.
제네릭 메소드
public <T> T methodName(T param, ...) { ... }
<String>methodName(arguments);
methodName(arguments);
타입 파라미터 제한
- 타입 파라미터 뒤에
extends 키워드를 사용하여 상위 타입을 지정합니다.
- 상위 타입은 클래스와 인터페이스도 가능합니다.
- 타입 파라미터 변수에서 상위 타입의 멤버(필드, 메소드)만 접근할 수 있습니다.
와일드 카드 타입 파라미터
? 어떤 타입이든 전체를 포괄
- 내부에서
Object로 읽기 가능
- 쓰기 불가능
? extends T T 또는 그 하위 타입
? super T T 또는 그 상위 타입
T 타입의 멤버로 쓰기 가능
Object로만 읽기 가능
상속과 구현
- 제네릭 타입의 클래스나 인터페이스를 상속받을 경우 자식 클래스도 제네릭 타입으로 정의해야 합니다.
- 자식 제네릭 타입은 부모의 제네릭 타입에서 확장할 수 있습니다.
To study
- 와일드카드 타입, 공변과 불공변, 상한 타입과 하한 타입