본문 바로가기

Language/Java

[JAVA] Generics

1. 제네릭스란? 

(1) 사전적 의미 

Generics - 1) 일반적인, 2) 포괄적인 3) 총칭적인

java에서의 의미는 2,3번 뜻에 가깝다. Generics 타입은 여러가지 타입을 포괄한다.

(2) Java에서의  Generics 의미 

다양한 타입으로 이루어진 객체로 이루어진 매소드나 클래스의 타입 체크를 컴파일 시에 해주는 기능을 뜻한다.

어떤 매소드의 파라미터 자료형을 generics로 만들면, 해당 파라미터의 자료형은 들어오는 값의 자료형에 따라 바뀐다. 

2. 제네릭스로 이루어진 매소드의 사용이 필요한 순간? 

우리가 모두 다른 타입의 배열들을 순회 하며 원소값을 전부 출력해야 한다고 가정하자. 

그렇다면, 해당 배열들을 순회하여 값을 출력하는 매소드를 전부 따로 만들어야 할 것이다. 

왜냐하면 자료형이 모두 다르기 때문이다. 

public class Generic_Ex {
	public static void main(String[] args) {
    	int[] iArray = {1,2,3,4,5};
        double[] dArray = {1.0,2.0,3.0,4.0,5.0};
        String[] sArray = {"A", "B", "C", "D","E"};
        
        //하는 일은 같지만, 서로 다른 자료형이므로 매소드를 다 따로 만들어줘야함.
        printIntArray(iArray);
        printDoubleArray(dArray);
        printStringArray(sArray);
        }
        
   // 다 따로 구현
   private static void printIntArray(int[] array){
   		for(int i : array){
    		System.out.print(i + " ");
    	}
    System.out,println();
   }
   
      private static void printDoubleArray(double[] array){
   		for(double d : array){
    		System.out.print(d + " ");
    	}
    System.out,println();
   }
   
      private static void printStringArray(String[] array){
   		for(String s : array){
    		System.out.print(s + " ");
    	}
    System.out,println();
   }
}

하지만 제네릭스를 사용하면, 매소드 하나로 각자 다른 타입의 일을 처리할 수 있다

사용방법은 다음과 같다. 

static과 반환 자료형 사이에 <T>를 넣고 인수의 자료형을 T로 바꾼다.

private static <T> void printAnyArray(T[] array) {
    for (T t:  array) {
        System.out.print(t + " ");
    }
    System.out.println();
}

T는 아무런 단어로도 바꿀 수 있다. <Teacher>... Teacher도 가능하다. 

제일 많이 쓰이는 단어는 Type의 T, Key의 K, Value의 V, Element의 E이다. 

 

*주의점

이제 위의 경우를 모두를 위의 하나의 매소드로 사용 가능하다! 

 

// printIntArray(iArray);
// printDoubleArray(dArray);
printStringArray(sArray);

 아뿔싸! 근데 int와 double array는 해당 매소드를 사용할 수 없다고 뜬다! 

왜 그럴까? 

이유는 Generics가 객체에 관해서만 지원하기 때문이다. 따라서 기본 자료형은 제네릭스의 혜택을 사용하지 못한다. 

그렇다면 어떻게 해야할까? 기본 자료형을 Wrapper 클래스로 바꿔 줘야 한다. 

int[] > Integer[]

double[] > Double[]

float[] > Float[]

이다. 

 

Integer[] iArray = {1,2,3,4,5};
Double[] dArray = {1.0,2.0,3.0,4.0,5.0};

이렇게 바꾸면 printAnyArray() 매소드를 이용할 수 있다.

 

*점검

(1) 제네릭스의 뜻은? 

(2) 제네릭스 자료형을 이용한 매소드가 필요한 순간은?

(3) 제네릭스 자료형 매소드 이용 못하는 경우는? 해결 방법은? 

'Language > Java' 카테고리의 다른 글

[JAVA]Generics 심화  (0) 2023.02.06
[JAVA] Generic Class  (0) 2023.02.03
[JAVA] Interface (인터페이스)  (0) 2023.02.02
[JAVA] 추상화와 추상화 클래스  (0) 2023.02.01
[JAVA]열거형  (0) 2023.01.29