blues_log
Published 2023. 6. 10. 18:23
[Java] 제네릭(Generic) Java/Java 정리

제네릭 (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