제네릭 프로그래밍(generic programming)이란 다양한 종류의 데이터를 처리할 수 있는 클래스와 메소드를 작성하는 기법이다.
다양한 종류의 데이터를 처리할 수 있는 기법은 Object를 이용한 방법과 generic을 이용한 방법이 있다.
generic 사용 간단 예제
class Box<T> { // 클래스 옆에 <T>를 해줌으로써 제네릭 사용
    T data; // 데이터 타입을 아직 모르므로 T data
}
public class GenericEx01 {
    public static void main(String[] args) {
        Box<String> box1 = new Box(); // new 할때 타입이 결정됨
        Box<Integer> box2 = new Box(); // 기본형(int) 말고 랩핑형(Integer) 변수를 사용하여야함.
        box1.data = "1";
        box2.data = 1;
    }
}new할때 타입이 결정된다는 것은  static에는 적용될 수 없다.
static에 적용 하려면? Object 사용
class Box {
    static Object data; // Object를 이용하면 된다.
}
public class GenericEx02 {
    public static void main(String[] args) {
        Box.data = 1;
        Box.data = "문자";
    }
}- <타입변수> 를 작성하여 어떤 타입의 데이터도 저장하고 전달가능.
- new할 때 타입을 결정.
- new가 되지않으면 타입을 결정할 수 없으므로 static에 적용 불가능.
- 타입 캐스팅이 필요없어 안정성이 높고 코드가 간결함.
- 최상위 클래스인 Object를 사용하면 어떤 타입의 데이터도 저장하고 전달가능.
- 데이터를 가져올 때마다 적절한 타입으로 다운 캐스팅 해야하는 번거로움이 있다.
- 잘못된 타입으로 캐스팅하면 런타임 에러 발생.
- Object를 쓰는 경우는 싱글톤(한번만 new)을 이용할 때 사용.
class Model<T> {
    private T data;
    public void setData(T data) {// 생성자
        this.data = data;
    }
    public T getData() { // getter
        return data;
    }
}
class User {
    public int id = 1;
    public String name = "홍길동";
    public String email = "ssar@nate.com";
    public void hello() {
        System.out.println("안녕하세요");
    }
}
public class GenericEx03 {
    public static void main(String[] args) {
        Model<User> m = new Model();
        m.setData(new User());
        User u = m.getData();
        u.hello();
    }
}class Model {
		// 싱글톤
    private static Model instance = new Model();
		// getter
    public static Model getInstance() {
        return instance;
    }
		// 생성자
    private Model() {
    }
		// 오브젝트 사용
    private Object data;
    public void setData(Object data) {
        this.data = data;
    }
    public Object getData() {
        return data;
    }
}
class User {
    public int id = 1;
    public String name = "홍길동";
    public String email = "ssar@nate.com";
    public void hello() {
        System.out.println("안녕하세요");
    }
}
public class GenericEx04 {
    public static void main(String[] args) {
        Model m = Model.getInstance();
        User u = new User();
        m.setData(u);
				// 다운캐스팅
        User ob = (User) m.getData();
        ob.hello();
    }
}Share article