제네릭(Generic)

정민교·2022년 9월 15일
0

제네릭이란

데이터 타입을 추후에 지정할 수 있도록 일반화하여
클래스 혹은 메서드에 사용할 데이터 타입이 특정 데이터 타입에 얽매이지 않도록 해둔 것

class Box {
	String item;
    ...
}

위 클래스는 String 타입의 item만 쓸 수 있음
인스턴스 변수 item이 다른 타입도 가지고 싶다면 그에 따라 여러 클래스를 아래와 같이 정의해야 함.

class StringBox { String item ... };
class IntBox { int item ... };
class BooleanBox { boolean item ... };
...

하나의 클래스를 작성하고 그때 그때 원하는 타입의 데이터를 저장하는 인스턴스를 만들고 싶다.
그래서 사용하는 것이 제네릭

class Box<T> {
	T item;
    
    Box(T item) {
    	this.item = item;
    }
    
    public T getItem() {
    	return item;
    }
    
    public void setItem(T item) {
    	this.item = item;
    }
    
}

위 클래스를 정의함으로 하나의 클래스로 원하는 데이터 타입의 인스턴스 변수를 가지는 인스턴스를 생성할 수 있다.

제네릭 클래스

위에서 정의한 클래스가 제네릭 클래스이다.

타입 매개변수

클래스에 사용된 T타입 매개변수
<T>를 클래스이름 옆에 적어서 클래스에서 사용할 타입 매개변수를 선언
여러 타입 매개변수가 필요하면 <K, V> 처럼 여러 개도 사용할 수 있음.

  • T -> Type,
  • K -> Key,
  • V -> Value,
  • E -> Element,
  • N -> Number,
  • R -> Result
    요런 의미를 가짐

인스턴스 생성

Box<Integer> intBox = new Box<>();

이렇게 인스턴스를 생성
<Integer> 는 앞으로 클래스 내에 있는 T를 Integer 로 바꾼다.
원시타입은 안되고 래퍼클래스를 활용해야 함.
Integer는 래퍼클래스이다. 다음에 공부해보자

주의

  • 제네릭 클래스에서 클래스 변수에는 타입 매개변수 사용할 수 없음.
    인스턴스마다 원하는 데이터 타입을 가지는 인스턴스를 가지고 싶어서 씀.
    But 클래스 변수는 모든 인스턴스가 공유함.

  • 제네릭 클래스도 다형성 적용 가능

profile
백엔드 개발자

0개의 댓글