IT'S DO
article thumbnail
Published 2022. 11. 29. 13:21
[JAVA] Generic 정의 개발/JAVA
728x90

1. 제네릭을 사용하면 잘못된 타입이 들어올 수 있는 것을 컴파일 단계에서 방지할 수 있다.

2. 클래스 외부에서 타입을 지정해주기 때문에 따로 타입을 체크하고 변환해줄 필요가 없다. 즉 관리가 편하다.

3. 비슷한 기능을 지원하는 경우 코드의 재사용성이 높아진다.

 

보통 제네릭은 아래 표의 타입들이 많이 쓰인다.

 

타입 설명
<T> Type
<E> Element
<K> Key
<V> Value
<N> Number

Type은 여러가지가 될 수가 있음.

String, Integer, arrayList 등

 

 

# 단일 제네릭 클래스

// 제네릭 클래스

class ClassName<E> {

   private E element; // 제네릭 타입 변수

   void set(E element) {  // 제네릭 파라미터 메소드
      this.element = element;
   }

   E get() {  // 제네릭 타입 반환 메소드
      return element;
   }

}

class Main {
   public static void main(String[] args) {

      ClassName<String> a = new ClassName<String>();
      ClassName<Integer> b = new ClassName<Integer>();

      a.set("10");
      b.set(10);

      System.out.println("a data : " + a.get());
      // 반환된 변수의 타입 출력 
      System.out.println("a E Type : " + a.get().getClass().getName());

      System.out.println();
      System.out.println("b data : " + b.get());
      // 반환된 변수의 타입 출력 
      System.out.println("b E Type : " + b.get().getClass().getName());

   }
}

보면 ClassName이란 객체를 생성할 때 <> 안에 타입 파라미터(Type parameter)를 지정한다.

 

그러면 a객체의 ClassName의 E 제네릭 타입은 String으로 모두 변환된다.

반대로 b객체의 ClassName의 E 제네릭 타입은 Integer으로 모두 변환된다.

 

실제로 위 코드를 실행시키면 다음과 같이 출력된다.

 

 

# 만약 제네릭을 두 개 쓰고 싶다면 이렇게 할 수도 있다.

 

// 제네릭 클래스 

class ClassName<K, V> {
   private K first;   // K 타입(제네릭)
   private V second;  // V 타입(제네릭) 

   void set(K first, V second) {
      this.first = first;
      this.second = second;
   }

   K getFirst() {
      return first;
   }

   V getSecond() {
      return second;
   }
}

// 메인 클래스 
class Main {
   public static void main(String[] args) {

      ClassName<String, Integer> a = new ClassName<String, Integer>();

      a.set("10", 10);


      System.out.println("  fisrt data : " + a.getFirst());
      // 반환된 변수의 타입 출력 
      System.out.println("  K Type : " + a.getFirst().getClass().getName());

      System.out.println("  second data : " + a.getSecond());
      // 반환된 변수의 타입 출력 
      System.out.println("  V Type : " + a.getSecond().getClass().getName());
   }
}

 

결과 

 

이렇게 외부 클래스에서 제네릭 클래스를 생성할 때 <> 괄호 안에 타입을 파라미터로 보내 제네릭 타입을 지정해주는 것. 이 것이 바로 제네릭 프로그래밍이다.

 

위 과정까지는 클래스 이름 옆에 예로들어 <E>라는 제네릭타입을 붙여 해당 클래스 내에서 사용할 수 있는

E 타입으로 일반화를 했다.

그러나 그 외에 별도로 메소드에 한정한 제네릭도 사용할 수 있다.

 

 

# 제네릭 메소드

    public <T> T genericMethod(T o) {  // 제네릭 메소드
      ...
   }
 
[접근 제어자] <제네릭타입> [반환타입] [메소드명]([제네릭타입] [파라미터]) {
      // 텍스트
      }

클래스와는 다르게 반환타입 이전에 <> 제네릭 타입을 선언한다.

위에서 다룬 제네릭 클래스에서 활용해보도록 하자.

 

 제네릭 타입 T / T /  메소드명(제네릭타입, 파라미터) 

public <T extends Object> T parseJSONObject(HashMap<String, String> resultSet, String name, Class<T> type) 

으로 사용할 수 도 있음.

 

출처 : https://st-lab.tistory.com/153

 

자바 [JAVA] - 제네릭(Generic)의 이해

정적언어(C, C++, C#, Java)을 다뤄보신 분이라면 제네릭(Generic)에 대해 잘 알지는 못하더라도 한 번쯤은 들어봤을 것이다. 특히 자료구조 같이 구조체를 직접 만들어 사용할 때 많이 쓰이기도 하고

st-lab.tistory.com

 

profile

IT'S DO

@멋진놈

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!