본문 바로가기

Language/Java33

[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.
[Java 8] Stream - 3 (Numeric, Stream 생성) - 출처: https://www.oracle.com/technical-resources/articles/java/ma14-java-se-8-streams.html - Numeric Streams 앞에서 정수형의 합계를 계산하기 위해 reduce 메소드를 이용한 예제를 살펴보았다. 그러나 앞에서 살펴본 예제에는 숨겨진 비용이 있다. Integer 객체를 반복적으로 더할때 박싱이 적용되어 비용이 발생한다. 만약 아래코드처럼 sum 이라는 메소드를 호출할 수 있다면 코드가 더 깔끔하고 의도한 바가 분명해질것이다. int statement = transactions.stream() .map(Transaction::getValue) .sum(); // error since Stream has no sum meth.. 2021. 2. 11.
[Java 8] Stream - 2 (기본 연산) - 출처: https://www.oracle.com/technical-resources/articles/java/ma14-java-se-8-streams.html - Stream 연산 java.util.stream.Stream 에 정의되어 있는 Stream 인터페이스는 많은 연산들을 정의하고 있는데, 크게 2 부분으로 나눌 수 있다. filter, sorted, map 와 같이 파이프라인으로 서로 연결될 수 있는 형태 파이프라인을 종결시키고, 결과를 반환하는 collect 연결될 수 있는 Stream 연산자들을 "중간 연산자" 라고 칭한다. 해당 연산자들은 반환형이 Stream 형이기 때문에 서로 연결될 수 있다. Stream 파이프라인을 종결시키는 연산자들은 "종결 연산자" 라고 칭한다. 종결 연산자는.. 2021. 2. 11.
[Java 8] Stream - 1 (Stream 개요) - 출처: https://www.oracle.com/technical-resources/articles/java/ma14-java-se-8-streams.html - Stream 소개 컬렉션이 없다면 무슨일이 벌어질까? 거의 모든 자바 어플리케이션에서는 컬렉션을 만들고 처리한다. 이런 업무들은 프로그래밍의 근간이다. 데이터를 그룹화하며 처리한다. 예를 들어 메뉴를 구성하는 요리 컬렉션이 있는데 각 요리 칼로리의 총합을 구하거나, 칼로리가 적은 요리만을 골라 특별 식단을 구성하는것과 같은 기능을 원한다고 해보자. 이처럼 많은 비즈니스 로직에는 찾거나 그룹화하는 연산이 포함된다. Java 8 이전에는 위와같은 동작들이 필요할때마다 구현하여 사용하였을것이다. 간단한 SQL을 구문을 하나 살펴보자. SELECT.. 2021. 2. 11.
[Java 8] 람다(Lambda) - 3 - 출처: Java 8 in action - 출처: https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html - 메서드 레퍼런스 메서드 레퍼런스는 메서드를 변수에 저장한것처럼 사용할 수 있게 한다. 람다와 메서드 레퍼런스중 꼭 어느것이 더 좋다거나 가독성이 더 좋다고 말할 수는 없다. 상황에 따라서 메서드 레퍼런스가 때로는 람다가 가독성이 더 좋으므로 상황에 맞게 잘 사용하자. 메서드 레퍼런스는 아래처럼 사용한다. public class People { private String name; private Integer age; public People(String name, Integer age) { super(); this.na.. 2021. 2. 11.
[Java 8] 람다(Lambda) - 2 - 출처: Java 8 in action- 출처: https://www.geeksforgeeks.org/checked-vs-unchecked-exceptions-in-java/- 출처: https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/Closures - 기본형 특화만약 Generic으로 정의한 Predicate 를 사용할 때, 기본형 특화의 개념을 몰라도 큰 문제는 되지 않는다. Integer 는 int 를 감싼 래퍼클래스이며 int 형을 Integer로, Integer를 int 로 전환할 때 박싱과 언박싱의 과정을 거치게 된다. 문제는 이때 비용이 발생한다는 것이다. 물론 사람이 체감할때는 아주 적은 비용이나 데이터의 크기가 커진다면 영향을 끼칠.. 2021. 2. 10.