언젠가 자바 개발자로 이직 면접 중에 "제네릭 개념에 대해 설명해보세요." 라는 질문을 받았었다. 그때 당시 면접기출 문제를 달달 외워갔던터라, 개념도 모르고 대충 얼버무리며 대답했던 경험이 생각이 난다.
현재 타입스크립트를 작성하는 개발자로 또 다시 마주한 T.... 이제야 비로소 제네릭이란 도대체 무엇이고, 언제 유용하게 쓰는지 공부해보기로 했다!
제네릭, 영어 사전적 의미로 일반적인 이라는 뜻을 가진다.
객체지향의 개념을 가진 언어에서 클래스 또는 메서드 내부의 데이터 타입을 일반화하는 것을 말한다.
그리고 실제 로직 내부에서 인스턴스를 생성할때 타입을 지정한다!
제네릭은 <> 꺽쇠 괄호 키워드를 사용하고 꺽쇠 괄호 안에 식별자 기호(보통 T)를 지정함으로써 파라미터화 할 수 있다. 이것은 마치 메소드가 매개변수를 받아 사용하는 것과 비슷하여 타입 매개변수 라고 부른다.
클래스명 옆에 <T> 라는 기호로 제네릭을 붙여줬다. 그리고 클래스 내부에서 식별자 기호 T를 클래스 필드와 메소드의 매개변수의 타입으로 지정했다.
class Member<T> {
List<T> users = new ArrayList<>();
public void signUp(T user) {
users.add(user);
}
}
Member<String> strMemebers = new Member<>();
Member<Integer> intMembers = new Member<>():
class Cart<T, U> {
List <T> carts = new ArrayList<>();
List <U> baskets = new ArrayList<> ();
public void add(T cart, U basket) {
carts.add(cart);
baskets.add(basket);
}
}
Cart<String, String> myCart = new Cart<>();
제네릭은 참조형 타입을 모두 받을 수 있기때문에 발생하는 사이드이펙트가 있다.
만약 Integer 타입 전용으로 만든 클래스에 문자열 파라미터가 들어가면, 컴파일 과정에서는 에러가 발생하지 않으나, 런타임 오류가 발생할 수 있다.
이를 위해 제네릭은 제한을 걸어 둘 수 있다.
