generic

제네릭 타입

Object 필드

잘못된 형변시 오류

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

    }

}

ArrayList 제네릭 사용

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

    }

}

HashMap 제네릭 사용

제네릭으로 클래스 작성

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

    }

}