generic

제네릭과 가변인수를 함께 쓸 때는 신중하라 - [5장. 제네릭(아이템32)]
1. 가변인수 & 제네릭 💪 가변인수(varargs)란 매개변수로 들어오는 값의 개수와 상관없이 동적으로 인수를 받아서 기능하도록 해주는 문법을 말한다. public PrintStream printf(String format, Object ... args) { return format(format, args); } 가변인수 메서드를 호출하면 가변인수를 담기 위한 배열이 자동으로 하나 만들어진다. 만약 다음과 같이 제네릭과 가변인수를 함께 사용하면 어떻게 될까? static void dangerous(List... stringLists) { } 이 경우에도 가변인수 메서드가 호출되기 때문에 가변인수를 담기 위한 배열이 자동으로 만들어진다. 즉, 제네릭 배열이 만들어지는 것이다. 일반적으로는 제네릭 배열을 ..

한정적 와일드카드를 사용해 API 유연성을 높이라 - [5장. 제네릭(아이템31)]
1. PECS 🌞 PECS(Producer-Extends, Consumer-Super)란 매개변수화 타입 T가 생산자라면 에는 null 외에는 어떤 값도 넣을 수 없기 때문이다. 그래서 아래와 같이 도우미 메서드를 따로 작성해서 사용해야 한다. public class Swap { public static void swap(List list, int i, int j) { swapHelper(list, i, j); } private static void swapHelper(List list, int i, int j){ list.set(i, list.set(j, list.get(i))); } } 해당 글은 백기선 님의 '이펙티브 자바 완벽 공략'을 참고하였습니다.

이왕이면 제네릭 메서드로 만들라 - [5장. 제네릭(아이템30)]
클래스와 마찬가지로, 메서드도 제네릭으로 만들 수 있다. 제네릭 메서드 3가지를 살펴보면서 어떻게 제네릭 메서드를 만드는지 알아보자. 1. 매개변수화 타입을 받는 정적 유틸리티 메서드 🌼 매개변수화 타입을 받는 정적 유틸리티 메서드는 보통 제네릭이다. (Collections의 알고리즘 메서드는 모두 제네릭이다.) 우선, 제네릭을 사용하지 않은 메서드를 살펴보자 public class Union { public static Set union(Set s1, Set s2) { Set result = new HashSet(s1); result.addAll(s2); return result; } } 해당 메서드는 아래의 예시에서 살펴볼 수 있는 것처럼 안전하지 않다. public static void main(S..

이왕이면 제네릭 타입으로 만들라 - [5장. 제네릭(아이템29)]
1. 들어가기 전 🏄♀️ 아래의 Object 기반으로 만들어진 Stack 클래스를 살펴보자. public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack() { elements = new Object[DEFAULT_INITIAL_CAPACITY]; } public void push(Object e) { ensureCapacity(); elements[size++] = e; } public Object pop() { if(size == 0) throw new EmptyStackException(); Object resu..

배열보다는 리스트를 사용하라 - [5장. 제네릭(아이템28)]
1. 배열과 제네릭 타입의 차이 🦗 📗 1. 배열은 공변이고, 제네릭은 불공변이다. 배열은 공변(Convariant)이다. Sub가 Super의 하위 타입이라면 Sub[]는 배열 Super[]의 하위 타입이다. 제네릭은 불공변(Invariant)이다. 서로 다른 타입 Type1과 Type2가 있을 때, List은 List의 하위 타입도 아니고 상위 타입도 아니다. 공변과 불공변 중 어느 쪽이 문제가 있을까? 코드를 통해 알아보자. public static void main(String[] args) { // 배열 Object[] objectArray = new Long[1]; objectArray[0] = "타입이 달라서 넣을 수 없다."; // ArrayStoreException (런타임에 발생) //..

로 타입은 사용하지 말라 - [5장. 제네릭(아이템26)]
이번 장(5장)부터는 제네릭을 다룬다. 혹시나 제네릭에 대한 기본 개념이 필요하다면 이전 글을 먼저 보고 오도록 하자. 1. 로 타입 (Raw Type) 개념 💽 로 타입이란 제네릭 타입에서 타입 매개변수를 전혀 사용하지 않을 때를 말한다. 예를 들어 List의 로 타입은 List다. 2. 로 타입을 사용하면 안 되는 이유 💾 제네릭이 안겨주는 안전성과 표현력을 고려할 때 로 타입은 절대로 써서는 안 된다. 로 타입을 사용하는 코드(= 제네릭을 사용하지 않는 코드)와 로 타입을 사용하지 않는 코드(= 제네릭을 사용하는 코드)를 비교해 보자. 📒 1. 로 타입을 사용하는 경우 기본적인 동작은 numbers에 숫자를 넣고 반복문을 통해 들어간 숫자를 확인하려고 하는 코드다. 숫자가 들어가야 하지만 문자열이 ..

제네릭(Generics) - 기본 개념
JDK 1.5부터 도입된 제네릭(Generics)에 대해서 알아보자. '제네릭(Generic)을 사용하면 다양한 타입을 사용할 수 있다.' 정도로만 알고 있었는데 제대로 공부하려고 보니깐 생각보다 양이 많다. 쫌 많이 많다... 그래서 이번 글에서는 제네릭의 기번 개념에 대해서 알아보고 다음 글들을 통해 더 구체적으로 알아보는 것으로 하자. (이펙티브 자바 5장의 제네릭(아이템 26 ~ 아이템 33) 내용과 와일드카드 등의 내용을 추가적으로 다룰 예정이다.) (이펙티브 자바 5장 제네릭 파트를 읽으려는데 이해가 잘 되지 않아서 제네릭의 기본부터 블로깅하고 있는 중이다...😅) 1. 제네릭(Generic) 개념 🧱 우리는 제네릭(Generics)을 그 어떠한 개념보다 자주 사용한다. public stati..