들어가기 전 이 글은 인프런 백기선님의 강의를 복습하며 작성한 글입니다. 이 글의 요약 좌측 항에 타입이 명확히 선언되어 있으면, 우측 항에서는 연산자를 이용하면 타입 추론이 가능해진다. 메서드의 매개변수가 제네릭일 경우, 메서드 매개변수에 전달되는 인자의 타입에 따라 메서드의 제네릭 타입이 추론 가능해진다. 메서드 매개변수에 전달되는 인자의 타입으로 메서드 제네릭 타입이 추론된다면, 반환되는 타입이 어떠한 타입인지 따로 명시할 필요가 없다. BoxExample.add() 같은 곳에서 생략 가능하다. 메서드 인자로 List 같은 제네릭 타입이 전달되는 경우, 메서드에 구체적인 타입이 선언되어있으면 그 타입으로 타입 추론이 가능해진다. 완벽 공략 44. 타입 추론 (Type Inference) 타입추론은 ..
들어가기 전 이 글은 인프런 백기선님의 이펙티브 자바 강의를 복습하며 작성한 글입니다. 이 글의 요약 유틸리티 클래스에서 매개변수화 타입을 받는 정적 유틸리티 메서드는 제네릭 타입을 사용하면 좋다. 유틸리티 메서드는 주로 Collection 타입이 오는데, 이 때는 제네릭 타입으로 만들자. Collection을 Raw 타입으로 받을 경우 타입 안정성 / 표현력이 떨어져서 런타임 에러가 발생할 수 있는데 이 부분을 해결해준다. 싱글턴 팩토리에서 다양한 타입의 인스턴스로 반환해야 하는 경우, 제네릭 싱글톤 팩토리로 만들면 코드의 양을 줄일 수 있다. 주로 동일한 인스턴스에서 타입에 따라 다른 역할을 할 수 있을 때 제네릭 싱글톤 팩토리를 사용한다. 재귀적 한정 타입은 주로 Comparable과 관련된 기능을..
들어가기 전 이 글은 인프런 백기선님의 이펙티브 자바 강의를 복습하며 작성한 글입니다. 이 글의 요약 한정적 타입 매개변수를 이용해서 특정한 타입만 제네릭에서 사용할 수 있다. 인 경우 E[]는 컴파일 이후 Object[]로 변한다. 인 경우 E[]는 컴파일 이후 Number[]로 변한다. 일 때 (E[]) new Object[]를 하게 되면 classCastException이 발생한다. Object[]을 Number[]로 캐스팅하는 것인데 이 형식의 다운 캐스팅은 불가능하다. 한정적 타입 매개변수를 사용하고, 배열인 경우라면 E[]가 아니라 Number[] 형식으로 선언해준다. 한정적 타입 매개변수를 사용하면, 해당 매개변수의 최상위 타입이 제공하는 메서드는 사용 가능하다. 한정적 타입 매개변수의 조건..
들어가기 전 이 글은 인프런 백기선님의 이펙티브 자바 강의를 복습하며 작성한 글입니다. 이 글의 요약 가급적이면 리스트를 쓰는게 좋으나, 성능 문제로 배열을 써야하는 경우가 있다. 이 때도 가급적이면 제네릭을 사용하도록 하자. 배열에서 제네릭을 사용하는 방법은 두 가지가 존재한다. Object[]을 생성하고, E[] 로 형변환 하는 방법이다. 이 방법은 Heap Polution이 발생할 수 있다. Object[]을 그대로 사용하고, 값을 넣고 꺼내는 시점에만 제네릭 타입으로 형변환 하는 것이다. Heap Polution이 발생하지 않는다. 는 컴파일 하고 나면 바이트 코드에 Object로 남는다. 왜냐하면 제네릭은 소거로 구현되었기 때문이다. 제네릭을 사용하는 코드로 바뀌면, 클라이언트 코드도 Raw 타..
들어가기 전 이 글은 인프런 백기선님의 강의를 복습하며 작성한 글입니다. 이 글의 요약 가변인자는 메서드에 ... 형태로 전달되는 녀석들이다. 가변인자는 배열 ([])로 전달된다. 배열을 사용하는 것은 Heap Polution의 가능성이 있다. Heap Polution은 들어오지 말아야 할 타입의 값이 들어오고, 이 값이 런타임에서 처리될 때 ClassCastException 같은 런타임 에러를 낼 수 있음을 암시한다. 제네릭 가변인수도 마찬가지다. 제네릭 가변인수는 제네릭 []을 생성하고, 제네릭 [] 역시 Heap Polution 가능성이 존재한다. Heap Polution 경고가 뜨지만, Heap Polution이 발생하지 않을 상황에서만 @SafeVarargs를 이용해서 컴파일 경고를 무시한다. ..