29 Apr 2023 EffectiveJava
해당 Item의 정리에 앞서 자주 등장하는 단어인 불공변(invariant)과 공변(covariant)을 정리하고 가보자.
공변(covariant) : A가 B의 하위 타입 일때, T<A>가 T<B>의 하위 타입이다.
불공변(invariant) : A가 B의 하위 타입 일때, T<A>가 T<B>의 하위 타입이 아니다.
대표적인 예시로 배열은 공변이며, 제네릭은 불공변으로 볼...
29 Apr 2023 EffectiveJava
클래스와 마찬가지로 메소드도 제네릭으로 만들 수 있다. 매개변수화 타입을 받는 정적 유틸리티 메서드는 보통 제네릭이다. 예를 들어 Collections의 ‘알고리즘’ 메서드(binarySearch, sort 등)는 모두 제네릭 메서드로 구현되어 있다.
아래는 Collections의 binarySearch메서드 이다. 해당 메서드는 제네릭 메서드로 구현된걸 볼 수 있다.
<div...
28 Apr 2023 Java
최근 서버에 배포시마다 연결이 끊김에 따라, 해당 해결방법을 찾던 도중 Spring boot에서 graceful shutdown 이란 기능을 지원하는 것을 알게 되었다.
graceful [우아한] 이란 뜻이며, 말그대로 서버를 종료할때 갑자기 종료 시켜버리는 것이 아닌, 마저 하던 일을 종료하고 우아하게 종료하는 것을 말한다.
반대는 hard shutdown으로, 현재 실행되는...
18 Apr 2023 EffectiveJava
JDK가 제공하는 제네릭 타입과 메서드를 사용하는 일은 일반적으로 쉬운 편 이지만, 제네릭 타입을 새로 만드는 일은 조금 더 어렵다.
아래의 예시코드를 살펴보자. item7의 예제코드 이다.
제네릭 변환
public class StackArray { private Object<span...
16 Apr 2023 EffectiveJava
배열과 제네릭 타입에는 중요한 차이가 두가지 있다. 첫 번째로 배열은 공변(covariant : 함께 변한다)이다. Sub가 Super의 하위 타입이라면 배열 Sub[]는 배열 Super[]의 하위 타입이 된다. 반면, 제네릭은 불공변(invariant : 함께 변하지 않는다.)이다. 즉, 서로 다른 타입 Type1, Type2가 있을 때, List은 List의 하위 타입도 아니고...