제네릭 (Generic)이란?
제네릭이란 클래스 내부에서 사용할 데이터 타입을 외부에서 지정하는 기법을 의미한다.
다음 코드를 보면,
class Person<T>{
public T info;
}
public class GenericDemo {
public static void main(String[] args) {
Person<String> p1 = new Person<String>();
Person<StringBuilder> p2 = new Person<StringBuilder>();
}
}
여기서 차이점은 각각의 인스턴스를 생성할 때 사용한 <> 사이에 어떤 데이터 타입을 사용했는가이다.
class Person<T>{
public T info;
}
여기서 info라는 필드는 T라는 데이터 타입을 갖는다. 여기서 T라는 데이터 타입은 Person이라는 클래스 옆에 <>안에 지정이 되어있고, 이 T라는 데이터 타입은 위에서 언급했듯이 각각의 인스턴스를 생성할 때 사용한 <> 사이의 데이터 타입을 따라간다. 즉,
Person<String> p1 = new Person<String>();
여기서 T는 String의 데이터 타입을 갖고,
Person<StringBuilder> p2 = new Person<StringBuilder>();
여기서 T는 StringBuilder의 데이터 타입을 갖는다.
정리해보면 p1.info와 p2.info의 데이터 타입은 아래와 같다.
- p1.info : String
- p2.info : StringBuilder
제네릭을 사용하는 이유
제네릭을 사용하는 이유는 다음과 같이 정리할 수 있다.
- 중복되는 코드를 제거해주기 때문에 코드의 가독성을 높여준다.
- 제네릭의 데이터 타입은 참조형만 가능한데, 이는 컴파일 단계에서 오류를 검출할 수 있게한다.
- 즉, 런타임 단계가 아니기 때문에 비교적 안정성이 높아진다.
제네릭의 특성
1) 복수의 제네릭을 사용할 수 있다.
class Person<T, S>{
public T info;
public S id;
Person(T info, S id){
this.info = info;
this.id = id;
}
위와 같이 복수의 제네릭은 서로 이름이 다르고 쉼표로 구분해서 사용할 수 있다.
2) 제네릭의 데이터 타입은 참조형만 가능하다.
즉, 기본형을 사용하기 위해서는 Wrapper class를 사용해야한다. 래퍼클래스에 관한 내용은 여기 확인 !
3) 제네릭은 생략해서 사용 가능하다. (Java가 인식하는 경우에 !)
EmployeeInfo e = new EmployeeInfo(1);
Integer i = new Integer(10);
Person<EmployeeInfo, Integer> p1 = new Person<EmployeeInfo, Integer>(e, i);
Person p2 = new Person(e, i);
//자바는 생성자의 매개변수를 통해 제네릭을 인식할 수 있음 !! 따라서 생략이 가능하다!
4) 제네릭은 메소드에 적용할 수 있다.
public <U> void printInfo(U info){
System.out.println(info);
}
제네릭의 제한
제네릭으로 올 수 있는 데이터 타입을 특정 클래스의 자식으로 제한할 수 있다.
package org.opentutorials.javatutorials.generic;
abstract class Info{
public abstract int getLevel();
}
class EmployeeInfo extends Info{
public int rank;
EmployeeInfo(int rank){ this.rank = rank; }
public int getLevel(){
return this.rank;
}
}
class Person<T extends Info>{
public T info;
Person(T info){ this.info = info; }
}
public class GenericDemo {
public static void main(String[] args) {
Person p1 = new Person(new EmployeeInfo(1));
Person<String> p2 = new Person<String>("부장");
}
}
여기서
class Person<T extends Info>{
이 부분을 확인해보면 Person의 T는 Info 클래스나 그 자식 이외는 올 수 없다.
// extends는 상속뿐 아니라 구현의 관계에서도 사용할 수 있다.
참고
https://opentutorials.org/module/516/6237 (제네릭)
제네릭 - Java
제네릭이란? 제네릭(Generic)은 클래스 내부에서 사용할 데이터 타입을 외부에서 지정하는 기법을 의미한다. 말이 어렵다. 아래 그림을 보자. 위의 그림은 아래의 코드를 간략화한 것이다. package or
opentutorials.org
'Java > Java 정리' 카테고리의 다른 글
[Java] static (0) | 2023.06.09 |
---|---|
[Java] 향상된 for 문 (0) | 2023.06.08 |
[Java] 예외 (0) | 2023.06.08 |
[Java] 배열(Array) (0) | 2023.05.23 |
[Java] 반복문 - while 문 (0) | 2023.05.18 |