
제네릭 프로그래밍(Generic Programming)
- 여러가지 데이터를 처리할 수 있는 클래스와 메서드를 작성하는 기법이다..
- 클래스 또는 메서드를 정의할 때, 내부에 사용되는 자료형(타입)을 구체적으로 명시하지 않고 ‘T’ 와 같이 기호로 적어놓는 것이다.
- 사용 시 에는 기초 자료형이 아닌 클래스를 이용한다. (랩퍼 클래스 등)
- 제네릭의 문법은 ArrayList<T> 이다. → 이때 자료형 T가 ‘타입 매개 변수’ 이다.
- 제네릭은 타입을 결정하지 못할 때 사용한다. → 타입 결정은 new를 할 때 이다.
- 제네릭에는 static 사용이 불가능 하다. → static으로 쓰고 싶으면 Object를 사용하면 된다.
제네릭과 오브젝트는 비슷한 성질을 가지고 있는데 둘의 차이점을 알아보자!
오브젝트는 제네릭과 다르게!
오브젝트를 사용 시 다운 캐스팅을 빈번히 사용해야 한다.
이런데도 오브젝트를 사용하는 이유는?!
개발자가 new를 사용 하지 못 할때 제네릭 대신 오브젝트를 사용한다!
- 제네릭 예제 코드 → 제네릭의 가장 기본적인 사용 방법
package ex13.example1;
class Box<T> {
T data;
}
public class GenericEx01 {
public static void main(String[] args) {
Box<String> box1 = new Box(); // 제네릭을 사용시 원하는 타입으로 new 선언시 선택이 가능하다.
Box<Integer> box2 = new Box();
box1.data = "1";
box2.data = 1;
}
}
위의 코드를 Object를 사용하여 표현한다면 어떻게 될까?
package ex13.example2;
class Box {
static Object data;
}
public class GenericEx02 {
public static void main(String[] args) {
Box.data = 1;
Box.data = "문자";
}
}
- 오브젝트의 형변환 단점 예시 → 다음과 같이 new 후에 메서드를 호출하고 싶으면 강제적으로 다운캐스팅을 진행해야 한다.
package ex13.example3;
class Dog {
String name;
int age;
void speak() {
System.out.println("멍멍");
}
}
class Cat {
String name;
int age;
void speak() {
System.out.println("야옹");
}
}
public class GenericEX03 {
public static void main(String[] args) {
Object[] arr = new Object[2];
arr[0] = new Dog();
arr[1] = new Cat();
Dog d1 = (Dog) arr[0]; // [-> Object, Dog]
Cat c1 = (Cat) arr[1]; // [-> Object, Cat]
d1.speak();
c1.speak();
}
}
- 제네릭 사용 심화 예시 → 다음과 같이 제네릭을 사용 시에 타입을 클래스로 지정하여 코드를 더욱 간결하게 작성이 가능하며, 상황에 따라 원하는 타입을 지정하여 형태를 변형 하는 것이 가능하다.
package ex13.example5;
class Model<T> {
private T data;
public void setData(T data) {
this.data = data;
}
public T 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 GenericEx05 {
public static void main(String[] args) {
Model<User> m = new Model();
m.setData(new User());
User u = m.getData();
u.hello();
}
}
위의 코드를 만약 제네릭을 사용하지 않고 만든다면?
package ex13.example4;
class Model {
private static Model instance = new Model();
public static Model getInstance() {
return instance;
}
private Object data;
public void setData(Object data) {
this.data = data;
}
private Model() {
}
}
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);
}
}
Share article