<T타입지정>
Object 필드
모든 값 저장 가능
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 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());
}
}
}
제네릭으로 클래스 작성
<T>
사용class Generic<T> {
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();
}
}
package chapter14;
public class GenericEx2 {
public static void main(String[] args) {
Generic<String> gen = new Generic<String>();
String[] ss = {"홍길동","이순신","김유신"};
// String 제네릭 타입의 매개변수에 String 배열객체 전달
gen.set(ss);
gen.print();
for(String s : gen.get()) {
System.out.println(s);
}
Integer[] ii = {1,2,3};
// String 제네릭 타입의 매개변수에 Integer 배열객체 전달
Generic<Integer> gen2 = new Generic<Integer>();
gen2.set(ii);
gen2.print();
for(Integer o : gen2.get()) {
System.out.println(o);
}
}
}
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;
}
}
제네릭 없이 ArrayList에 Member 저장
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<list.size(); i++) {
System.out.println("인덱스 : "+i
+", 이름 : "+((Member)list.get(i)).getName()
+", 아이디 : "+((Member)list.get(i)).getId()
+", 비밀번호 : "+((Member)list.get(i)).getPassword()
+", 나이 : "+((Member)list.get(i)).getAge());
}
}
}
제네릭 사용 ArrayList
package chapter14;
import java.util.ArrayList;
import java.util.List;
public class MemberGeneric {
public static void main(String[] args) {
// Member 제네릭을 사용한 경우
List<Member> list = new ArrayList<Member>();
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<list.size(); i++) {
System.out.println("인덱스 : "+i
+", 이름 : "+list.get(i).getName()
+", 아이디 : "+list.get(i).getId()
+", 비밀번호 : "+list.get(i).getPassword()
+", 나이 : "+list.get(i).getAge());
}
}
}
제네릭으로 클래스 작성
<K, V>
사용class Generic2<K, V> {
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;
public class GenericEx3 {
public static void main(String[] args) {
Generic2<String, Integer> gen1 = new Generic2<String, Integer>();
gen1.set("홍길동", 1111);
// gen1.set("이순신", "A111"); // 에러
System.out.println("<String, Integer>");
System.out.println("name : "+gen1.getName());
System.out.println("id : "+gen1.getId());
Generic2<String, String> gen2 = new Generic2<String, String>();
gen2.set("이순신", "A1111");
System.out.println("<String, String>");
System.out.println("name : "+gen2.getName());
System.out.println("id : "+gen2.getId());
}
}