▶ 제네릭(Generic)이란?
: 클래스 내부에서 사용할 데이터의 타입을 외부에서 지정하는 기법.
즉, 클래스를 정의할 때 매개변수의 데이터 타입을 확정하지 않고, 인스턴스를 생성할 때 데이터 타입을 지정하는 기능이다.
▶ 제네릭(Generic)의 특정
1) 타입의 안정성, 코드의 간결화
-> 잘못된 타입 사용으로 일어날 수 있는 문제를 제거할 수 있다.
제네릭을 사용하면 구체적인 데이터 타입을 인스턴스에 따라 지정할 수 있어서 중복의 제거와 타입의 안정성을 동시에 추구할 수 있다.
2) 복수의 제네릭
-> class Person<T, S>
위와 같은 형식(쉼표로 구분)으로 복수의 제네릭을 사용할 수 있다.
3) 기본 데이터 타입과 제네릭
-> 제네릭은 참조 데이터 타입에서만 사용할 수 있다.
기본데이터 타입에서는 래퍼(Wrapper) 클래스를 사용해야 한다.
ex) Integer i = new Integer(10);
위와 같은 기본 데이터 타입인 int형을 써야된다면, int를 참조 데이터 타입으로 변환해주는 int의 래퍼클래스인 Integer를 사용할 수 있다.
4) 제네릭의 생략
-> 매개변수의 데이터 타입을 알고 있으면 (위에서 썼다면) 생략해도 된다.
5) 메소드에 적용
-> 클래스에서만 쓸 수 있는 것이 아니라, 메소드에서도 쓸 수 있다.
6) 제네릭의 제한(Extends)
-> 제네릭으로 올 수 있는 데이터 타입을 특정 클래스의 자식으로 제한할 수 있다.
class Person <T extends Info> {}
▶ 제네릭(Generic) 사용법
-> <>로 표현한다.
<T> : 전달 되는 객체가 클래스의 자료형(type)으로 사용되는 경우
<E> : 전달 되는 객체가 클래스의 요소(Element)로 사용되는 경우
<K> : 전달 되는 객체가 클래스의 키(Key)로 사용되는 경우
<V> : 전달 되는 객체가 클래스의 값(value)로 사용되는 경우
▶ 제네릭(Generic) 예제(1)
class SimplePair<T> { //클래스 옆에 <T>로 가상의 자료형 명시. 만약 <T>를 붙이지 않는다면 변수 선언시에
//T와 같은 가상의 자료형을 붙이는 것이 불가능하다. 따라서 가상의 자료형을 명시할 경우
//클래스명 옆에 <가상자료형명>을 입력해준다.
private T data1;
private T data2;
public SimplePair(T data1, T data2) {
this.data1 = data1;
this.data2 = data2;
}
public T getFirst() {
return data1;
}
public T getSecond() {
return data2;
}
public void setFirst(T data1) {
this.data1 = data1;
}
public void setSecond(T data2) {
this.data2 = data2;
}
}
public class Ex14 {
public static void main(String[] args) {
//객체 변수를 생성하고 데이터를 입력
//SimplePair 객체 생성시 가상 자료형 String의 자료형 명시
SimplePair<String> pair = new SimplePair<String>("apple", "tomato");
//getter 메소드를 통해 데이터를 획득
System.out.println(pair.getFirst());
System.out.println(pair.getSecond());
}
}
▶ 제네릭(Generic) 예제(2)
public class GenericEx1 <T> {
T[] v;
//클래스 옆에 <T>로 가상의 자료형 명시. 만약 <T>를 붙이지 않는다면 변수 선언시에
//T와 같은 가상의 자료형을 붙이는 것이 불가능하다. 따라서 가상의 자료형을 명시할 경우
//클래스명 옆에 <가상자료형명>을 입력해준다.
//배열 타입의 인수가 주어졌으므로 매개변수도 배열로 주어져야 한다.
public void set(T[] n) {
v = n;
}
public void print() {
//확장 for문을 활용해 데이터 출력
for(T s : v) //T s -> 반복에 사용할 변수, v -> 배열이름
System.out.println(s);
}
}
public class Ex16 {
public static void main(String[] args) {
// 객체 생성, 자료형은 String
GenericEx1<String> t = new GenericEx1<String> ();
//GenericEx1 객체 생성시 가상 자료형 String의 자료형 명시
//배열 변수 생성
String[] ss = {"Ye~", "Ah~", "Seo"};
//setter 메소드를 활용해 객체에 데이터 저장
t.set(ss);
//저장된 데이터 출력
//제네릭 표현으로 인해 별도의 형변환이 필요가 없다.
t.print();
}
}
'JAVA' 카테고리의 다른 글
[java] Map예제 - map을 이용해 이름으로 전화번호 검색 하기 (0) | 2022.04.02 |
---|---|
java 컬렉션(Collection)이란? (+ 예제) (0) | 2022.03.29 |
java 래퍼클래스(Wrapper class)란? (0) | 2022.03.24 |
java 인터페이스 interface (+추상클래스 차이점&유사점) (0) | 2022.03.20 |
java 추상클래스(abstract class) +추상메소드 목적 (0) | 2022.03.19 |
댓글