JAVA-Collection-Generic

 

[Generic]

JDK1.5 부터 지원

C#, Java 필수기능

사용목적

1.Object 타입 저항 -> Object 타입 탈피
2.타입 안정성 (타입 강제성)
3.형변환 (casting) 문제 해결: (Car)obj;
Generic 클래스 설계 » 타입을 강제해서 객체를 생성할 수 있다
MyGen<String> m = new MyGen<String>();
class MyGen<T> { //Type Parameter
	T obj;
	void add(T obj) {
		this.obj = obj;
	}
	T get() {
		return this.obj;
	}
}
/*
[heap메모리에 올라 갈 때]
MyGen<Car> c = new MyGen<Car>(); 해주면

class MyGen<Car> { //Type Parameter
	Car obj;
	void add(Car obj) {
		this.obj = obj;
	}
	Car get() {
		return this.obj;
	}
}
 */

public static void main(String[] args) {
MyGen<String> my = new MyGen<String>();
my.add("Hello");
String result = my.get();
System.out.println(result);

//Person 타입을 강제하는
//MyGen 타입의 객체 생성
MyGen<Person> myobj = new MyGen<Person>();
myobj.add(new Person());
Person p = myobj.get();
System.out.println(p.age);

//Quiz (Generic x)
ArrayList list = new ArrayList();
list.add(500);
list.add(new Person());
list.add("홍길동");

//개선된 for문을 통해 출력 >> 500, 100, "홍길동"
for(Object obj : list) {
	if(obj instanceof Person) {
		Person person = (Person)obj;
		System.out.println(person.age);
	}else {
		System.out.println(obj);
	}
}

//위 처럼 사용하지 말자 -> generic 사용 배경
ArrayList<Person> alist = new ArrayList<>();
alist.add(new Person());
System.out.println(alist.get(0).age);
		
	}
}

EX1)


class Tv extends Product {
	@Override
	public String toString() {
		return "Tv";
	}
}

class Audio extends Product {
	@Override
	public String toString() {
		return "Audio";
	}
}

class NoteBook extends Product {
	@Override
	public String toString() {
		return "NoteBook";
	}
}

public class Ex07_Generic_Quiz {
	public static void main(String[] args) {
		//1. Array(배열)를 사용해서 Cart를 만들고 Cart에 제품(Tv, Audio, Notebook) 담으세요
		//Product[] cart = {new Tv(), new Audio(), new Notebook()}; //내가 짠 코드
		Product[] cart = new Product[3]; //다형성을 사용한 배열
		cart[0] = new Tv();
		cart[1] = new Audio();
		cart[2] = new NoteBook();

		//2. ArrayList(Collection를 사용해서 Cart를 만들고 Cart에 제품(Tv, Audio, Notebook) 담으세요
		//ArrayList<Product> pcart = new ArrayList<>();
		List<Product> pcart = new ArrayList<>();
		pcart.add(new Tv());
		pcart.add(new Tv());
		pcart.add(new Tv());
		pcart.add(new Audio());
		pcart.add(new NoteBook());
		pcart.add(new NoteBook());

		for(Product product : pcart) {
			System.out.println(product.toString());
		}
	}
}

EX2)

public class Ex08_Generic_Quiz {
	public static void main(String[] args) {
		//1. Emp 클래스를 사용해서 사원 3명을 생성하세요
		//단 ArrayList<T> 제너릭을 사용하세요
		ArrayList<Emp> earr = new ArrayList<>();
		
		earr.add(new Emp(1, "김", "군인"));
		earr.add(new Emp(2, "이", "IT"));
		earr.add(new Emp(3, "박", "영업"));
		
		
		//2. 사원의 정보 (사번, 이름, 직종)을 개선된 for문을 사용해서 출력하세요
		//단 toString() 사용 금지
		for(Emp e : earr) {
			System.out.println(e.getEmpno() + "/" + e.getEname() + "/" + e.getJob());
		}
		
		System.out.println();
		
		//3. 사원의 정보 (사번, 이름, 직종)을 일반 for문을 사용해서 출력하세요
		//단 toString() 사용 금지
		for(int i = 0; i < earr.size(); i++) {
			System.out.println(earr.get(i).getEmpno() + "/" + earr.get(i).getEname() + "/" + earr.get(i).getJob());
		}
		
		System.out.println();
		
		//4. CopyEmp 라는 클래스를 만드세요(Emp와 같은데)
		//job member field 대신에>>
		//private int sal; 로 바꾸어 만드세요(getter, setter 구현)
		//kr.or.bit.CopyEmp 로 하세요
		//ArrayList<> 제너릭 사용해서 사원 3명 만드세요
		//아래 데이터 사용
		//100, "김", 1000
		//200, "이", 2000
		//300, "박", 3000
		ArrayList<CopyEmp> carr = new ArrayList<>();
		carr.add(new CopyEmp(100, "김", 1000));
		carr.add(new CopyEmp(200, "이", 2000));
		carr.add(new CopyEmp(300, "박", 3000));
		
		//5. 200번 사원의 급여를 5000으로 수정해서 출력하세요 (일반 for문 안에서...)
		for(int i = 0; i < carr.size(); i++) {
			if(carr.get(i).getEmpno() == 200) {
				carr.get(i).setSal(5000);
				System.out.println(carr.get(i).toString());
			}
		}
		
		System.out.println();
		
		//6. 300번 사원의 이름을 "궁금해"로 수정해서 출력하세요 (일반 for문 안에서...)
		for(CopyEmp c : carr) {
			if(c.getEmpno() == 300) {
				c.setEname("궁금해");
				System.out.println(c.toString());
			}
		}
		
		System.out.println();
		
		//7.사원정보를 Iterator 인터페이스를 사용해서 출력하세요
		/*
		ArrayList<Integer> intlist = new ArrayList<>();
		intlist.add(44);
		intlist.add(55);
		intlist.add(66);
		
		Iterator<Integer> list2 = intlist.iterator();
		while(list2.hasNext()) {
			System.out.println("[" + list2.next() + "");
		}
		*/
		Iterator<CopyEmp> it = carr.iterator();
		while(it.hasNext()) {
			//next() 이동해서 값을 return
			//System.out.println(it.next().getEmpno());
			//System.out.println(it.next().getEname());
			//System.out.println(it.next().getSal());
			CopyEmp e = it.next();
			System.out.println(e.getEmpno());
			System.out.println(e.getEname());
			System.out.println(e.getSal());
		}
		
		
	}
}