자바 15

[모던 자바 인 액션] 14장. 자바 모듈 시스템

압력: 소프트웨어 유추 지금까지는 이해하고 유지보수하기 쉬운 코드를 구현하는 데 사용할 수 있는 새로운 언어 기능을 살펴봤다. 하지만 이러한 부분은 저수준의 영역에 해당하며, 소프트웨어 아키텍처에 해당하는 고수준의 영역에서는 생산성을 높일 수 있도록 추론하기 쉬운 소프트웨어 프로젝트가 필요하다. 관심사 분리 정보 은닉 관심사 분리 관심사 분리는 컴퓨터 프로그램을 고유의 기능으로 나누는 동작을 권장하는 원칙이다. 모델, 뷰, 컨트롤러 같은 아키텍처 관점 그리고 비즈니스 로직과 분리 등 수준 접근에 용이하고 다음과 같은 장점들이 더 있다. 개별 기능을 따로 작업할 수 있으므로 팀이 쉽게 협업할 수 있다. 개별 부분을 재사용하기 쉽다. 전체 시스템을 쉽게 유지보수할 수 있다. 정보 은닉 정보 은닉은 세부 구현..

[모던 자바 인 액션] 13장. 디폴트 메서드

자바에서 인터페이스와 메서드는 한 몸처럼 구성된다. 인터페이스를 구현하는 클래스는 인터페이스에서 정의하는 모든 메서드 구현을 제공하거나 슈퍼클래스의 구현을 상속받아야 한다. 하지만 인터페이스를 수정하려고 할 때 문제가 발생한다. 자바 8에서는 이 문제를 해결하기 위해 정적 메서드와 디폴트 메서드 기능을 사용하여 해결했다. 디폴트 메서드란 무엇인가? 인터페이스를 구현하는 클래스에서 구현하지 않은 메서드는 인터페이스 자체에서 기본으로 제공한다. 그래서 이를 디폴트 메서드라고 부른다. 디폴트 메서드를 어떻게 알아볼 수 있을까? 디폴트 메서드는 default 키워드로 시작하며 다른 클래스에 선언된 메서드처럼 메서드 바디를 포함한다. public interface Sized { int size(); default..

[모던 자바 인 액션] 12장 새로운 날짜와 시간 API

LocalDate, LocalTime, Duration, Period 클래스 간단한 날짜와 시간 간격을 정의해 보자. LocalDate와 LocalTime LocalDate 인스턴스는 시간을 제외한 날짜를 표현하는 불변 객체다. LocalDate 객체는 어떤 시간대 정보도 포함하지 않는다. 팩토리 메소드 now()는 시스템 시계의 정보를 이용해 현재 날짜 정보를 얻는다. LocalDate와 LocalTime은 게터 메서드를 제공한다. LocalDate date = LocalDate.of(2017, 9, 21) date.getYear() LocalTime time = LocalTime.of(13, 45, 20); // 13:45:20 time.getHour(); // 13 time.getMinute(); ..

[모던 자바 인 액션] 11장. null 대신 Optional 클래스

자바로 개발을 하다 보면 NPE를 겪게 된다. 자바 8부터는 이 NPE를 어떻게 처리할까? 값이 없는 상황 처리 하기 public String getCarInsuranceName(Person person) { if (person != null) { Car car = person.getCar(); if (car != null) { Insurance insurance = car.getInsurance(); if (insurance != null) { return insurance.getName(); } } } return "Unknown"; } 위 예제 에서는 변수에 접근할 때마다 null 체크를 하기 때문에 코드가 지저분해진다. null 때문에 발생하는 문제가 많기 때문에 사용해서는 안된다. 자바는 개발자..

[모던 자바 인 액션] 10장. 람다를 이용한 도메인 전용 언어

도메인 전용 언어 DLS은 특정 비즈니스 도메인의 문제를 해결하려고 만든 언어다. 예를 들어 회계전용 소프트웨어 애플리케이션을 개발한다고 가정, 이 상황에서 비즈니스 도메인에는 통장 입출금 내역, 계좌와 같은 개념이 포함된다. DSL은 평문 언어가 아니며, 도메인 전문가가 저수준 비즈니스 로직을 구현하기 위해 사용하는것이 아니다. 다음 뚜 가지 필요성을 생각하며 DSL을 개발해야 한다. 작성자 코드의 의도가 명확히 전달되어야 한다. 가독성이 좋게 코드를 작성해야 한다. DSL의 장점과 단점 DSL의 장점 간결함: API는 비즈니스 로직을 간편하게 캡슐화 하여 코드가 간결해지며 중복을 줄일 수 있다. 가독성: 도메인 영역의 용어를 사용하므로 비 도메인 전문가도 코드를 쉽게 이해할 수 있다. 유지보수: 잘 ..

[모던 자바 인 액션] 9장. 리팩터링, 테스팅, 디버깅

기존 코드를 가지고 새로운 프로젝트를 시작하는 상황을 가졌을 때 코드를 깔끔하게 만들고 다른 사람이 쉽게 이해할 수 있도록 만들려면 어떻게 해야 될까? 즉, 람다 표현식이나 스트림을 이용해 기존 코드들을 리팩터링해야 한다. 9.1 가독성과 유연성을 개선하는 리팩터링 코드 가독성이란 어떤 코드든 다른 사람이 볼때 쉽게 이해할 수 있음을 의미한다. 코드의 가독성을 높이려면 코드의 문서화를 잘하고, 표준 규칙을 지키려는 노력을 기울여야 한다. 익명 클래스를 람다 표현식으로 리팩토링 람다 표현식을 메서드 참조로 리팩토링 명령형 데이터 처리를 스트림으로 리팩토링 9.1.1 익명 클래스를 람다 표현식으로 리팩터링 하기 하나의 추상 메서드를 구현하는 익명 클래스는 람다 표현식으로 리팩터링 할 수 있다. Runnabl..

[모던 자바 인 액션] 8장. 컬렉션 API 개선

리스트와 집합에서 요소를 삭제하거나 바꾸는 관용 패턴을 적용시켜보자. 8.1 컬렉션 팩토리자바에서 배열을 만들 때는 List array = new ArrayList(); array.add("1"); array.add("2");이런 식으로 많이 사용할 것이다. 여기서 코드를 더 줄이기 위해 Arrays.asList()로 고정 크기 리스트를 만들어보자.List array = Arrays.asList("1", "2"); 고정크기라서 새 요소를 추가하거나 요소를 삭제를 할 수는 없다. 만약 여기서 리스트의 요소를 갱신하거나 삭제를 한다면 UnsupportedOperationException이 발생한다. UnsupportedOperationException 예외 발생내부적으로 고정된 크기로 배열을 만들었을 때 이..

[모던 자바 인 액션] 7장. 병렬 데이터 처리와 성능

이번에는 데이터 병렬 처리, 병렬 스트림의 성능, 포크/조인 프레임워크를 알아보겠습니다. 7.1 병렬 스트림 병렬 스트림이란? 각각의 스트림에서 처리할 수 있도록 스트림 요소를 여러 개로 분할한 스트림이다. 예시로 숫자 n을 입력 받아서 1부터 n까지의 숫자의 합계를 구현해주는 메서드를 만들어보자. // JAVA 반복문 public long sum(long n) { long result = 0; for (long i = 1; i i + 1) .limit(n) .reduce(0L, Long::sum); } 만약 여기서 n이 커진다면 병렬로 어떻게 처리해야 좋을까? 7.1.1 순차 스트림을 병렬 스트림으로 변환하기 순차 스트림에 parallel 메서드를 호출하면 기존의 함수형 리듀싱 연산이 병렬로 처리된다...

[모던 자바 인 액션] 6장. 스트림으로 데이터 수집(2)

6.4 분할 분할은 분할 함수라 불리는 프레디케이트를 분류 함수로 사용하는 특수한 그룹화 기능이다. 분할 함수의 키 형식은 Boolean이기 때문에 그룹화 맵은 최대 두 개의 그룹으로 분류된다. Map partitionedMenu = menu.stream().collect(partitioningBy(Dish::isVegetarian)); 결과는 true=[], false=[] 와 같은 형태로 반환된다. 여기서 true의 값만 얻고 싶다면? List vegetarianDishes = partitioneMenu.get(true); 6.4.1 분할의 장점 분할 함수를 이용하면 참, 거짓 두 가지 요소의 스트림 리스트를 유지한 채 얻을 수 있다는 것이다. 예를 들어 채식 요리와 채식 요리가 아닌 것에서 칼로리가..

[모던 자바 인 액션] 6장. 스트림으로 데이터 수집 (1)

이번장에서는 collect를 사용하여 다양한 요소 누적 방식을 알아가 보겠습니다. 6.1 컬렉터란 무엇인가? Collector 인터페이스 구현은 스트림의 요소를 어떤 식으로 도출할지 지정한다. 6.1.1 고급 리듀싱 기능을 수행하는 컬렉터 컬렉터의 최대 강점은 결과를 수집하는 과정을 유연하게 정의할 수 있다는 점이다. 스트림에서 collect를 호출하면 collect에서는 리듀싱 연산을 이용해서 스트림의 각 요소를 방문하면서 컬렉터가 작업을 수행한다. 6.1.2 미리 정의된 컬렉터 Collectors에서 제공하는 메서드의 기능은 크게 세 가지로 구분된다. 스트림 요소를 하나의 값으로 리듀스 하고 요약 요소 그룹화 요소 분할 6.2 리듀싱과 요약 컬렉터로 스트림의 항목을 컬렉션으로 재구성 즉 하나의 결과로..