본문 바로가기

아옳옳의 코딩공부/아옳옳 자바코딩공부

2021-04-09 자바공부 (제네릭)

반응형

이렇게 두가지 방법으로 클래스를 만들 었다고 했을경우 아래에 FruitBox는 구현의 편의성이 좋은대 단점음 안정하지 못하다는 단점이 있다. 반대로 위처럼 따로따로 클래스를 만들게 되면 안정성은 있지만 일일이 클래스를 만들어야 하는 번거로움이 있다. 이러한 장단점이 있는데 장점들만 모와 만들어 놓은게 바로 제네릭이다. 

이렇게 사용하는데 <> 안쪽이 중요한 부분이다. <> 안쪽 부분은 알파벳 아무거나 적고 , 인스턴스를 생성할때 타입이 지정되는 것이다. 

 

이렇게 두개 이상도 가능함 

 

제네릭 메소드 

 

메소드도 마찮가지로 내가 직접 매개변수의 형태와 리턴 타입을 지정하는거라고 생각하면 된다 . 

 

코드를 보면서 이해 하자 

 

class AAA {
	public String toString() {
		return "AAA";
	}
}
class BBB {
	public String toString() {
		return "BBB";
	}
}
class CCC {
	public <T, U> void printInfo(T inst, U inst2) {
		System.out.println(inst);
		System.out.println(inst2);
	}
}

public class Gernerric_Ex {

	public static void main(String[] args) {
		AAA aaa = new AAA();
		BBB bbb = new BBB();

		CCC ccc = new CCC();
		
		System.out.println("---------------");
		ccc.<AAA, BBB>printInfo(aaa, bbb);

	}

}

코드를 보면 ccc 클래스의 메소드를 호출할때 매개변수형을 지정해주면서 호출을 해주고 있다. 호출된 값이다. 

매개변수의 자료형 제한 

위처럼 사용 할 수도 있지만 매개변수를 내가 원하는 형태의 매개변수만 받도록 제한을 걸수도 있다. 

아래의 코드를 보고 이해를 하자

package gernerric;

interface AAA{}

class BBB implements AAA{
	@Override
	public String toString() {
		return "BBB";
	}
}

class CCC extends BBB { 
	@Override
	public String toString() {
		return "CCC";
	}
}

class ABC<T>{
	T item;
	ABC(T item) { this.item = item;}
	public T out() {return item;}
}

public class Gernerric_Ex3 {

	public static void print(ABC <? extends AAA> inst) {
		AAA aaa = inst.out();
		System.out.println(aaa);
	}
	
	public static void main(String[] args) {
		ABC<BBB> abc1 = new ABC<BBB>(new BBB());
		ABC<CCC> abc2 = new ABC<CCC>(new CCC());
		
		print(abc1); 
		print(abc2);
		
	}

}

위 코드에서보면 AAA를 상속 받은 것들만 받도록 메소드를 정의 해놓은것을 볼수 있다. 

그런데 보면 기존에 사용하던 방식이 아닌 ? 를 볼수있는데 이것은 와일드 카드이다. 

 

모든 타입다 올수 있게 해주는것이다. 

(ABC <? > inst)                     모든 타입을 다 받는 와일드 카드 
(ABC <? extends AAA> inst)    ~를 상속하는 클래스라면 모든지 가능 ( 상한)  
(ABC <? super AAA> inst)       ~이 상속하는 클래스라면 무엇이든지 (하한)   

 

코드를 보자

 

/////메인 클래스 /////

public class BoxSwapDemo {
	// 넘버를 상속하는 클래스를 받겠다 인테저는 넘버를 상속함 
    //숫자를 바꿔줄 메소드 
	 public static <T extends Number> void swapBox(Box<T> box1 , Box<T> box2){
     T x = box1.get();  
	 box1.set(box2.get());
	 box2.set(x); 
	 }
	 
	public static void main(String[] args) {
		Box<Integer> box1 = new Box<Integer>();
		box1.set(99);
		Box<Integer> box2 = new Box<Integer>();
		box2.set(55);
		System.out.println(box1.get() + "&" + box2.get());			
		swapBox(box1, box2);
		System.out.println(box1.get() + "&" + box2.get());
	}
}


////박스 클래스 /////
 class Box <T> { 
	private T ob;

	public void set(T t) {	
		ob = t;
	}
	
	public T get() {   
		return ob;
	}

	@Override
	public String toString() {		
		
		return  "박스 이름 : " + ob;
	}
		 
}

 

이렇게 숫자가 변경되는것을 볼수 있다. 

 

제레릭이 많이 어려운부분들이 있어서 자주 보면서 친숙해질 필요가 있을거 같다 실습한것들 많이 있으니 보면서 이해 하자 

 

반응형