039_제네릭

Jan 03, 2024
039_제네릭

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

chodong