Java

· Java
스트림에서는 한 번만 연산을 수행할 수 있으므로 결과도 한 번만 얻을 수 있다는 것이 Java8 스트림의 가장 큰 단점이다. 스트림을 두 번 탐색하려면 IllegalStateException이 발생한다. 하지만 한 스트림에서 여러 결과를 얻어야 하는 상황이 있을 수 있다. 그러려면 한 번에 한 개 이상의 람다를 스트림으로 적용해야 한다. 즉, fork 같은 메서드를 이용해서 스트림을 포크(분기) 시키고 포크된 스트림에 다양한 함수를 적용해야 한다. 심지어 여러 연산을 각각의 스레드에서 병렬로 실행할 수 있다면 더 좋을 것이다. 하지만 Java8의 스트림에서는 이 기능을 제공하지 않는다. Spliterator(특히 늦은 바인딩 기능을 활용), BlockingQueue, Future를 이용해서 Java8에서..
· Java
Java8의 라이브러리와 언어의 업데이트된 부분을 알아보자. 어노테이션(annotation) Java의 어노테이션은 부가 정보를 프로그램에 장식할 수 있는 기능이다. 즉, 어노테이션은 문법적 메타데이터(syntactic metadata)다. Java8의 어노테이션은 두 가지가 개선되었다. 1. 어노테이션 반복 이전 자바에서는 선언에서 지정한 하나의 어노테이션만 허용했다. @interface Author { Stirng name(); } @Auth(name="a") @Auth(name="b") @Auth(name="c") // 에러 발생 : 중복된 어노테이션 이제 반복 조건만 만족한다면 선언을 할 때 하나의 어노테이션 형식에 여러 어노테이션을 지정할 수 있다. 어노테이션 반복은 기본으로 제공되는 기능이 아..
· Java
패턴 매칭 일반적으로 함수형 프로그래밍을 구분하는 중요한 특징으로 구조적인 패턴 매칭(pattern matching)을 들 수 있다. 예를 들어 자동차 연료를 주입하는 로직이 있다고 가정했을때 가솔린, 디젤, 전기 차량에 따라 다른 연료를 주입해야 한다. 이럴때 자바에서는 if-then-else나 switch문을 사용해서 구현하곤 한다. public class Car { } public class GasolineCar extends Car { } public class DieselCar extends Car { } public class ElectricCar extends Car { } // 연료 주입 public Car fuel(Car car) { if (car instanceof GasolineCar..
· Java
스트림과 게으른 평가 스트림은 데이터 컬렉션을 처리하는 편리한 도구다. 효율적인 구현 및 여러 이유로 Java8 설계자들은 스트림을 조금 특별한 방법으로 java8에 추가했다. 그중 하나로 스트림은 단 한 번만 소비할 수 있다는 제약이 있어서 스트림은 재귀적으로 정의할 수 없다. 자기 정의 스트림 다음 코드처럼 소수 스트림을 계산할 수 있다. public boolean isPrime(int candidate) { int candidateRoot = (int) Math.sqrt((double) candidate); return IntStream.rangeClosed(2, candidateRoot) .noneMatch(i -> candidate % i == 0); } public Stream primes(i..
· Java
함수는 모든 곳에 존재한다. 함수형 프로그래밍이란 함수나 메서드가 수학의 함수처럼 부작용 없이 동작함을 의미한다. 함수형 언어 프로그래머는 함수형 프로그래밍이라는 용어를 좀 더 폭넓게 사용한다. 즉, 함수를 마치 일반 값처럼 사용해서 인수로 전달하거나, 결과로 반환받거나, 자료구조에 저장할 수 있음을 의미한다. 일반 값처럼 취급할 수 있는 함수를 일급 함수(first-class function)라고 한다. 자바 8에서는 :: 연산자로 메서드 참조를 만들거나 람다 표현식으로 직접 함숫값을 표현해서 메서드를 함수값으로 사용할 수 있다. 고차원 함수 함수형 프로그래밍 커뮤니티에 따르면 다음 중 하나 이상의 동작을 수행하는 함수를 고차원 함수(higher-order functions)라 부른다. 하나 이상의 함..
· Java
재귀와 반복 순수 함수형 프로그래밍 언어에서는 while, for 같은 반복문을 표함하지 않는다. 이러한 반복문 때문에 변화가 자연스럽게 코드에 스며들 수 있기 때문이다. 예를 들어 while 루프의 조건문을 갱신해야 할 때가 있다. 그렇지 않으면 루프가 아예 실행되지 않거나 무한으로 반복할 수 있다. 이외의 일반적인 상황에서는 루프를 안전하게 사용할 수 있다. 함수형 스타일에서는 다른 누군가가 변화를 알아차리지만 못한다면 아무 상관이 없다고 설명했다. 즉, 지역변수는 자유롭게 갱신할 수 있다. Iterator it = names.iterator(); while (it.hasNext()) { String name = it.next(); } 위 코드에서 호출자는 변화를 확인할 수 없으므로 아무 문제가 없다..
· Java
시스템 구현과 유지보수 대부분의 대규모 소프트웨어 시스템에서 실질적으로 많은 프로그래머가 유지보수 중 코드 크래시 디버깅 문제를 가장 많이 겪게 된다. 쉽게 유지보수할 수 있으려면 프로그램이 어떤 모습이어야 할까? 프로그램이 시스템의 구조를 이해하기 쉽게 클래스 계층으로 반영한다면 좋을 것이다. 시스템의 각 부분의 상호 의존성을 가리키는 결합성(coupoing)과 시스템의 다양한 부분이 서로 어떤 관계를 갖는지 가리키는 응집성(cohesion)이라는 소프트웨어 엔지니어링 도구로 프로그램 구조를 평가할 수 있다. 이러한 문제들을 함수형 프로그래밍이 제공하는 부작용 없음(no side effect)과 불변성(immutablility)이라는 개념으로 해결하는데 도움을 준다. 공유된 가변 데이터 코드 크래시는 ..
· Java
간단한 리액티브 애플리케이션 만들기 Flow클래스에 정의된 인터페이스 대부분은 직접 구현하도록 의도된 것이 아니다. 그럼에도 Java9 라이브러리는 이들 인터페이스를 구현하는 클래스를 제공하지 않는다. 이전에 언급한 Akka, RxJava 등의 리액티브 라이브러리에서는 이들 인터페이스를 구현했다. java.util.concurrency.Flow 명세는 이들 라이브러리가 준수해야 할 규칙과 다양한 리액티브 라이브러리를 제시한다. 그렇지만 Flow API를 직접 이용해보고 애플리케이션을 개발하면서 Flow 클래스안에 4개의 인터페이스가 어떻게 작동하는지 알아보자. 예를 들어 로또 번호를 발급한다고 가정해보자. 1부터 45까지에 랜덤한 숫자를 6번 발급하도록 한다면 7번째 발급 시에 RuntimeExcepti..
· Java
리액티브 스트림이란? 리액티브 프로그래밍은 리액티브 스트림을 사용하는 프로그래밍이다. 리액티브 스트림은 잠재적으로 무한의 비동기 데이터를 순서대로 그리고 블록 하지 않는 역압력을 전재해 처리하는 표준 기술이다. 역압력은 발행-구독 프로토콜에서 이벤트 스트림의 구독자가 이벤트를 소비하는 시간이 발행자가 이벤트를 제공하는 속도보다 느릴 때 문제가 발생하지 않도록 보장하는 장치다. 이런 상황이 발생하였을 때 부하가 발생한 컴포넌트가 완전 불능이 되거나 예기치 않는 방식으로 이벤트를 잃어버리는 등의 문제가 발생하지 않는다. 부하가 발생했을 때 발행자가 충분한 알림을 받을 수 있어야 한다. 실제 비동기 작업이 실행되는 동안 시스템에는 암묵적으로 블록 API로 인해 역압력이 제공되는 것이다. 안타깝게도 비동기 작업..
· Java
리액티브 프로그래밍이란? 수년 전까지 대규모 애플리케이션은 수십 대의 서버, 기가바이트의 데이터, 수초의 응답시간, 당연히 여겨졌던 몇 시간의 유지보수 시간 등의 특징을 가졌다. 오늘날에는 다음과 같은 적어도 세 가지 이유로 상황이 변하고 있다. 빅데이터 보통 빅데이터는 페타바이트 단위로 구성되며 매일 증가한다. 다양한 환경 모바일 디바이스에서 수천 개의 멀티 코어 프로세서로 실행되는 클라우드 기반 클러스터에 이르기까지 다양한 환경에 애플리케이션이 배포된다. 사용 패턴 사용자는 1년 내낸 항상 서비스를 이용할 수 있으며 밀리초 단위의 응답 시간을 기대한다. 예전 소프트웨어 아키텍처로는 오늘날의 이런 요구사항을 만족시킬 수 없다. 인터넷 트래픽을 가장 많이 일으키는 디바이스가 모바일인 요즘은 이런 양상이 ..
beekei
'Java' 카테고리의 글 목록