DEV ℧ Developer Diary

[EffectiveJava] item31 - 한정적 와일드카드를 사용해 API 유연성을 높이라

해당 Item의 정리에 앞서 자주 등장하는 단어인 불공변(invariant)과 공변(covariant)을 정리하고 가보자.

공변(covariant)   : A가 B의 하위 타입 일때, T<A>가 T<B>의 하위 타입이다.
불공변(invariant) : A가 B의 하위 타입 일때, T<A>가 T<B>의 하위 타입이 아니다.

대표적인 예시로 배열은 공변이며, 제네릭은 불공변으로 볼...

[EffectiveJava] item30 - 이왕이면 제네릭 메소드로 만들라

클래스와 마찬가지로 메소드도 제네릭으로 만들 수 있다. 매개변수화 타입을 받는 정적 유틸리티 메서드는 보통 제네릭이다. 예를 들어 Collections의 ‘알고리즘’ 메서드(binarySearch, sort 등)는 모두 제네릭 메서드로 구현되어 있다.

아래는 Collections의 binarySearch메서드 이다. 해당 메서드는 제네릭 메서드로 구현된걸 볼 수 있다.

  • binarySearch
<div...

[Java] Spring boot에서 graceful shutdown을 적용하자

최근 서버에 배포시마다 연결이 끊김에 따라, 해당 해결방법을 찾던 도중 Spring boot에서 graceful shutdown 이란 기능을 지원하는 것을 알게 되었다.

graceful [우아한] 이란 뜻이며, 말그대로 서버를 종료할때 갑자기 종료 시켜버리는 것이 아닌, 마저 하던 일을 종료하고 우아하게 종료하는 것을 말한다.

반대는 hard shutdown으로, 현재 실행되는...

[EffectiveJava] item29 - 이왕이면 제네릭 타입으로 만들라

JDK가 제공하는 제네릭 타입과 메서드를 사용하는 일은 일반적으로 쉬운 편 이지만, 제네릭 타입을 새로 만드는 일은 조금 더 어렵다.

아래의 예시코드를 살펴보자. item7의 예제코드 이다.

제네릭 변환

public class StackArray { private Object<span...

[EffectiveJava] item28 - 배열보다는 리스트를 사용하라

배열과 제네릭 타입에는 중요한 차이가 두가지 있다. 첫 번째로 배열은 공변(covariant : 함께 변한다)이다. Sub가 Super의 하위 타입이라면 배열 Sub[]는 배열 Super[]의 하위 타입이 된다. 반면, 제네릭은 불공변(invariant : 함께 변하지 않는다.)이다. 즉, 서로 다른 타입 Type1, Type2가 있을 때, List은 List의 하위 타입도 아니고...