nme.kr

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<String> gen = new Generic<String>();
		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<Integer> gen2 = new Generic<Integer>();
		gen2.set(ii);
		gen2.print();
		
		for(Integer o : gen2.get()) {
			// String s = (String)o; // 형변환 필요없음
			System.out.println(o);
		}

	}

}

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();
	}
}

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<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());
		}

	}

}

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());
		}

	}

}

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());

	}

}

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;

import java.util.HashMap;
import java.util.Map;

public class HashMapEx {

	public static void main(String[] args) {
		
		Map<String, Object> hm = new HashMap<String, Object>();
		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<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
		
		Map<String, Object> hm = new HashMap<String, Object>();
		hm.put("name", "홍길동");
		hm.put("id", "hong");
		hm.put("age", 30);
		list.add(hm);
		
		hm = new HashMap<String, Object>();
		hm.put("name", "이순신");
		hm.put("id", "lee");
		hm.put("age", 40);
		list.add(hm);
		
		hm = new HashMap<String, Object>();
		hm.put("name", "김유신");
		hm.put("id", "kim");
		hm.put("age", 50);
		list.add(hm);
		
		for (int i=0; i<list.size(); i++) {
			System.out.println("인덱스 : "+i
					+", 이름 : "+list.get(i).get("name")
					+", 아이디 : "+list.get(i).get("id")
					+", 나이 : "+list.get(i).get("age"));
		}

	}

}


package chapter14;

public class GenericEx5 {

	public static void main(String[] args) {
		
		Gen3 g3 = new Gen3();
		
		// Gen2의 상위 클래스 제네릭 선언 가능
		Generic5<? super Gen2> g2 =new Generic5<Gen1>(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<? extends Gen2> g4 =new Generic5<Gen3>(g3);
		Gen2 t3 = g4.get(); // Gen2 자신도 포함
		Gen3 t4 = (Gen3)g4.get(); // Gen3은 하위클래스이므로 가능
		
		// <?> 모든 클래스 타입 가능
		Generic5<?> g6 =new Generic5<Gen3>(g3);
		Object t5 = g6.get();
		Gen3 t6 = (Gen3)g6.get();
		
		// 정수도 가능
		Generic5<?> g7 =new Generic5<Integer>(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> {
	T obj;
	
	Generic5(T obj) {
		this.obj = obj;
	}
	void set(T obj) {
		this.obj = obj;
	}
	T get() {
		return obj;
	}
}