본문 바로가기

Java18

이펙티브 자바 - Builder 패턴 - 이 글은 Effective Java 를 기반으로 작성되었습니다. - Builder 패턴 정적 팩토리 메소드나 생성자는 선택적 인자가 많을 때 사용하기가 난감하다. 빌더 패턴은 이런 문제를 해결하기 위해 사용하는 패턴인데 예를 통해서 알아보도록 하자. - 점층적 생성자 패턴 만약 성분표에 필수 항목으로 총 제공량, 1회 제공량이 있고, 선택적 항목에는 칼로리, 지방, 나트륨, 탄수화물이 있다고 가정해보자. 만약 필수적인 항목과 선택적인 항목으로도 생성자를 사용할 수 있게 하려면 생성자를 여러 개 정의 해야 한다. 점층적 생성자 패턴이라고 불리우는 방식을 통해 이 문제를 해결하려고 하면 코드는 아래와 같이 될 것이다. public class NutritionFactsTelescoping { private.. 2021. 9. 16.
이펙티브 자바 - 정적 팩토리 메소드 - 이 글은 Effective Java 를 기반으로 작성되었습니다. - 정적 팩토리 메소드 객체를 생성하는 일반적인 방법은 public 생성자를 이용하는것이다. 하지만 정적 팩토리 메소드를 이용할 수도 있다. Boolean 의 valueOf 메소드는 기본 타입의 boolean 을 Boolean 객체 참조로 변환한다. public static Boolean valueOf(boolean b) { return b ? Boolean.TRUE : Boolean.FALSE; } 흔히 정적 팩토리 메소드를 디자인 패턴의 팩토리 메소드와 혼동한다. 디자인 패턴의 팩토리 메소드는 하나의 환경변수나 다른 변수를 (팩토리)만 변경하면 제품군들도 일괄적으로 변경되어 생성되도록 하는 패턴이다. 예를 들어 객체 RadioA1과 .. 2021. 9. 5.
[Java 8] 날짜 API - 2 - 출처: https://www.oracle.com/technical-resources/articles/java/jf14-date-time.html - 출처: 자바 8 인 액션 - Truncation 신규 API 는 날짜, 시간, 날짜 및 시간을 표현하는 타입을 제공하여 정밀한 시간을 지원하지만, 이것보다 더 세밀하게 정의된 정밀도의 개념을 지원한다. truncatedTo 메소드는 이런 경우에 사용하는데, DB의 truncate 와 비슷하게 해당 필드에 대한 값을 비운다. LocalDateTime timePoint = LocalDateTime.now(); LocalDateTime truncatedTime = timePoint.truncatedTo(ChronoUnit.SECONDS); System.out... 2021. 2. 11.
[Java 8] 날짜 API - 1 - 출처: https://www.oracle.com/java/technologies/jf14-date-time.html - 왜 새로운 날짜 API가 필요한가? 자바8 이전에는 날짜와 시간에 대한 기능 지원이 부족했다. 예를 들어 java.util.Date 와 SimplteDateFormatter 와 같은 클래스들은 스레드-세이프 하지 않아서 사용자에게 잠재적인 병렬성 이슈를 불러일으킬 가능성이 있었다. 또한 날짜와 시간 관련 클래스중 일부는 API 디자인 측면에서 부족한 부분이 있었다. 예를 들면 java.util.Date는 1900년 부터 시작하고, 달의 인덱스는 0부터 시작하며, 일의 인덱스는 1부터 시작하여 직관적이지 않은 부분이 있다. 이런 이슈들과 다른 문제점들은 Joda-Time 같은 제 3의.. 2021. 2. 11.
[Java 8] CompletableFuture - 4 (종료조건) - 출처: 자바 8 in action - CompletableFuture 종료 앞서 작성한 코드들에서 원격 서비스를 흉내내기 위해 1초 sleep을 주었지만 사실 실제 상황에서는 네트워크 상황이나 다른 변수등 어떤일이 일어날지 알 수 없다. 그래서 원격 서비스를 사용할 때 더 실제와 같은 상황을 부여하기 위해 랜덤하게 sleep을 할당해보자. getTicketPrice 메소드에 sleep 부분을 아래 코드로 변경하자. int delay = 500 + random.nextInt(2000); try { Thread.sleep(delay); } catch (InterruptedException e) { throw new RuntimeException(e); } 앞선 코드는 모든 가격이 조회될때까지 기다렸지만 .. 2021. 2. 11.
[Java 8] CompletableFuture - 2 (비블록 코드) - 출처: 자바 8 in action - 비블록 코드 만들기 CompletableFuture 기본에서는 비행기 티켓의 출발지와 목적지에 따른 가격을 반환하였다. 이제 여러 개의 티켓의 가격을 검색해보자. 우선 아래와 같이 출발지 목적지 정보를 가지고 있는 Ticket 클래스를 생성한다. public class Ticket { private String from; private String to; public Ticket(String from, String to) { super(); this.from = from; this.to = to; } public String getFrom() { return from; } public void setFrom(String from) { this.from = from.. 2021. 2. 11.
[Java 8] CompletableFuture - 1 (개요 및 기본) - 출처: 자바 8 인 액션 - Future 최근에는 멀티코어 프로세서가 등장하면서 멀티태스크 프로그래밍 처리를 어떻게 하느냐고 큰 관심사가 되고 있다. 일단 멀티태스크 프로그래밍에는 두 가지 특성이 있다. 하나는 병렬성이고 하나는 동시성 개념이다. 병렬성은 하나의 작업을 여러 작업으로 분할 및 여러 작업을 다른 코어로 할당하여 처리하는 개념이다. 반면 동시성은 CPU 하나를 최대한 사용하는 개념이다. Future는 자바 5때 등장하였다. 미래의 어느 시점에 결과를 얻기 위한 모델에 활용하도록 제공하는 인터페이스이다. 시간이 좀 걸리는 작업을 Future 내부로 설정하면 호출자 스레드가 결과를 기다리는 동안 다른 작업을 수행한다. Java 8 이전의 Future 코드를 살펴보자. public static.. 2021. 2. 11.
[Java 8] Default Method - 출처: 자바 8 in action - Default Method 자바 8 에서는 인터페이스 안에 기본 구현을 포함하는 기능을 제공한다. static method를 정의하거나 default method를 정의할 수 있다. 동작하는 구현로직은 인터페이스를 구현하는 클래스에서 정의하면 되는데, 왜 이기능이 필요하고 유용한것일까 라는 의문이 들 수도 있다. 만약 List 인터페이스에 어떤 메소드를 추가한다고 가정해보자. 만약 기본 구현을 정의할 수 없다면 여러분은 List를 구현하는 모든 클래스에 해당 메소드 추가 및 기본 구현을 추가해줘야 한다. 만약에 해당 인터페이스를 라이브러리 여기저기서 사용하고 있다면 엄청난 문제가 발생한다. 기존코드와 코드 구현을 바꾸도록 강제하지 않으면서 기능을 추가할 수 있는 .. 2021. 2. 11.
[Java 8] Optional - 출처: https://www.oracle.com/technical-resources/articles/java/java8-optional.html - Optional Optional은 코드를 더 가독성있게 해주고 null pointer exception(이하 "NPE") 로 부터 보호해준다. null 참조는 값의 부재를 나타내기 때문에 많은 문제의 원인이 된다. Java SE 8 에서는 이런 문제를 완화할 수 있도록 java.util.Optional 이라 불리는 새로운 클래스를 선보였다. 아래와 같이 중첩된 객체구조를 지닌 Computer 가 있다고 가정해보자. version을 알기 위해서 아래와 같이 코드를 작성했다고 가정해보자. String version = computer.getSoundcard(.. 2021. 2. 11.
[Java 8] Stream - 4 (flatMap, collect) - 출처: https://www.oracle.com/java/technologies/architect-streams-pt2.html - flatMap과 collect flatMap - "map"과 "flatten" 동작을 결합한 중간 연산자 collect - stream의 요소를 결과로 계산하기 위해 "collectos" 라고 불리는 여러 동작을 인자로 축적하는 종결 연산자 위의 두 연산자들은 더 복잡한 질의를 표현하기에 아주 유용한 연산자들이다. 예를 들어 flatMap과 collect를 이용하여 단어의 stream 에서 각 알파벳 문자가 몇번 나타나는지를 Map 으로 나타낼 수 있다. Stream words = Stream.of("Java", "Magazine", "is", "the", "best").. 2021. 2. 11.