여러분이 집에 도착했을 때 두 개의 상자가 놓여 있습니다. 하나는 아무것도 적히지 않은 상자, 다른 하나는 보낸 곳과 물품이 무엇인지가 적혀 있는 상자 이렇게 두 개가 있습니다.
이때 여러분들은 아무것도 적혀 있지 않은 상자는 경계심을 가질 수밖에 없을 것입니다. 열어봐야 그 안에 무엇이 있는지 알 수 있기 때문이죠.
이 경우 적어도 안에 무엇이 들어있는지 정도는 알려주면 좋을 것 같다는 생각이 들지 않나요?
코드에서도 마찬가지입니다.
클래스 안에 어떤 형태가 들어있는지 알려주지 않는 것보다는 알려주는 것이 편리한 경우가 있습니다.
우리는 이 클래스 안에 어떤 형태의 데이터가 들었는지 알려주는 꺾쇠 모양을 제너릭(generic)이라고 부릅니다. 그리고 이 제너릭 안에 해당 클래스가 사용할 데이터 타입을 지정해 줄 수 있습니다.
단 규칙이 하나 있는데, 클래스형 타입으로 넣어야 한다는 점입니다.
위 Box 클래스의 경우 선언 시 Integer를 넣으면 int 형태로, String을 넣으면 String 형태로 멤버 변수들이 변하고 있죠? 이렇게 제너릭에 사용할 타입을 넣으면 해당 클래스의 멤버 변수는 모두 동일한 타입을 사용하게 됩니다.
그래서 제너릭을 사용할 수 있는 클래스는 일반 클래스와 모양이 다릅니다.
제너릭을 사용하는 클래스는 우선 <> 모양 안에 T라는 문자가 눈에 들어옵니다. 그리고 멤버 변수에도 마찬가지로 T라는 문자가 보이죠?
즉, 제너릭 안의 T에 특정 데이터타입이 정해진다면 나머지 T 도 같은 형태로 변경하게 되는 것입니다.
이때 T라는 문자는 Type의 약자입니다만 꼭 T 일 필요는 없습니다.
그런데 아시다시피 클래스 안에 있는 멤버변수들은 한 가지 데이터 타입만을 사용하는 경우는 흔치 않습니다.
그래서 클래스 안에 여러 데이터 타입을 사용하고 싶다면 콤마로 여러 문자를 넣어주면 됩니다.
이렇게 순차적으로 원하는 데이터 타입을 지정해 주면 클래스의 멤버 변수들은 해당 데이터 타입을 갖게 됩니다. 어렵지 않죠?
그리고 이번엔 데이터 타입을 받는 문자를 각 데이터타입의 앞 글자를 따서 넣어봤습니다.
앞서 언급했듯이 이 문자들이 꼭 T 일 필요는 없으니까요.
이렇게 제너릭을 활용하면 특정 클래스를 사용할 때마다 안에 있는 데이터타입을 유연하게 변경시킬 수 있습니다. 그리고 사용자에게는 이제 이 클래스에는 어떤 데이터를 담을 수 있겠구나 하는 정보를 사용 전에 알 수 있도록 해주게 됩니다.
그런데 클래스는 상속을 받을 수 있다는 사실, 알고 계시죠? 그럼 이 제너릭 역시도 클래스의 일부인데 상속받을 수 있을까요? 이미 답은 알고 계실 겁니다. 당연히 상속이 가능합니다.
하지만 어떻게(HOW)가 남아있죠?
우선 우리가 그동안 배워왔던 일반적인 상속의 모습을 살펴보겠습니다.
RamenBox 클래스는 Ramen 클래스의 멤버인 a와 b는 물론 자신의 멤버인 c 도 사용 할 수 있습니다.
이번엔 제너릭을 사용한 클래스의 상속입니다.
부모의 클래스를 가져오는데, 이때 부모의 제너릭 타입도 함께 가져오게 됩니다.
그리고 자식 클래스 선언 시 부모 제너릭 타입과 자식 제너릭 타입을 함께 적어줘야 합니다.
이렇게 제너릭에 대해서도 알아보았는데요.
여기 까지를 여러분들이 잘 공부했다면 앞으로 배우는 자바의 사용법에 대해서 보다 쉽게 이해하 실 수 있을 것입니다. 그래서 저는 여기까지의 내용을 자바의 기본개념 이라고 부르곤 합니다.
다음부터는 보다 높은 수준의 자바 프로그래밍 개념에 대해서 배워볼 건데요.
오히려 지금까지 해온 것보다 더 쉬울 수 있습니다.