공변(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));
}
}
JAVA Interface 인터페이스 (0) | 2022.07.29 |
---|---|
JAVA 추상 메서드와 클래스 Abstract method, class (0) | 2022.07.28 |
JAVA Object class 최상위 클래스 객체 (0) | 2022.07.28 |
JAVA 생성자, 접근 제한자(접근제어자), 추상 클래스 추상 메서드 개념정리 (0) | 2022.07.28 |
JAVA inherit 상속, private, super 생성자 (0) | 2022.07.28 |