PECS는 "Producer Extends, Consumer Super"의 약자
Java의 제네릭을 사용할 때 변성(variance)을 적용하는 흔한 규칙이다.
1 Producer Extends (PE)
"Producer Extends"는 데이터를 읽을 때 사용하는 제네릭 타입에는 extends를 사용해야 한다는 원칙이다.
즉, "생산자"는 extends를 사용한다.
이렇게 하면, 하위 타입의 객체를 읽을 때 유연성이 증가한다.
public <T> void processProducer(List<? extends T> producer) {
for (T item : producer) {
// Do something with item
}
}
(받아 온 데이터를 이용해 뭔가를 produce 함)
2 Consumer Super (CS)
"Consumer Super"는 데이터를 쓸 때 사용하는 제네릭 타입에는 super를 사용해야 한다는 원칙이다.
즉, "소비자"는 super를 사용한다.
이를 통해, 다양한 타입의 객체를 안전하게 쓸 수 있다.
public <T> void processConsumer(List<? super T> consumer, T item) {
consumer.add(item);
}
(받아 온 데이터에 나의 것을 consume 해서 무언가를 함)
PECS 원칙을 따르면, 메서드 파라미터로 넘겨지는 제네릭 타입이 생산자인지 소비자인지를 파악할 수 있고, 이에 따라 적합한 변성을 사용하여 메서드의 유연성을 높일 수 있다.
producer 와 consumer 의 개념이 일반적으로 생각하는 것과 반대다.