<aside>
💡
타입을 컨파일시 결정하는게 아닌 실행할 때 결정
타입매개변수 <T> 클래스, 인터페이스, 메서드에 붙힐 수 있다.
</aside>
Generic이란
-
타입 추론
- 제네릭 메서드를 호출할 때 인자들의 타입을 참고하여 컴파일러가 알맞은 타입 매개변수를 자동으로 결정한다
- 개발자는 타입을 별도로 명시할 필요가 없으므로 코드가 더 간결해진다.
-
명시작 타입 지정
- 가끔 컴파일러의 추론이 원하는 타입과 다르게 작동할 수 있지만 호출 시점에 타입을 명확히 지정하여 코드 가독성을 높이고자 할 때 사용한다.
- 타입을 명시적으로 지정하면 오류를 방지하고 의도를 명확히 할 수 있다.
Generic 선언 및 생성
- 클래스나 메서드에서 사용할 데이터 타입을 객체를 만드는 시점에서 결정할 수 있도록 해주는 기능
- 컴파일시 타입 안정성을 확보하고, 형변환을 줄여준다는 장점이 있다.
- 클래스 또는 인터페이스 이름 뒤에 <>(다이아몬드 연산자) 기호를 추가하고 안에 식별자 기호를 지정하여 파라미터화 할 수 있다.(<>안에 매개변수를 넣는거)
타입 파라미터 기호 네이밍
- 제네릭 기호를 와 같이 써서 표현했지만 사실 식별자 기호는 문법적으로 정해진것은 없다.
- 다만 우리가 for문을 이용할 때 루프 변수를 i로 지정해서 사용하듯이, 제네릭의 표현변수를 T로 표현한다고 보면 된다. 만일 두번째, 세번째 제네릭이 필요하다고 하면 S,U로 이어나간다.
타입 |
설명 |
<T> |
타입(Type) |
<E> |
요소(Element) |
<K> |
키(Key) |
<V> |
값(Value) |
<N> |
숫자(Number) |
public class A<T> {
T value;
}
A<String> a = new A<>();
a.value = "문자열";//문자열
A<Integer> a = new A<>();
a.value = 10;//정수
⇒ 타입 매개변수에 전달 → String value로 되는거
⇒제네릭은 형변환 안됨
클래스 타입의 매개변수에 쓸 수 있는거 (?타입을 쓸 수 없다)