클래스 내부에서 사용할 데이터 타입을 외부에서 지정하는 기법을 의미한다
ArrayList<String> list = new ArrayList<>();
이와 같이 자바의 컬렉션 프레임워크에서 많이 사용한다. ArrayList 클래스 자체에서는 어떤 데이터 타입을 받을 지 지정해놓지 않고, 외부에서 이를 사용할 때 나 String list 만들거야! 하는 식이다.
public class GenericPrinterTest {
public static void main(String[] args) {
GenericPrinter<Powder> powderPrinter = new GenericPrinter<Powder>();
powderPrinter.setMaterial(new Powder());
Powder powder = powderPrinter.getMaterial();
System.out.println(powderPrinter);
GenericPrinter<Plastic> plasticPrinter = new GenericPrinter<Plastic>();
plasticPrinter.setMaterial(new Plastic());
Plastic plastic = plasticPrinter.getMaterial();
System.out.println(plasticPrinter);
}
}
이런 코드가 있다고 칠 때 여기서 GenericPrinter는 Generic 클래스 일 것이다. 그런데 같은 material이긴 하지만 Water라는 또 다른 Material class가 있을 때, 이 Water는 Printer에 들어갈 수 없다고 하자. 이를 어떻게 막을 수 있을까?
이럴 때는 플라스틱과 파우더에 대한 상위클래스인 Material을 만들고 하위클래스들이 이를 상속받게 한 후 public class GenericPrinter<T extends Material> 이런식으로 사용하면 Material 클래스를 상속받은 애들만 사용 가능하도록 할 수 있다. 상위클래스를 추상 클래스로 구현 시 공통 구현 부분을 안내하는 장점은 덤
<> 다이아몬드 연산자
컴파일 타임시에만 타입 체크가 가능하며 런타임에는 타입 체크가 불가능하다. Type erasure 절차를 통해 타입이 제거 되어 모두 Object로 변환되기 때문에 타입 안전성을 지키기 위한 주의가 필요하다.
Optional은 Null Point Exception 문제를 해결할 수 있는 방법을 제공한다.
모든 타입의 객체를 담을 수 있는 Wapper Class로, Optional 객체를 생성하려면 of() 또는 ofNullable() 메소들르 사용한다. Null 값이 올 수 있다면 of Nullable()을 사용한다.
Optional 객체의 값 null 여부를 판단하여 값이 있을 경우 true, null일 경우 false를 반환한다.
Optional 타입의 참조 변수를 기본값으로 초기화 할 때 사용한다
Optional 객체에 저장된 값을 가져올 때 사용한다
이외 메소드 체이닝 방식으로도 활용할 수 있는데
[Java] Optional 올바르게 사용하기 이 포스트에 정리가 아주 잘 되어있어서, 보면서 노마드 코드 리팩토링을 해야겠다는 생각을 많이 했다..!
제한된 값 목록을 갖는 타입
컴파일 타임에 타입 안정성을 보장
명시적으로 값이 정의되어있어 가독성이 높음
값 변경 시 한 곳에서만 변경하면 되기 때문에 유지보수에 용이
컴파일 시 정적인 값으로 변환되어 상수 검색의 오버헤드를 줄임
일반적인 상수를 정의하는 방식인 public static final 상수들의 집합보다 효율적으로 동작함
직렬화가 가능하며, 싱글톤으로 만들어져 메모리 공유가 가능하다