제네릭 <T>

정통파 개발자·2024년 9월 15일

CS

목록 보기
1/1

언젠가 자바 개발자로 이직 면접 중에 "제네릭 개념에 대해 설명해보세요." 라는 질문을 받았었다. 그때 당시 면접기출 문제를 달달 외워갔던터라, 개념도 모르고 대충 얼버무리며 대답했던 경험이 생각이 난다.
현재 타입스크립트를 작성하는 개발자로 또 다시 마주한 T.... 이제야 비로소 제네릭이란 도대체 무엇이고, 언제 유용하게 쓰는지 공부해보기로 했다!

제네릭(Generic)이란?

개념

제네릭, 영어 사전적 의미로 일반적인 이라는 뜻을 가진다.
객체지향의 개념을 가진 언어에서 클래스 또는 메서드 내부의 데이터 타입을 일반화하는 것을 말한다.
그리고 실제 로직 내부에서 인스턴스를 생성할때 타입을 지정한다!

문법

타입 매개변수

제네릭은 <> 꺽쇠 괄호 키워드를 사용하고 꺽쇠 괄호 안에 식별자 기호(보통 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 타입 전용으로 만든 클래스에 문자열 파라미터가 들어가면, 컴파일 과정에서는 에러가 발생하지 않으나, 런타임 오류가 발생할 수 있다.
이를 위해 제네릭은 제한을 걸어 둘 수 있다.

extends, super, ?(와일드카드)

  • extends T
    상한 경계로 T와 T의 사존 타입에 대해서만 지정 가능하다.
    T를 Food Class로 지정시, Food 클래스를 상속한 Water, Pizza, HawaiiPizza, CombiPizza 모두 가능
  • super T
    하한 경계로 T와 T 부모 타입에 대해서만 지정가능하다.
    T를 Pizza로 지정시, Pizza, Food만 사용가능

장점

  • 코드의 재사용성
  • 코드의 확장성
profile
🙋🏻‍♀️

0개의 댓글