-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[모던 자바 인 액션] 9주차 #11
Comments
시스템 구현과 유지보수공유된 가변 데이터변수가 예상하지 못하는 값을 갖는 이유는 시스템의 여러 메서드에서 공유된 가변 데이터 구조를 읽고 갱신하기 때문이다. 어떤 자료구조도 바꾸지 않는 시스템이 있다면 문제가 일어날 일이 없다(유지 보수하기 쉽다). 공유된 가변 데이터 구조로 인해 변수가 예상하지 못한 값을 갖게 되고 데이터 갱신 사실을 추척하기 어려워진다. 자신을 포함하는 클래스의 상태 그리고 다른 객체의 상태를 바꾸지 않으며 return 문을 통해서만 자신의 결과를 반환하는 메서드를 순수(pure) 메서드 또는 부작용 없는(side-effect free) 메서드라고 부른다. 이때 말하는 부작용은 아래와 같다.
부작용 없는 시스템 컴포넌트에서는 메서드가 서로 간섭하지 않으므로 잠금을 사용하지 않고도 멀티코어 병렬성을 사용할 수 있다. 함수형 프로그래밍이 제공하는 부작용 없음(no side effect)과 불변성(immutability)이라는 개념은 시스템의 유지보수에 큰 도움을 준다. 선언형 프로그래밍'어떻게(how)' 구현할 것인지 집중하는 프로그래밍 형식은 고전적 객체지향 프로그래밍에서 이용하는 방식이다. 명령형 프로그래밍이라고 부르기도 한다. Transaction mostExpensive = transactions.get(0);
if (mostExpensive == null)
throw new IllegalArgumentException("Empty list of transactions");
for(Transaction t: transactions.subList(1, transactions.size())) {
if (t.getValue() > mostExpensive.getValue()) {
mostExpensive = t;
}
} '무엇을' 에 집중하는 방식도 있다. 선언형 프로그래밍이라고 부르며, 우리가 원하는 것이 무엇이고 시스템이 어떻게 그 목표를 달성할 것인지 등의 규칙을 정한다. Optional<Transaction> mostExpensive =
transactions.stream().max(comparing(Transaction::getValue)); 함수형 프로그래밍
함수형 자바
|
9주차 리액티브 프로그래밍💡 모던 자바 인 액션 > 17장 내용 정리변화하는 상황
리액티브 프로그래밍은 높은 응답성과 가용성을 제공하여 이러한 문제를 해결한다. 리액티브 매니패스토
애플리케이션 수준의 리액티브
시스템 수준의 리액티브
리액티브 스트림과 플로 API
Flow 클래스
public final class Flow {
private Flow() {
} // uninstantiable
// 구독자가 받는 메시지를 발행하는 생산자
@FunctionalInterface
public static interface Publisher<T> {
// 주어진 구독자를 등록
public void subscribe(Subscriber<? super T> subscriber);
}
// 메시지를 받는 구독자
// onSubscribe onNext* (onError | onComplete)?
// onSubscribe - onNext - onNext - onNext - onComplete
public static interface Subscriber<T> {
// Subscriber 가 Publisher 에 자신을 등록할 때 Publisher 가 onSubscribe 를 호출해 Subscription을 전달한다.
public void onSubscribe(Subscription subscription);
// 메시지를 수신하면 호출
public void onNext(T item);
// 메시지를 정상적으로 받지 못할 경우 호출
public void onError(Throwable throwable);
// 추가 메시지가 없을 경우 호출
public void onComplete();
}
// Publisher 와 Subscriber 간 메시지를 제어하며 Subscriber 에 의해서만 호출된다.
public static interface Subscription {
// publishser 에게 주어진 메시지를 처리할 준비가 되었음을 알림
public void request(long n);
// publisher 에게 이벤트를 받지 않음을 통지
public void cancel();
}
// 리액티브 스트림에서 처리하는 이벤트의 변환단계를 나타낸다.
// Publisher 를 구독한 다음 수신한 데이터를 가공해 다시 제공할 때 사용한다.
public static interface Processor<T, R> extends Subscriber<T>, Publisher<R> {
}
static final int DEFAULT_BUFFER_SIZE = 256;
// Publisher 와 Subscriber 의 기본 버퍼 사이즈를 제공한다.
public static int defaultBufferSize() {
return DEFAULT_BUFFER_SIZE;
}
} 인터페이스 사용 규칙
|
https://reactivex.io/
|
스터디 날짜
2023.08.25 금 9:00-10:00
내용
챕터17. 리액티브 프로그래밍
챕터18. 함수형 관점으로 생각하기
공유
최승위
이성온
정민교
The text was updated successfully, but these errors were encountered: