[안드로이드 면접] - : 21
1. 선언형 프로그래밍과 명령형 프로그래밍의 차이는?
명령형 프로그래밍은 컴퓨터가 어떻게 행동해야 하는지를 프로그래밍하는 것이고,
선언형 프로그래밍은 컴퓨터가 무엇을 해야할지를 프로그래밍 하는 것이다.
명령형 프로그래밍은 컴퓨터가 어떻게 행동해야할 것인가, 모든 행동을 코드에 짜넣어야 한다.
반면에 선언적 프로그래밍은 이러한 과정이 없다. 그냥 단순하게 무엇을 하지를 명시하기만 하면된다. 따라서, 프로그래밍 공부를 하지 않은 상태에서 생각을 해보면 인간의 사고와 매우 비슷한 방식으로 구동되기 때문에 쉽게 이해할 수 있다.
선언형 프로그래밍은 인간의 사고와 유사하게 하기 위해서 추상화 시켜 프로그래밍이 된 것이다.
실제로는 명령형 구문이 선언형 뒤에서 코드가 실행되고 있다고 생각하면 될 것이다.
2. 데이터 스트림이란?
영어 말 그대로 데이터의 흐름이라고 할 수 있다.
수 많은 데이터의 흐름 속에서 각각의 원하는 값을 가공하여, 최종 소비자에게 제공하는 역할을 한다.
스트림은 컬렉션의 저장 요소를 하나 씩 참조해서 람다식으로 처리할 수 있도록 해주는 반복자이다.
스트림의 특징
- 람다식으로 요소 처리 코드를 제공한다.
- 내부 반복자를 사용하므로 병렬 처리가 쉽다. 내부 반복자는 요소들의 변경 순서를 변경하거나, 멀티 코어 CPU 를 최대한 활용하기 위해서는 요소들을 분배시켜 병렬 작업을 할 수 있도록 도와준다. 따라서 효율이 좋다.
- 중간 처리와 최종 처리가 존재한다. 중간 처리는 매핑, 필터링, 정렬을 수행하고 최종 처리에서는 반복, 카운팅, 평균 총합 등의 집계 처리를 수행한다.
3. 리액티브 프로그래밍이란?
변화의 전파와 데이터 흐름과 관련된 선언적 프로그래밍 패러다임이다.
변화의 전파와 데이터 흐름
: 데이터가 변경될 때마다 이벤트를 발생 시켜서 데이터를 계속적으로 전달한다.
선언적 프로그래밍
: 실행할 동작을 구체적으로 명시하는 명령형 프로그램과 달리 선언형 프로그래밍은 무엇을 해야할지에 대한 단순한 목표를 선언한다.
리액티브 선언
- 응답성 : 시스템은 즉각 응답해야 합니다. 응답성 있는 시스템은 신속하고 일관성 있는 응답 시간을 유지해 일관된 서비스 품질을 제공한다.
- 탄력성 : 시스템 장애가 발생하더라도 응답성을 유지해야 한다. 탄력성은 복제, 봉쇄, 경리, 위임에 의해서 이루어진다. 장애는 각 컴포넌트 내부로 억제 돼 각 컴포넌트들을 서로 격리 시킨다. 따라서 하나의 컴포넌트에 장애가 발생하더라도 전체 시스템에 영향을 끼치지 못하게 된다.
- 유연성 : 리액티브 시스템은 작업량이 변하더라도 그 변화에 대응하고 응답성을 유지해야 한다. 또한 상용 하드웨어 및 소프트웨어 플랫폼에서 효율적인 비용으로 유연성을 확보한다.
- 메시지 기반 : 탄력성의 원칙을 지키려면 리액티브 시스템은 비동기적인 메시지 전달에 의존해 컴포넌트들 간의 경계를 형성해야 한다.
리액티브 프로그래밍의 주요 구성 요소
1. Observable : 데이터 스트림으로, Observable 은 하나의 스레드에서 다른 스레드로 전달할 데이터를 압축한다. 주기적 또는 설정에 따라 생애 주기동안 데이터를 방출한다. Observable 은 데이터를 처리하고 다른 구성요소에 전달하는 역할을 수행한다.
2. Observers : Observable 에 의해서 방출된 데이터 스트림을 받아서 처리한다.
3. Schedulers : 리액티브 프로그래밍은 비동기 프로그래밍을 위한 것으로 개발자는 스레드를 관리해야할 필요가 있다. 스케줄러는 위 두가지에게 그들이 실행되어야 할 스레드를 알려주는 구성요소이다.