동작 파리미터화 코드 전달하기 제목으로 추측하였을 때 이 쳅터에서 집중해야 하는 부분은 "동작 파라미터화가 무엇"이고 "코드 전달은 어떻게 이루어지는가?" 인 거 같다. 동작 파라미터화 우선 동작 파라미터화란 아직 어떻게 실행할 것인지 결정하지 않은 코드 블록을 의미한다고 한다. 아직 결정되지 않았기에 실행은 나중으로 미뤄지고 프로그램에서 호출된다...
람다 표현식 람다 표현식은 메서드로 전달할 수 있는 익명 함수를 단순화한 것이라 할 수 있다. 즉, 새로운 개념은 아니다. 앞선 장의 동작을 파라미터화하여 코드로 전달하는 하나의 방법 중 하나이다. 예시로 이를 확인하면 아래와 같다. 확실히 익명함수보다 간결해진 것을 느낄 수 있다. 이러한 람다는 다음 3가지로 부분으로 이루어진다. 파라미터 ...
스트림 소개 스트림을 이용하면 선언형으로 컬렉션 데이터를 처리할 수 있다고 한다. 그리고 가비지 변수를 사용하지 않을 수 있다. 위의 코드를 보면 lowCaloricDishes라는 가비지 변수를 사용하였다. 하지만 이는 스트림을 사용하면 다음과 같이 작성할 수 있다. 선언형의 장점을 위의 코드로도 확인할 수 있다. 선언형은 루프와 if 조건문 ...
스트림 소개 스트림을 이용하면 선언형으로 컬렉션 데이터를 처리할 수 있다고 한다. 그리고 가비지 변수를 사용하지 않을 수 있다. 위의 코드를 보면 lowCaloricDishes라는 가비지 변수를 사용하였다. 하지만 이는 스트림을 사용하면 다음과 같이 작성할 수 있다. 선언형의 장점을 위의 코드로도 확인할 수 있다. 선언형은 루프와 if 조건문 ...
스트림으로 데이터 수집 컬렉터란? Collector 인터페이스 구현은 스트림의 요소를 어떤 식으로 도출할지 지정한다. 스트림에 collect를 호출하면 스트림의 요소에 리듀싱 연산이 수행된다. collect에서는 리듀싱 연산을 이용해서 스트림의 각 요소를 방문하면서 컬렉터가 작업을 처리한다. 보통 함수를 요소로 변환할 때는 컬렉터를 적용하며 최종...
컬렉션 API 개선 컬렉션 팩토리 리스트 팩토리 List.of 팩토리 메소드를 이용해 간단히 리스트를 만들 수 있다. 이때 리스트에 요소를 추가하려고 하면 java.lang.UnsupportedOperationException 이 발생한다. 이는 List.of 가 크기를 변경할 수 없는 리스트를 만든 것이기 때문이다. 이는 컬렉션이 의도치 않게...
리팩터링, 테스팅, 디버깅 코드 가독성 익명클래스를 람다 표현식으로 하나의 추상 메서드를 구현하는 익명 클래스는 람다 표현식으로 리팩터링할 수 있다. 익명 클래스는 코드를 장황하게 만들고 쉽게 에러를 일으킨다. 람다 표현식을 활용하면 간결하고, 가독성이 좋은 코드를 구현할 수 있다. 이때 모든 익명 클래스를 람다 표현식으로 변환할 수 있는 것은...
null 대신 Optional 클래스 Optional 클래스 소개 Optional은 선택형값을 캡슐화하는 클래스다. 값이 있으면 Optional 클래스는 값을 감싸준다. 만약 값이 없으면 Optional.empty 메서드로 Optional을 반환한다. Optional을 이용하면 값이 없는 상황이 우리 데이터에 문제가 있는 것인지 아니면 알고리즘의...
새로운 날짜와 시간 API LocalDate, LocalTime, Instant, Duration, Period 클래스 LocalDate와 LocalTime 사용 LocalDate 인스턴스는 시간을 제외한 날짜를 표현하는 불변 객체다. 이를 사용하는 기본적인 방법은 아래와 같다. get 메서드에 TemporalField를 전달해서 정보를 얻는 방...
디폴트 메서드 인터페이스를 바꾸면 이전에 해당 인터페이스를 구현했던 모든 클래스의 구현도 고쳐야 한다. 자바 8에서는 이와 같은 문제를 해결하는 두 가지 방법을 제공한다. 첫 번째는 인터페이스 내부에 정적 메서드를 사용하는 방법이 있고 두 번째는 인터페이스의 기본 구현을 제공할 수 있도록 디폴트 메서드 기능을 사용하는 것이다. 자바 8에서는 메서드...
자바 모듈 시스템 새로운 언어 기능을 통해 유지보수하기 쉬운 코드를 구현하는 것은 저수준 영역에 해당한다. 소프트웨어 아키텍처 즉 고수준 영역에서는 기반 코드를 바꿔야 할 때 유추하기 쉬우므로 생산성을 높일 수 있는 소프트웨어 프로젝트가 필요하다. 추론하기 쉬운 소프트웨어를 만드는 데 도움을 주는 것이 관심사 분리와 정보 은닉이다. 관심사 분리(S...
CompletableFuture: 안정적 비동기 프로그래밍 Future의 단순 활용 자바 5부터는 미래의 어느 시점에 결과를 얻는 모델에 활용할 수 있도록 Future 인터페이스를 제공한다. 비동기 계산을 모델링하는 데 Future를 이용할 수 있으며, Future는 계산이 끝났을 때 결과에 접근할 수 있는 참조를 제공한다. 시간이 걸릴 수 있는 ...
리액티브 프로그래밍 리액티브 매니패스토 반응성 리액티브 시스템은 빠를 뿐 아니라 더 중요한 특징으로 일정하고 예상할 수 있는 반응 시간을 제공한다는 것이다. 그렇기에 사용자가 기대치를 가질 수 있다. 회복성 장애가 발생해도 시스템은 반응해야 한다. 컴포넌트 실행 복제, 여러 컴포넌트의 시간과 공간 분리, 각 컴포넌트가 비동기적으로 작업을 다른...
함수형 관점으로 생각하기 시스템 구현과 유지보수 실질적으로 많은 프로그래머가 유지보수 중 코드 크래시 디버깅 문제를 가장 많이 겪는다. 코드 크래시는 예상하지 못한 변숫값 때문에 발생할 수 있다. 왜 그리고 어떻게 변숫값이 바뀌는지 생각해보면 함수형 프로그래밍이 제공하는 부작용 없음과 불변성이라는 개념이 이 문제를 해결하는 데 도움을 준다. 공유...
함수형 프로그래밍 기법 함수는 모든 곳에 존재한다. 함수형 프로그래밍이란 함수나 메서드 수학의 함수처럼 동작함을, 즉 부작용 없이 동작함을 의미했다. 함수형 언어 프로그래머는 함수형 프로그래밍이라는 용어를 좀 더 폭넓게 사용한다. 즉, 함수를 마치 일반값처럼 사용해서 인수로 전달하거나, 결과로 반환받거나, 자료구조에 저장할 수 있음을 의미한다. ...