728x90
728x90
Null Pointer Exception (이제부터는 NPE라고 부르겠다.)은 자바 개발자라면 한번쯤은( 한번만 마주쳤겠는가? ) 마주쳤을 예외이다. NPE는 모든 자바 개발자를 괴롭히는 예외긴 하지만 null이라는 표현을 사용하면서 치러야 할 당연한 대가가 아닐까? 명령형 프로그래밍 세계라면 이러한 의견이 당연한것처럼 들릴 수도 있다. 하지만 거시적인 프로그래밍 관점에서 null을 다르게 접근한다. 최초로 null을 도입한 토니 호어는 null 및 예외를 만든 결정을 가리켜 '십억 달러짜리 실수'라고 표현했다. 자바를 포함해서 최근 수십 년간 탄생한 대부분의 언어 설계에는 null 참조 개념을 포함한다. 예전 언어와 호환성을 유지하려는 목적도 있었겠지만 호어가 말한 것처럼 '구현하기 쉬웠기 때문에' n..
람다 표현식을 이용해 가독성과 유연성을 높이려면 기존 코드를 어떻게 리팩터링해야 하는지 설명한다. 또한 람다 표현식으로 전략, 템플릿 메서드, 옵저버, 의무 체인, 팩토리 등의 객체지향 디자인 패턴을 어떻게 간소화할 수 있는지도 살펴본다. 마지막으로 람다 표현식과 스트림 API를 사용하는 코드를 테스트하고 디버깅하는 방법을 설명한다. 가독성과 유연성을 개선하는 리팩터링 람다 표현식을 이용한 코드는 다양한 요구사항 변화에 대응할 수 있도록 동작을 파라미터화한다. 코드의 가독성을 높이려면 코드의 무선화를 잘하고, 표준 코딩 규칙을 준수하는 등의 노력을 기울여야 한다. 자바 8의 새 기능을 이용해 코드의 가독성을 높일 수 있다. 코드를 간결하고 이해하기 쉽게 만들 수 있다. 또한 메서드 참조와 스트림 API를..
컬렉션 팩토리 기존에는 Arrays.asList() 팩토리 메서드르 이용하여 간단한 코드로 쉽게 List 요소를 생성했다. 이렇게 생성된 리스트는 크기가 고정된다. 즉 요소를 갱신할 수는 있지만 새 요소를 추가하거나 요소를 삭제할 순 없다. 만약 요소를 추가 및 삭제하는 작업을 수행하게 되면 UnsupportedOperationException 예외가 발생한다(필자의 경우에도 Arrays.asList의 크기가 고정된다는 사실을 까먹어서 테스트 코드가 깨지면 왜 깨지는지 오류를 못 찾고는 했다). 아쉽게도 Set 혹은 Map을 바로 생성할 수 있는 방법은 없다. 리스트를 인수로 받는 HashSet 생성자를 통해 그.나.마 집합을 바로 생성할 수도 있긴 하다. 이는 스트림 API를 통해 아래와 같이도 만들 ..
중간연산은 스트림 파이프라인을 구성하며, 스트림의 요소를 소비하지 않는다. 반면 최종 연산은 스트림의 요소를 소비해서 최종 결과를 도출한다. reduce가 그랬던 것처럼 collect 역시 다양한 요소 누적 방식을 인수로 받아서 스트림을 최종 결과로 도출하는 리듀싱 연산을 수행할 수 있다. 다양한 요소 누적 방식은 Collector 인터페이스에 정의되어 있다. 지금부터 컬렉션, 컬렉터, collect를 헷갈리지 않도록 주의해야한다. 컬렉터란? 함수형 프로그래밍에서는 '무엇'을 원하는지 직접 명시할 수 있어서 어떤 방법으로 이를 얻을지는 신경 쓸 필요가 없다. 이전 예제에서 collect 메서드로 Collector 인터페이스 구현을 전달했다. Collector 인터페이스 구현은 스트림의 요소..