36. 제네릭스

Isaiah IM·2023년 12월 21일
0

java basic

목록 보기
38/38
post-thumbnail

1. 제네릭

1.1 제네릭이란?

제네릭(Generic)은 다양한 타입의 객체들을 다루는 메서드나 컬렉션 클래스에 컴파일할 때 타입 체크(compile-time type check)를 해주는 기능이다.

제네릭은 타입을 일반화 하는 것으로, 여러 자료형을 다루는 자료구조, 메소드에서 특정한 타입으로 일반화를 하는 기능으로, 타입 안정성을 가져다 준다.

list, stack, queue등의 대부분의 자료구조는 int, float와 같은 원시 자료형 뿐 아니라 직접 만든 클래스 까지 다양한 타입의 자료형을 지원한다. 그러나, 대부분 자료구조를 생성하고 사용할때는 특정한 자료형만을 입력받아 연산하곤 한다.
이때, 원하지 않는 타입의 자료형이 입력됬을 경우를 고려해 자료형의 일치 여부를 비교하기에는 상당히 번거롭기 마련이다.

이때 제네릭을 사용하면 자료형을 제한하면서 지정한 자료형 이외의 자료형이 입력되는 현상을 컴파일러 수준에서 방지를 할 수 있다.

1.2 제네릭 클래스 선언

제네릭은 <데이터_타입>형태로 클래스에서는 아래와 같이 선언한다.

class TestClass<T>{
  T item;
  void calculate(T item){
  ...// 연산
  }
}

또한, 클래스에서 사용은 다음과 같다.

TestClass<Integer> test = new TestClass<Integer>();

제네릭은 <데이터_타입>형태로 사용하며, 이때 꺾쇠 사이에 들어가는 자료형은 클래스를 이용한다. 만약 int와 같은 원시클래스를 입력하고자 한다면 Integer, Float등과 같은 래퍼클래스를 사용하면 된다.

제네릭에서 타입은 우리가 임의로 만든 클래스 역시 선언할 수 있다.
또한 TestClass<Integer, Float>와 같이 여러 자료형을 같이 사용할 수 있다.

또한, 제네릭에 선언되는 T, E, V와 같은 알파벳은 다음과 같은 의미로 사용되는 경우가 많다.

1.3 제네릭 제한

제네릭은 static 멤버에서 사용이 불가능하다.
모든 객체에 동일하게 동작해야 하는 static 멤버에는 타입 변수를 적용할 수 없다.
static 멤버는 지정된 타입 변수와 관계 없이 동일한 것이어야 하기 때문이다.

class TestClass<T>{
  static T item;// 오류 발생!
}

또한, 제네릭은 배열로 선언은 가능 하지만 new T[10]과 같이 new 연산자를 통해 배열을 생성하는 것은 불가능하다.
왜냐하면 new 연산자는 컴파일 시점에서 자료형이 명확하게 주어진 경우에만 가능하나, 제네릭은 컴파일 시점에서 정확한 자료형을 알지 못하기 때문이다.


2. 제네릭 사용

2.1 제네릭 클래스의 생성과 사용

2.2 제한된 제네릭 클래스

profile
나는 생각한다. 고로 나는 코딩한다.

0개의 댓글