
Publisher 프로토콜을 직접 구현하는 대신 Combine 프레임워크가 제공하는 타입들을 이용하면 간편하게 Custom Publisher를 구현할 수 있다.Subject 는 값을 외부에서 publish할 수 있는 메서드를 제공하는 Publisher protocol이다.
값을 주입할 때에는 send(_:) 메서드를 이용한다.
PassthroughSubject(final class)

CurrentValueSubject(final class)
value 프로퍼티를 가지고 있으면서 send(_:) 메서드가 호출될 때마다 value 를 해당 값으로 갱신한다. → value 를 통해 가장 최근에 pubilsh된 값에 접근할 수 있다.value 를 보내준다.

타입 프로퍼티에 @Published 를 추가하여 해당 프로퍼티의 값이 변경될 때마다 값을 보내주는 publisher를 생성할 수 있다. $ 를 프로퍼티 이름 앞에 추가하여 publisher에 접근한다.

willSet 블록에서 publishing이 일어난다. 즉, 실제 값이 프로퍼티에 적용되기 전에 subscriber는 값을 받게 된다.
고유한 프로퍼티를 가지지 않는, publisher의 구현체이다. upstream publisher로부터 받은 값들과 completion(성공/실패 여부)들을 전달해주는 역할은 유지하고 있으므로 타입 특이적인 정보를 지우는 데(type erasure) 이용된다.
send(_:)) 가능한 Subject 등에서 타입에 의존되는 메서드나 프로퍼티를 감추고 싶을 때이용하면 좋다.
eraseToAnyPublisher() operator를 통해 publisher를 AnyPublisher로 간단하게 wrap할 수 있다.Publisher로부터 Subscriber가 값을 받기 위해서는 1. Subscription이 필요하고, 2. Demand(값을 요청하는 것)가 필요하다.
Demand
request(_:) 메서드를 호출하여 값을 요청한다.receive(_:) 메서드를 호출한다. 메서드의 리턴 값으로 Demand를 리턴한다.high or unlimited demand
sink(receiveValue:) , assign(to:on:) 을 통해 생성되는 편의 Subscriber는 처음 publisher와 연결되자마자 unlimited Demand를 보낸다.custom subscriber

"--done--" 도 아직 출력되지 않았다.publisher.send(completion: .finished) 를 호출하여 완료하거나, 그 전에 subscription 객체를 이용해서 새로운 demand를 보낼 수도 있다.A protocol indicating that an activity or action supports cancellation.
cancel() 을 호출하여 할당된 리소스들을 제거하고 subscription을 중단한다.cancel() 을 호출한다. AnyCancellable로 subscription을 property에 저장해두면 해당 인스턴스가 메모리에서 제거될 때 subscription과 할당된 메모리를 자동으로 해제한다.store(in:) 을 통해 collection이나 set에 cancellable instance를 저장할 수도 있다.