프로그래밍 노트/JAVA

2021.01.22 - [프로그래밍 노트/JAVA] - [JAVA] 가비지 컬렉터(GarabageCollector,GC)GC(Garbage Collector) 란?GC는 메모리 관리 기법 중 하나로 시스템에 있는 모든 객체의 수명을 정확히는 몰라도 런타임에 대신 객체를 추적하여 쓸모없는 객체를 알아서 제거해준다. 이렇게 자동 회수한 메모리는 깨끗이 비우고 재활용할 수 있게 된다.즉, c나 c++ 처럼 개발자가 직접 메모리를 해제하는 것이 아닌 JVM 에서는 GC가 메모리를 자동 해제해 준다.프로그래머가 저수준 세부를 일일이 신경쓰지 않는 대가로 저수준 제어권을 포기한다는 사상이 바로 자바 관리 방식의 핵심이다.동적으로 할당했던 메모리 영역(Heap 영역)에서 필요 없게 된 메모리 객체(참조가 없는 객체)..
Collectors 클래스에 존재하는 정적 팩토리 메서드 (https://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors.html) 팩토리 메서드 반환 형식 비고 toList List 스트림 항목을 리스트로 수집 toSet Set 스트림 항목을 집합으로 수집 toCollection Collection 스트림의 모든 항목을 발행자가 제공하는 컬렉션으로 수집 counting Long 스트림 항목 수 계산 summingInt Integer 스트림 항목의 정수 프로퍼티 값 더함 averagingInt Double 스트림 항목의 정수 프로퍼티 평균값 계산 summarizingInt IntSummaryStatistics 최댓값, 최솟값, 합계, 평균 등..
자바 8의 함수형을 이용하면 가독성 있는 한 줄의 코드로 그룹화를 구현할 수 있다. 예를 들어 고기를 포함하는 그룹, 생선을 포함하는 그룹, 나머지 그룹으로 메뉴를 그룹화할 수 있다. 팩토리 메서드 Collectors.groupingBy를 이용하자. Map dishesByType = menu.stream().collect(groupingBy(Dish::getType)); {FISH=[parawns, salmon], OTHER=[french fries, rice, season fruit, pizza], MEAT=[pork, beef, chicken]} Dish.Type과 일치하는 모든 요리를 추출하는 함수를 groupingBy 메서드로 전달. 이 함수를 기준으로 스트림이 그룹화되므로 이를 분류 함수(cla..
컬렉터란 무엇인가? Collector 인터페이스 구현은 스트림의 요소를 어떤 식으로 도출할지 지정한다. 명령형 코드에서는 문제 해결하는 과정에서 다중 루프와 조건문을 추가하며 가독성과 유지보수성이 크게 떨어진다. 반면 함수형 프로그래밍에서는 필요한 컬렉터를 쉽게 추가할 수 있다. 고급 리듀싱 기능을 수행하는 컬렉터 collect로 결과를 수집하는 과정을 간단하면서도 유연한 방식으로 정의할 수 있다는 점이 컬렉터의 최대 장점이다. 스트림에 collect를 호출하면 스트림의 요소에 (컬렉터로 파라미터화된) 리듀싱 연산이 수행된다. 내부적으로 리듀싱 연산이 일어나는 모습 명령형 프로그래밍에서는 우리가 직접 구현해야 했던 작업이 자동으로 수행된다. collect에서는 리듀싱 연산을 이용해서 스트림의 각 요소를 ..
메뉴의 칼로리 합계를 reduce로 구할 수 있다. int calories = menu.stream() .map(Dish::getCalories) .reduce(0, Integer::sum); 사실 위 코드에는 박싱 비용이 숨어 있다. 내부적으로 합계를 계산하기 전에 Integer를 기본형으로 언박싱해야 한다. int calories = menu.stream() .map(Dish::getCalories) .sum(); 위와 같이 sum 메소드를 호출 할 수 없을까? map 메서드가 Stream를 생성하기 때문에 불가능 하다. 스트림의 요소 형식은 Integer 지만 (Stream) 인터페이스에는 sum 메서드가 없다. 다행히 스트리 API 숫자 스트림을 효율적으로 처리할 수 있도록 기본형 특화 스트림(p..
메뉴에서 칼로리가 가장 높은 요리는? 같이 스트림 요소를 조합해서 더 복잡한 질의를 표현하는 방법에 대해 알아보자. 이러한 질의를 수행하려면 Integer 같은 결과가 나올 때까지 스트림의 모든 요소를 반복적으로 처리해야 한다. 이런 질의를 리듀싱 연산(모든 스트림 요소를 처리해서 값으로 도출하는)이라고 한다. 1. 요소의 합 // for-each 사용 int sum = 0; for (int x : numbers) { sum += x; } // stream 사용 int sum = numbers.stream().reduce(0, (a, b) -> a + b); int sum = numbers.stream().reduce(0, Integer::sum); reduce는 두 개의 인수를 갖는다. 초깃값 스트림의..
1. Predicate가 적어도 한 요소와 일치하는지 확인 - anyMatch if(menu.stream().anyMatch(Dish::isVegetarian)) { System.out.prinln("The menu is (somewhat) vegetarian friendly!!"); } anyMatch는 불리언을 반환하므로 최종 연산이다. 2. Predicate가 모든 요소와 일치하는지 검사 - allMatch, noneMatch allMatch메서드는 anyMatch와 달리 모든 요소가 Predicate와 일치하는지 검사한다. boolean isHealthy = menu.stream().allMatch(d -> d.getCalories() < 1000); noneMatch는 allMatch와 반대 연..
public List findPrices(String product) { List priceFutures = shops.stream() .map(shop -> CompletableFuture.supplyAsync(() -> shop.getPrice(product), executor)) .map(future -> future.thenApply(Quote::parse)) .map(future -> future.thenCompose(quote -> CompletableFuture.supplyAsync(() -> Discount.applyDiscount(quote), executor))); return priceFutures.stream() .map(CompletableFuture::join) .coolect(..
2021.09.07 - [프로그래밍 노트/JAVA] - 병렬 스트림(parallel) vs CompletableFuture non-blocking 코드 만들기 추가된 클래스 설명 상점에서 제공한 문자열 파싱하여 Quote 클래스로 캡슐화 수행 public class Quote { private final String shopName; private final double price; private final Discount.Code discountCode; public Quote(String shopName, double price, Discount.Code discountCode) { this.shopName = shopName; this.price = price; this.discountCode = ..
2021.09.05 - [프로그래밍 노트/JAVA] - CompletableFutrue를 사용해보자 앞 전에 만들었던 동기 API(getPrice(String product))를 이용하여 최저가격 검색 애플리케이션을 만든다고 가정해보자. 앞에 게시글을 다시들어가기 귀찬으니 아래 코드를 참고하자. getPrice는 1초 blocking되는 API이다. public class Shop { private final String name; private final Random random; public Shop(String name) { this.name = name; random = new Random(name.charAt(0) * name.charAt(1) * name.charAt(2)); } public ..