본문 바로가기

fp13

자바8 inAction - [10] Null 대신 Optioanl null 대신 Optioanl null 래퍼런스의 문제점과 null을 멀리해야 하는 이유 null 대신 Optioanl: null로부터 안전한 도메인 모델 재구현하기. Optioanl 활용: null 확인 코드 제거하기. Optional에 저장된 값을 확인하는 방법 값이 없을 수 있는 상황을 고려하는 프로그래밍 null은 구현하기 쉬웠기 때문에 존재했던 것이지, 의도했던 것은 아니다. 00. 값이 없는 상황을 어떻게 처리할까? public String getCarInsuranceName(Person person){ if(persion != null) { Car car = person.getCar(); if(car != null) { Insurance insurance = car.getInsurance().. 2019. 8. 31.
자바8 inAction - [9] Default method 이해하기 디폴트 메서드 디폴트 메서드란 무엇인가? 진화하는 API가 호환성을 유지하는 방법 디폴트 메서드의 활용 패턴 해결 규칙 자바8에서는 기본 구현을 포함하는 인터페이스를 정의하는 두 가지 방법을 제공한다. 첫 번째는 인터페이스 내부에 정적 메서드(static mathod)를 사용하는 것 두 번째는 인터페이스의 기본 구현을 제공할 수 있도록 디폴트 메서드 라는 기능을 사용하는 것 즉, 자바8 에서는 메서드 구현을 포함하는 인터페이스를 정의할 수 있다. 결과적으로 기존 인터페이스를 구현하는 클래스는 자동으로 인터페이스에 추가된 새로운 메소드의 디폴트 메서드를 상속받게 된다. 이렇게 하면 기존의 코드 구현을 바꾸도록 강요하지 않으면서도 인터페이스를 바꿀 수 있다. 결국 인터페이스가 아니라 추상 클래스 아닌가? 인.. 2019. 8. 31.
자바8 inAction - [7] 병렬데이터 처리와 성능 병렬 데이터 처리와 성능 병렬 스트림으로 데이터를 병렬 처리하기 병렬 스트림의 성능분석 포크/조인 프레임워크 Spliterator로 스트림 데이터 쪼개기 스트림을 이용하면 순차 스트림을 병렬 스트림으로 자연스럽게 바꿀 수 있다. 어떻게 이런 방법같은 일이 일어날 수 있는지, 더 나아가 자바7에 추가된 포크/조인 프레임워크와 내부적인 병렬 스트림 처리는 어떤 관계가 있는가? 우선 여러 청크를 병렬로 처리하기 전에 병렬 스트림이 요소를 여러 청크로 분활하는 방법과, 이 원리를 이해하지 못하면 의도치 않은 설명하기 어려운 결과가 발생할 수 있다. 따라서 커스텀 Spliterator를 직접 구현하면서 분할 과정을 우리가 원하는 방식으로 제어하는 방법도 설명한다. 병렬 스트림 parallelStream 을 호출하.. 2019. 8. 31.
자바8 inAction - [6] 스트림으로 데이터 수집하기 스트림으로 데이터 수집 Collectors 클래스로 컬렉션을 만들고 사용하기 하나의 값으로 데이터 스트림 리튜스하기 특별한 리듀싱 요약 연산 데이터 그룹화의 분할 자신만의 커스텀 컬렉션 개발 다양한 요소 누적 방식 Collector 인터페이스에 정의 미리 정의된 컬렉션 Collectors에서 제공하는 메서드의 기능은 크게 세 가지로 구분 할 수 있다. 스트림 요소를 하나의 값으로 리듀스하고 요약 요소 그룹화 요소 분할 리듀스과 요약 counting() long howManyDishs = menu.stream().collect(Collectors.counting()); long howManyDishs = menu.stream().count(); Collectors.maxBy , Collectors.minB.. 2019. 8. 31.
자바8 inAction - [5] 스트림 활용 - 스트림 제대로 알고 사용하기. 스트림 활용 필터링, 슬라이싱, 매칭 검색, 매칭, 리듀싱 특정 범위의 숫자와 같은 숫자 스트림 사용하기 다중 소스로부터 스트림 만들기 무한 스트림 여기서는 기본적인 filter, map 등의 기본연산은 생략하고, 조금 더 실용적인 스트림 활용만을 정리해보자. 두 개의 숫자 리스트가 있을 때 모든 숫자 쌍의 리스트를 반환하시오. 예를 들어 두 개의 리스트 [1,2,3]과 [3,4]가 주어지면 [(1,3), (1,4), (2,3), (2,4), (3,3), (3,4)] 를 반환 List num1 = Arrays.asList(1,2,3); List num2 = Arrays.asList(3,4); List pairs = num1.stream().flatMap(i -> num2.stream() .map(j ->.. 2019. 8. 31.
자바8 inAction - [4] 스트림 소개 - 스트림과 콜렉션의 차이는 무엇인가? 01. 스트림이란 무엇인가? 컬렉션은 만들고 처리하는 과정을 포함. 대부분의 작업에서 필수적인 요소. 그러나 우리는 여기서 컬렉션이 가지지 못한 2가지 단점을 이야기해볼 수 있다. SQL과 같은 질의를 할 수 있는가? 많은 요소를 포함하는 커다란 컬렉션은 어떻게 처리해야 될까? 이 두가지 단점을 해결하기 위해 스트림이 출연. 스트림이란, 선언형(즉, 데이터를 처리하는 임시 구현 코드 대신 질의로 표현할 수 있다.)으로 컬렉션 데이터를 처리할 수 있다. 또한, 스트림을 이용하면 멀티스레드 코드를 구현하지 않아도 데이터를 투명하게 병렬로 처리할 수 있다. import static java.util.Comparator.comparing; List lowCaloricDishesName = menu.stream(.. 2019. 8. 31.
자바8 inAction - [3] 람다 표현식 - 람다란 무엇인가? 3장. 람다 표현식 1 람다란 무엇인가? 람다 표현식 메서드로 전달할 수 있는 익명 함수를 단순화한 것. 익명 함수 전달 간결성 2 어디에, 어떻게 람다를 사용할까? 함수형 인터페이스라는 문맥에서 람다 표현식을 사용할 수 있음. 함수형 인터페이스 => 정확히 하나의 추상 메서드를 지정하는 인터페이스 public interface Predicate { boolean test(T t); } 그외 public interface Callable { V call(); } 람다 표현식으로 함수형 인터페이스의 추상 메서드 구현을 직접 전달 할 수 있으므로 전체 표현식을 함수형 인터페이스의 인스턴스로 취급(기술적으로 따지면 함수형 인터페이스를 concreate 구현한 클래스의 인스턴스) 할 수 있다. 함수 디스크럽터 .. 2019. 8. 31.
함수형 사고 - [6] 전진하라. 함수형 언어의 디자인 패턴 함수형 언어계의 어떤 이들은 디자인 패턴이 개념 자체에 결함이 있기 때문에함수형 프로그래밍이 필요가 없다고 주장한다. 패턴의 좁은정의만 볼 때에는 일리가 있는 말이다. 함수형 프로그래밍에서는 전통적인 디자인 패턴들이 다음과 같이 세 가지로 나타난다. 패턴이 언어에 흡수된다. 패턴 해법이 합수형 패러다임에도 존재하지만, 구체적인 구현방식은 다르다. 해법이 다른 언어나 패러다임에 없는 기능으로 구현된다.(예를 들어 메타프로그래밍을 사용한 해법들은 깔므하고 멋있다. 이런 해법은 자바에서는 불가능하다.) 함수 수준의 재사용 합성(주어진 매개변수와 일급 함수들의 형태로 이루어진다.) 은 함수형 프로그래밍 라이브러리에서 재사용의 방식으로 자주 사용된다. 객체지향프로그래밍에서는 함수를 재사.. 2019. 7. 26.
함수형 사고 - [5] 진화하라. "100개의 함수를 하나의 자료구조에 적용하는 것이 10개의 함수를 10개의 자료구조를 적용하는 것보다 낫다." - 앨런 펄리스 객체지향적인 명령형 프로그래밍 언어에서 재사용의 단위는 클래스와 그것들이 주고받는 메시지이다. 이것들은 클래스도표로 표시된다. 1. 적은 수의 자료구조, 많은 연산자 - 복잡한 자료구조를 직접 만들어야 하는 객체지향에 비해, 함수형은 주요 자료구조(map, set, list)와 거기에 따른 최적화된 연산들을 선호. - 그래서 XML을 파싱 할 때도, 함수형프로그래밍은 자료구조를 따로 만들 필요가 없다. - 스칼라에서 크롤링하는 코드를 보면 신기할 따름 -PlayJson ) 2. 문제를 향하여 언어를 구부리기 대부분의 개발자들은 복잡한 비지니스 문제를 자바와 같은 언어로 번역하는.. 2019. 7. 26.
함수형 사고 - [4] 열심히보다는 현명하게 패러다임을 바꾸면 더 적은 노력으로 더 많은 일을 할 수 있는 득을 보게 된다. 함수형 프로그래밍에서 나타나는 많은 구조들이 그렇다. 흔히 볼 수 있는 문제들을 구현할 때 짜증나던 것들을 제거해준다. 이 장에서는 메모이제이션과 게으름 설명을 보자. 4.1 메모이제이션 메모이제이션은 다음과같은 상황에서 유용하다. 시간이 많이 걸리는 연산을 반복적으로 사용해야 한다는 가정 주어진 매개변수를 사용하여 연산을 할 때마다 그값을 매개변수를 키 값으로 하는 캐시에 저장한다. 후에 이 함수가 같은 매개변수로 호출되면 다시 연산하는 대신에 캐시의 값을 리턴한다. 함수 캐싱은 전형적인 컴퓨터과학의 트레이드오프이다. 이 방법은 좋은 성능을 위해서 메모리를 더 많이 사용한다. 캐싱 방법이 제대로 작동하려면 함수가 순수해야 .. 2019. 7. 26.
함수형 사고 - [3] 양도하라. 반복처리에서 고계함수로- 클로저란 함수의 예로 표현 def Closure makeCounter(){ def local_variable = 0 return{return local_variable += 1} } c1 = makeCounter() c1() c1() c1() c2 = makeCounter() printIn "C1 = ${c1()}, C2 = ${c2()}" //C1 = 4, C2 = 1 만약 이 부분을 자바로 짠다면 어떻게 될까? import java.util.List; import java.util.ArrayList; // BEGIN counter_demo class Counter { public int varField; Counter(int var) { varField = var; } pub.. 2019. 7. 21.
함수형 사고 - [2] 전환 함수형 코드를 작성하기 위해서는, 함수형 언어인 스칼라나 클로저로의 전환이 필요한 것이 아니라 문제에 접근하는 방식의 전환이 필요하다. 1. 일반적인 예로 말할 수 있는 것은 JVM 왜일까? 우리가 C로 개발할 때는 메모리관리에 신경을 썼었지만, 이제는 JVM, 즉 컴퓨터에게 위임했기 때문. 2. 명령형 처리 명령형 프로그래밍이란 상태를 변형하는 일련의 명령들로 구성된 프로그래밍 방식을 말한다. 전형적인 For루프가 명령형 프로그래밍의 훌룡한 예. 초기 상태를 설정하고, 되풀이할 때마다 일련의 명령을 실행. 명령형 프로그래밍과 함수형 프로그래밍의 차이는, 통상적인 문제와 그에 대한 명령형의 해답을 살펴보면된다. 어떤 이름 목록에서, 한 글자로 된 이름을 제외한 모든 이름을 대문자화해서 쉼표로 연결한 문자.. 2019. 7. 21.
함수형 사고 - [1] 왜 왜 우리는 객체지향에서 함수형 패러다임으로 전환된다고 생각할까? 패러다임의 전환 바로 밑에 예제를 보고 느껴보자. package com.nealford.ft.wordfreq; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; // BEGIN java_word_freq public class Words { private Set NON_WORDS = new HashSet() {{ add("the"); add("and"); add("of"); add("to"); add("a"); add("i"); add("it"); add("in"); add("or"); add("is"); add("d"); add("s"); .. 2019. 7. 18.