JAVA/Java 기초

컬렉션 프레임워크 - 제네릭

  • 제네릭(모형자) → 템플릿(모형자)
  • generic <> angle blanket
  • 컬렉션 프레임워크
    • Vector, ArrayList, Map, Set
  • 제네릭
    • 자료형이 딱히 정해지지 않은 것..
    • 여러 참조 자료형이 쓰일 수 있는 곳에 특정한 자료형을 지정하지 않고, 클래스나 메서드를 정의한 후 사용하는 시점에 어떤 자료형을 사용할 것인지 지정하는 방식
    • 클래스명<T> : 참조자료형이 정해져있지 않음
      • <> : 모형자
      • T : type의 약자, 자료형 매개변수
    • 나중에 클래스를 사용할 때 T 위치에 실제 사용할 자료형을 지정한다. 
class Java {
	String title;
	Java(String t) { title = t; }
	void show() { System.out.println(title); }
}
class DB {
	int n;
	DB(int n) { this.n = n;	}
	void pr() { System.out.println(n); }
}

class Program<T> {	//모형자 <> : 제네릭 기호
	
	T t;	//T:클래스 명 t:참조변수  (Java, DB 가 올 수 있다..)
	void in(T t) {
		this.t = t;	//초기화
	}
	
	T get() {
		return t;
	}
}

public class CollEx07generic {
	public static void main(String[] args) {
		
		//T 구체화
		Program <Java> p =
				new Program<Java>();
		p.in(new Java("자바입니다."));	//Java p = new Java("java");
		
		Java j = p.get();
		j.show();
		
		Program <DB> d = 
				new Program<>();
		d.in(new DB(30));
		DB db = d.get();
		db.pr();
	}
}

 

  • 제네릭 메서드
    •  public <자료형 매개변수> 반환형 메서드 이름(자료형 매개변수 ...){ }
class AA {
	public String toString() {	
		//line 19. 객체 출력을 문자열로 하기 위해 오버라이딩함.
		return "AA";
	}
}
class BB {
	public String toString() {	//오버라이드
		return "BB";
	}
}
class In {
	<T> void show(T t) {	//제네릭 메서드
		System.out.println(t);
	}
	void show() {	//오버로드
		System.out.println("generic");
	}
}

public class CollEx08generic {
	public static void main(String[] args) {
		AA a = new AA();
		BB b = new BB();
		In i = new In();
		
		i.show();	//generic
		i.<AA>show(a);	//AA t = a;
		i.<BB>show(b);	//BB
	}
}

 

  • main() 을 보고 Gen클래스를 작성하시오
public class Review0602B {
	public static void main(String[] args) {
		Gen<String> g = new Gen<String>("seoul","busan");
		System.out.println(g.one());   //seoul 출력
		System.out.println(g.two());   //busan 출력
		System.out.println(g.three());  //false 출력 (두 문자열 비교)
	}
}
class Gen<T> {
	T t, t1;
	
	public Gen(T t, T t1) {
		this.t=t;	this.t1=t1;
	}
	
	T one() {
		return t;
	}
	T two() {
		return t1;
	}
	
    boolean three() {
		return t.equals(t1);
	}
    /*
	Boolean three() {
		if(t.equals(t1)) {
			return true;
		}
		return false;
	}
    */
}

 

 

  • LinkedList
class Box<T>{	//제네릭 클래스
	Box<T> next;
	T t;
	
	void in(T t) {
		this.t=t;
	}
	
	T out() {
		return t;
	}
}

public class CollEx14LinkedList {
	public static void main(String[] args) {

		Box<Integer> b = new Box<Integer>();	//T를 <Integer>로 구체화
		
//		b.in(new Integer(30));	//Integer b = new Integer(30);
		b.in(30);
		
		b.next = new Box<Integer>();
		b.next.in(40);	//객체에 한번 더 접근
		
		b.next.next = new Box<Integer>();
		b.next.next.in(50);
		
		Box<Integer> tmp;
		tmp = b.next;
		System.out.println(tmp.out());
		
		System.out.println("***** *****");
		System.out.println(b.out());
		System.out.println(b.next.out());
		System.out.println(b.next.next.out());
	}
}

 

 

  • 제네릭 클래스 제한
class Food{
	void show() {
		System.out.println("음식");
	}
}
class Pizza extends Food{
	void show() {
		super.show();
		System.out.println("피자");
	}
}
class Fo<T>{
	T t;
	void in(T t) {
		this.t=t;
	}
	T out() {
		return t;
	}
}

public class Test1 {
	//? 바인드변수   //Fo<Food> f
	              //Fo<Pizza> f
	static void pr(Fo <? extends Food> f) {
		Food fo=f.out();  //Food fo=Food.out();
		                  //Food fo=Pizza.out();
		fo.show();
	}
	public static void main(String[] args) {
		
		 Fo<Food> f=new Fo<Food>();
		 f.in(new Food());
		 pr(f);
		 
	     Fo<Pizza> f1=new Fo<Pizza>();
	     f1.in(new Pizza());
	     pr(f1);
	}
}
728x90
728x90

'JAVA > Java 기초' 카테고리의 다른 글

컬렉션프레임워크 - HashMap  (0) 2022.06.04
Set 인터페이스  (0) 2022.06.02
Iterator  (0) 2022.06.02
Stack  (0) 2022.06.02
List 인터페이스 - ArrayList 클래스  (0) 2022.06.02