JAVA
JAVA<GENERIC>
yoon9
2021. 3. 31. 12:46
<GENERIC>를 사용하면 좋은 점(?)
컴파일을 할 경우에 강한 타입을 체크를 할 수 있음.
- 컴파일 실행 시 타입 에러를 미리 방지할 수 있음.
캐스팅을 제거할 수 있음.
-
List ls = new ArrayList();
ls.add("안녕하세요");
String st = (String) ls.get(0); //몬가 쓸때없이 ...캐스팅을 하는느낌?..
----------------------------
List<String> ls1 = new ArrayList();
ls1.add("안녕하세요");
String st1 = ls1.get(0); //타입을 "String"으로 정했기때문에 캐스팅 할 필요가 없다.
주로 캐스팅을 방지하기 위하여 사용하는 것 같다..
저장 시에나, 읽어올 때도 타입 변환이 자주 일어나면 프로그램의 성능이 저하가 된다.
public class 클래스명<T>{}
public interface 인터페이스명<T>{}
↑이러한 형태로 제네릭을 선언할 수 있다.
제네릭의 주요 타입 인자는 밑에와 같다.
타입 인자 설명
<T> Type
<E> Element
<K> Key
<N> Number
<V> Value
<R> Result
예를 들어보자.
public class Car<T>{
private T t;
public T get(){
return t;
}
public T set(T t){
this.t = t;
}
}
public class Car1{
public static void main(String[] args){
Car<String> car = new Car<String>();
car.set("현대자동차");
String c = car.get(); //알아서 "String"으로 형 변환을 해준다.
}
}
public class Car2{
public static void main(String[] args){
Car<Integer> car1 = new Car<Integer>();
car1.set(1);
String b= car1.get(); //알아서 "Integer"으로 형 변환을 해준다.
}
}
이런 식으로 car <T> 타입을 정해놓고 인스턴스를 원하는 타입으로 설정해서 사용한다.
멀티 타입 파라미터
말 그래도 제니릭 파라미터를 두 개 이상 선언할 수 있다.
Public class Product<T, M>{
private T t;
private M m;
public void T set(T t){
this.t = t;
}
public void M set(M m){
this.m = m;
}
public T get(){
return this.t;
}
public M get(){
return this.m;
}
}
public class Product1{
public static void main(String[] args){
Product<Phone, String> pd = new Product<>(); //자바7부터 그냥 <> 닫으면됨.
pd.set(new Phone());
pd.set("아이폰");
Phone ph = pd.get(); //인스턴스 생성.
String ip = pd.get();
}
}
제네릭 메소드
public <타입 파라미터 . . . > 리턴타입 메소드명 (매개변수, . . . ) { . . . } //이런식으로 메소드를 선언할 수 있음.
제네릭 메서드는 두 가지 방식으로 호출 가능.
리턴타입 변수 = <구체적인타입> 메소드명(매개값); // 명시적으로 구체적 타입을 지정함.
리턴타입 변수 = 메소드명(매개값); // 매개값을 보고 구체적 타입을 추정함.
//예를 들어보자.
public class Util {
public static<T> Box<T> boxing(T t){
// 타입파라미터 리턴타입 메소드명(매개변수)
Box<T> bx = new Box<T>();
bx.set(t);
return bx;
}
}
public class BoxEm{
public static void main(String[] args){
Box<Integer> bx1 = Util.<Integer>boxing(100);
int val = bx1.get();
}
}