제네릭 프로그래밍(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