상세 컨텐츠

본문 제목

JAVA Generics Class Method 제네릭 클래스 메서드, 배열 Array

BackEnd/JAVA

by H_Develop 2022. 7. 28. 16:17

본문

공변(covariant) : A가 B의 하위 타입일 때, T <A> 가 T<B>의 하위 타입이면 T는 공변
불공변(invariant) : A가 B의 하위 타입일 때, T <A> 가 T<B>의 하위 타입이 아니면 T는 불공변
 
대표적으로 배열은 공변이며, 제네릭은 불공변이다.

클래스, 메소드에서 사용할 데이터 타입을 나중에 확정하는 기법이다.
그 나중은, 클래스나 메소드 선언 당시가 아닌 사용할 때 
즉, 인스턴스를 생성할 때나 메소드를 호출할 때 정한다는 의미이다.

Object를 사용하면, 코드 중복은 막을 수 있겠지만, 
객체 타입을 컴파일 타임에 체크할 수 없다는 제약사항이 생기고 이로인해 런타임에 타입으로 인한 오류가 발생할 수 있다.
제네릭을 사용하면 Object를 사용할 때와 달리,
객체 타입을 컴파일 타임에 체크할 수 있어서 안정성(type safety)를 높이고 

                                                                        형변환의 번거로움이 줄어든다는 장점이 있다.

타입 안정성(type safety)
 의도하지 않은 타입의 객체가 저장되는 것을 막는다.
 저장된 객체를 꺼내올 때, 다른 타입으로 잘못 형변환하여 발생할 수 있는 오류를 줄인다.

 

제네릭 장점  :  타입 안정성, 코드 간결

 (Java 제네릭은 C++ 템플릿 클래스와 유사한 개념)

 

ArrayList, HashMap과 같은 Collections을 자바 개발자는 자주 사용하게됩니다. 
이때 타입의 안정성을 위해 제네릭(generic)을 사용합니다. 
이 제네릭은 다양한 Type을 지원할 수 있도록 타입 파라미터(type paramter) T를 지원합니다.

 

class GenEx<T> {
	T value;
    public T getValue() {
    	return value;
    }
	public void setValue(T value) {	// value가 매개변수인데, Type에 맞춰 들어간다.
    	this.value = value;
    }
}
public class ex1 {
	public static void main(String[] args) {
    	GenEx<String> v1 = new GenEx<String>();
        v1.setValue("100");
//      v1.setValue(123;) 오류, String 타입의 객체에 int 타입을 넣음
		System.out.println(v1.getValue());
		
		GenEx<Integer> v2 = new GenEx<Integer>();
		v2.setValue(1000);
		System.out.println(v2.getValue() + 10);
		
		GenEx<Double> v4 = new GenEx<Double>();
		v4.setValue(3.14);
		System.out.println(v4.getValue());
    }
}

 

 

배열

 

import java.util.Arrays;
class GenEx {
// 지네릭 타입인 것을 Class 명이나 Method 명 두 곳중 한 곳에 써주면 되는데,
// 메서드를 제네릭 타입으로 한다면, Method명에 T를 붙이는 것이 좋다.
	public <T> void printArr(T[] arr) {
    	// 이제부터는 배열에 들어가는 데이터 타입이 엄격하다.
        // printArr(T arr[])도 가능, 앞에서 T value한 것이나 여기서 T arr[] 한 것이 동일.
        for(int i=0; i<arr.length; i++) {
        	System.out.print(" " + arr[i]);
        }
        System.out.println();
    }
}
public class ex1 {
	public static void main(String[] args) {
    	GenEx gen = new GenEx();
        Integer[] iArr = {1,2,3,4,5};
        Double[] dArr = {1.1, 2.2, 3.3, 4.4, 5.5};
        Character[] cArr = {'a', 'b', 'c', 'd', 'e'};
        String[] sArr = {"I", "like", "java", "so", "much"};
        
        gen.printArr(iArr);	// printArr() 메서드 사용해서 iArr 값 사용
		gen.printArr(dArr);
		gen.printArr(cArr);
		gen.printArr(sArr);
		
		int[] A = {1,2,3,4,5};
		System.out.println(Arrays.toString(A));
    }
}

관련글 더보기