ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Java 제네릭(Generic) 정리(1)
    Java 2023. 8. 11. 19:42

    제네릭(Generic)

    • 데이터 형식에 의존하지 않고, 하나의 값이 여러 다른 데이터 타입들을 가질 수 있도록 한다.
    • 객체<타입> 객체명 = new 객체<타입>(); 형식으로 사용
    • generic은 클래스 내부에서 지정하는 것이 아니라 외부에서 사용자에 의해 지정되는 것
    • 특정 타입을 지정하는 것이 아니라, 필요에 의해 지정할 수 있도록 하는 일반(generic) 타입을 말한다.
    ArrayList<Integer> list1 = new ArrayList<Integer>();
    ArrayList<String> list2 = new ArrayList<Integer>();
    
    /*
    이 처럼 타입에 String, Integer를 다 사용하고 싶을때,
    String에 대한 클래스, Integer에 대한 클래스 등 하나하나 타입에 따라 만드는 것이 비효율적이다.
    
    그래서 generic을 사용하는 것이다.
    */

     

    - Generic을 대중적으로 사용하는 통상적인 선언 방법

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

     

    • 제네릭 클래스 및 인터페이스
      • 타입은 클래스, 인터페이스 블록 안에서만 유효하다.
      • main에서 사용하고 싶은 타입을 지정해서 사용하면 된다.
      • 파라미터를 참조타입만 사용할 수 있다.
      • 참조타입이 올 수 있기 때문에 사용자가 정의한 클래스도 올수 있다.
      • 기본형 타은 Wrapper Type을 사용한다. (int -> Integer / double -> Double)
    • 제네릭 메소드
      • [접근 제어자] <제네릭타입> [반환타입] [메소드명]([제네릭타입] [파라미터]) {} 형태로 표현
        • ex) public <T> T genericMethod(T o) {}
      • 파라미터 타입에 따라 제네릭타입이 결정된다.
      • 클래스에서 지정한 제네릭유형과 별도로 메소드에서 독립적으로 제네릭 유형을 선언하여 쓸 수 있다.

    * 제네릭 클래스 메소드 예시

    class ClassName<E> {
    	private E element;
    	
    	void set(E element) {
    		this.element = element;
    	}
    	E get() {
    		return element;
    	}
    	
    	<T> T genericMethod(T o) {
    		// 파라미터 타입에 따라 T의 타입이 결정된다.
    		return o;
    	}
    }
    
    /* 인터페이스 선언 방법
    Interface InterfaceName <T> {
    	// code..
    }
    */
    
    class tempClass {
    	// code..
    }
    
    public class Main {
    	public static void main(String[] args) {
    		ClassName<String> temp1 = new ClassName<String>();
    		ClassName<Integer> temp2 = new ClassName<Integer>();
    		ClassName<tempClass> temp3 = new ClassName<tempClass>();
    		
    		temp1.set("1");
    		temp2.set(1);
    		
    		// class 관련
    		System.out.println(temp1.get().getClass().getName() + " / " + temp1.get());	// java.lang.String / 1
    		System.out.println(temp2.get().getClass().getName() + " / " + temp2.get());	// java.lang.Integer / 1
    		
    		// method 관련
    		System.out.println(temp1.genericMethod(1).getClass().getName());		// java.lang.Integer
    		System.out.println(temp1.genericMethod("1").getClass().getName());		// java.lang.String
    		System.out.println(temp1.genericMethod(temp2).getClass().getName());	// ClassName
    	}
    }

     

    출처)

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

Designed by Tistory.