반응형
1. 서두
- 개발 혹은 설계를 하면서 자주 사용하지만 한번도 제대로 정리한 적이 없어 Generic 관련 내용을 정리하고자 한다.
2. 제네릭이란?
- 데이터 형식에 의존하지 않고 여러 데이터 타입을 사용할 수 있도록 하는 것을 말한다.
클래스, 메소드에서 사용할 때 데이터 타입을 나중에 확정하는 기법이라고 생각하면된다. - 제네릭은 Class, Method에 <>를 활용하여 구현한다.
3. 제네릭의 장점
- 그렇다면 왜 굳이 제네릭을 사용한는 것일까? 제네릭을 사용할 때의 장점은 다음과 같다.
- 강제적인 타입 변환이 발생하지 않아 성능 저하를 방지.
-> 이론적으로는 오버헤드가 발생하여 성능 저하를 야기하지만 실제로는 미비하다는 의견도 존재함
- 중복 코드 제거, 코드의 재사용성을 높임.
//<T> 타입의 Class class Book<T> { private T t; public T get(){ //T를 반환하는 메소드 return t; } public void add(T t){ //T를 매개변수로 갖는 메소드 this.t = t; } } public class Main { public static void main(String[] args){ //자료형이 달라도 하나의 메소드를 사용함에 따라 코드의 재사용성 향상 Book<Integer> box1 = new Book<Integer>(); Book<String> box1 = new Book<Integer>(); } }
- 의도하지 않은 타입의 사용을 막고 잘못된 형변환을 방지함으로 타입 안정성 향상.
Array<String> arr = new Array<>(); arr.add("가"); arr.add("나"); arr.add(1); //컴파일 오류 발생
4. 제네릭 타입 인자
- 아래 타입에 대해 반드시 지켜야하는 것은 아니다. 다만 통상적 그리고 대중적으로 사용하고 있다.
타입 설명 <T> Type <E> Element <K> Key <V> Value <N> Number
5. 클래스 및 인터페이스에서의 사용
- 클래스 및 인터페이스에서 사용은 아래와 선언함으로써 사용된다.
제네릭은 1개 또는 2개 모두 사용이 가능하다public class Product <T> { ... } public class Item { ... } public class Main { public static void main(String[] args) { Product<Item> prdocut = new Product<Item>(); } }
- 타입 파라미터로 명시할 수 있는 것은 참조타입(Reference Type)만 가능하다.
기본형의 자료타입인 int, byte, char 등등은 명시불가하다.
참조타입만 가능하기 때문에 사용자가 생성한 클래스도 타입으로 사용 가능하다.public class ClassName <T> { ... } public Interface InterfaceName <T> { ... } public class ClassName <T, K> { ... } public Interface InterfaceName <T, K> { ... }
6. 메소드에서의 사용
- 메소드에서는 아래와 같이 타입 파라미터, 매개변수, 그리고 리턴타입에 사용이 가능하다.
//접근제어자 <타입파라미터> 리터타입 메소드명(매개변수,...){ ... } //구현 public <T> Book<T> add(T t){...}
- 이렇게보면 어떤 내용인지 와닿지 않아 예시를 통해 확인한다.
- ex1
- Data class안에 showData()를 생성했다.
showData 메소드는 매개변수로 들어온 데이터가 어떠한 형태인지 확인하고 입력된 데이터를 리턴하는 메소드이다.
들어온 데이터 형에 따라 첫번째는 "String", 두번째는 Integer가 출력되는 것을 확인할 있다.
public class Data { public <T> T showData(T data){ if(data instanceof String) System.out.println("String"); else if(data instanceof Integer) System.out.println("Integer"); else if(data instanceof Double) System.out.println("Double"); return data; } } public class Main { public static void main(String[] args){ Data dt = new Data(); dt.<String>showData("hello"); dt.<Integer>showData(1); } }
/* Data.showData 출력 결과 */ String Integer
- ex1
7.제네릭 와일드카드와 제약
- 해당 내용에 대해서는 다음 포스팅을 통해 정리한다.
반응형
'Backend > Java' 카테고리의 다른 글
객체간 맵핑을 편리하게 하기 위한 Mapstruct (0) | 2023.12.13 |
---|---|
Java - Generic(제네릭) 2편 - 제네릭제약(와일드카드, extends, super) (0) | 2022.05.13 |
JAVA 버전별 특징(Java7~10) (0) | 2022.03.10 |
래퍼 클래스(wrapper class)? (0) | 2022.03.03 |
인터페이스를 사용하는 이유 (0) | 2016.12.13 |