====== Ch14 제네릭 ====== ===== 제네릭 타입 ===== package chapter14; public class GenericEx { public static void main(String[] args) { NoGeneric nogen = new NoGeneric(); String[] ss = {"홍길동","이순신","김유신"}; // Object 타입의 매개변수에 String 배열객체 전달 nogen.set(ss); nogen.print(); Object[] objs = nogen.get(); for(Object o : objs) { String s = (String)o; // String으로 강제형변환 System.out.println(s); } Integer[] ii = {1,2,3}; // Object 타입의 매개변수에 Integer 배열객체 전달 nogen.set(ii); objs = nogen.get(); for(Object o : objs) { String s = (String)o; // String으로 강제형변환 (에러발생) System.out.println(s.trim()); } } } class NoGeneric { Object[] v; void set(Object[] n) { v = n; } Object[] get() { return v; } void print() { for(Object o : v) { System.out.print(o + " "); } System.out.println(); } } package chapter14; public class GenericEx2 { public static void main(String[] args) { Generic gen = new Generic(); String[] ss = {"홍길동","이순신","김유신"}; // String 제네릭 타입의 매개변수에 String 배열객체 전달 gen.set(ss); gen.print(); for(String s : gen.get()) { //String s = (String)o; // 형변환 필요없음 System.out.println(s); } Integer[] ii = {1,2,3}; // String 제네릭 타입의 매개변수에 Integer 배열객체 전달 // nogen.set(ii); // 에러 발생 Generic gen2 = new Generic(); gen2.set(ii); gen2.print(); for(Integer o : gen2.get()) { // String s = (String)o; // 형변환 필요없음 System.out.println(o); } } } class Generic { T[] v; void set(T[] n) { v = n; } T[] get() { return v; } void print() { for(T o : v) { System.out.print(o + " "); } System.out.println(); } } **Member.java** package chapter14; public class Member { private String name; private String id; private String password; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } **MemberNoGeneric.java** package chapter14; import java.util.ArrayList; import java.util.List; public class MemberNoGeneric { public static void main(String[] args) { // 제네릭을 사용하지 않은 경우 List list = new ArrayList(); Member mem1 = new Member(); mem1.setName("홍길동"); mem1.setId("hong"); mem1.setPassword("hong1234"); mem1.setAge(40); list.add(mem1); // 리스트에 추가 Member mem2 = new Member(); mem2.setName("이순신"); mem2.setId("lee"); mem2.setPassword("lee1234"); mem2.setAge(50); list.add(mem2); // 리스트에 추가 Member mem3 = new Member(); mem3.setName("김유신"); mem3.setId("kim"); mem3.setPassword("kim1234"); mem3.setAge(60); list.add(mem3); // 리스트에 추가 // 리스트 갯수 System.out.println("list.size() : "+list.size()); // 모든 리스트의 요소(Member) 강제형변환 후 출력 for (int i=0; i package chapter14; import java.util.ArrayList; import java.util.List; public class MemberGeneric { public static void main(String[] args) { // Member 제네릭을 사용한 경우 List list = new ArrayList(); Member mem1 = new Member(); mem1.setName("홍길동"); mem1.setId("hong"); mem1.setPassword("hong1234"); mem1.setAge(40); list.add(mem1); // 리스트에 추가 Member mem2 = new Member(); mem2.setName("이순신"); mem2.setId("lee"); mem2.setPassword("lee1234"); mem2.setAge(50); list.add(mem2); // 리스트에 추가 Member mem3 = new Member(); mem3.setName("김유신"); mem3.setId("kim"); mem3.setPassword("kim1234"); mem3.setAge(60); list.add(mem3); // 리스트에 추가 // 리스트 갯수 System.out.println("list.size() : "+list.size()); // 모든 리스트의 요소(Member) 출력 for (int i=0; i package chapter14; public class GenericEx3 { public static void main(String[] args) { Generic2 gen1 = new Generic2(); gen1.set("홍길동", 1111); // gen1.set("이순신", "A111"); // 에러 System.out.println(""); System.out.println("name : "+gen1.getName()); System.out.println("id : "+gen1.getId()); Generic2 gen2 = new Generic2(); gen2.set("이순신", "A1111"); System.out.println(""); System.out.println("name : "+gen2.getName()); System.out.println("id : "+gen2.getId()); } } class Generic2 { K name; V id; void set(K name, V id) { this.name = name; this.id = id; } K getName() { return name; } V getId() { return id; } } package chapter14; import java.util.HashMap; import java.util.Map; public class HashMapEx { public static void main(String[] args) { Map hm = new HashMap(); hm.put("name", "홍길동"); hm.put("id", "hong"); hm.put("age", 30); System.out.println(hm.get("name")); System.out.println(hm.get("id")); System.out.println(hm.get("age")); } } package chapter14; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class GenericEx4 { public static void main(String[] args) { List> list = new ArrayList>(); Map hm = new HashMap(); hm.put("name", "홍길동"); hm.put("id", "hong"); hm.put("age", 30); list.add(hm); hm = new HashMap(); hm.put("name", "이순신"); hm.put("id", "lee"); hm.put("age", 40); list.add(hm); hm = new HashMap(); hm.put("name", "김유신"); hm.put("id", "kim"); hm.put("age", 50); list.add(hm); for (int i=0; i package chapter14; public class GenericEx5 { public static void main(String[] args) { Gen3 g3 = new Gen3(); // Gen2의 상위 클래스 제네릭 선언 가능 Generic5 g2 =new Generic5(g3); // Gen2 t1 = g2.get(); // 에러 Gen2는 Gen2의 부모클래스가 아님 // Gen3 t1 = g2.get();// 에러 Gen3은 Gen2 의 부모클래스가 아님 Gen1 t2 = (Gen3)g2.get(); // Gen1은 부모클래스이므로 가능 Object t1 = g2.get(); // Object는 최상위 클래스이기 때문에 가능 System.out.println(t2.name); System.out.println(t2.getName()); // Gen2의 하위 클래스 제네릭 선언 가능 Generic5 g4 =new Generic5(g3); Gen2 t3 = g4.get(); // Gen2 자신도 포함 Gen3 t4 = (Gen3)g4.get(); // Gen3은 하위클래스이므로 가능 // 모든 클래스 타입 가능 Generic5 g6 =new Generic5(g3); Object t5 = g6.get(); Gen3 t6 = (Gen3)g6.get(); // 정수도 가능 Generic5 g7 =new Generic5(1); System.out.println(g7.get()); } } class Gen1 { String name = "Gen1"; String getName() { return name; } } class Gen2 extends Gen1 { String name = "Gen2"; String getName() { return name; } } class Gen3 extends Gen2 { String name = "Gend3"; String getName() { return name; } } class Generic5 { T obj; Generic5(T obj) { this.obj = obj; } void set(T obj) { this.obj = obj; } T get() { return obj; } }