S E P H ' S
[Java] 7. Generic 본문
Generic
다양한 타입의 객체들을 다루는 메소드나 컬렉션 클래스에서 사용하는 것으로, 컴파일 과정에서 타입체크를 해주는 기능입니다.
이러한 제네릭은 자바에서 안정성을 맡고 있습니다. 객체의 타입을 컴파일 시에 체크하기 때문에 객체의 타입 안정성을 높이고 형변환의 번거로움을 줄여줍니다. 자연스럽게 코드도 더욱 간결하게 작성할 수 있습니다. 예를 들면, Collection에 특정 객체만 추가될 수 있도록, 또는 특정한 클래스의 특징을 갖고 있는 경우에만 추가될 수 있도록 할 수 있습니다. 이로 인한 장점은 Collection 내부에서 들어온 값이 내가 원하는 값인지 별도의 로직처리를 구현할 필요가 없어집니다. 또한 API를 설계하는데에 있어서 보다 명확한 의사 전달이 가능해집니다.
Generic의 생성방식
ArrayList<Integer> list1 = new ArrayList<Integer>();
ArrayList<String> list2 = new ArrayList<String>();
LinkedList<Double> list3 = new ArrayLisy<Double>();
LinkedList<Character> list4 = new LinkedList<Character>();
<>안에 들어가는 타입을 지정해줍니다.
Generic을 사용하는 이유
간단하게 제네릭을 사용하는 예시에 대해 알아보도록 합시다.
List list = new ArrayList();
list.add("hello");
String str = list.get(0);
System.out.println(list);
list의 데이터 타입은 Object입니다. Object는 모든 클래스의 조상이기 때문에 어떤 종류의 클래스로도 포인팅 할 수 있습니다. 하지만 3번째 라인에서 컴파일 에러가 발생합니다. 왜냐하면 list.get(0)을 하게 되면 String 타입이 아닌 Object 타입을 반환하기 때문입니다. 따라서 String 타입으로 타입 캐스팅을 해야 정삭 작동합니다.
String str = (String)list.get(0);
지금과 같은 경우는 list에 하나의 데이터만 있었지만 만약, 수만개의 데이터가 들어있었다면 수만번의 타입 캐스팅을 해야하기 때문에 이것은 시스템 성능의 저하를 가져오게 됩니다. 이러한 문제를 해결하기 위해 Java 5 부터 Generic이 추가되었습니다.
ArrayList<String> list = new ArrayList<>();
list.add("hello");
String str = list.get(0);
System.out.println(list);
이 코드는 캐스팅 없이 정상 작동합니다. 또한 클래스 타입 캐스팅을 잘못했을 때 발생하는 ClassCastException으로 부터 자유로워집니다. 만약 타입 캐스팅을 잘못했담면 컴파일러가 에러라고 알려줍니다.
참고링크
'Programing & Coding > JAVA' 카테고리의 다른 글
[Java] 9. Overloading & Overriding (0) | 2022.01.18 |
---|---|
[Java] 8. final keyword (0) | 2022.01.10 |
[Java] 6. Annotation (0) | 2022.01.04 |
[Java] 5. Collection (Stack, Queue) (0) | 2022.01.04 |
[Java] 4. Collection (List, Map, Set) (0) | 2021.12.28 |