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();

}

}