Book15 [정리] 모던 자바 인 액션 - 스트림 활용(2) 만약 스트림을 활용해 아래와 같은 질의를 수행하려면 어떻게 해야할까? '메뉴에서 칼로리가 가장 높은 요리는?' '메뉴의 모든 칼로리의 합계는?' 리듀싱 리듀싱 연산은 모든 스트림 요소를 처리해서 하나의 값으로 도출하는 연산을 말한다. 위와 같은 질의는 리듀싱 연산을 사용하여 해결할 수 있다. 리듀싱 내 두 번째 인자로 계산된 결과값은 다음 스트림 요소의 입력 인자가 된다. 리듀싱 연산은 스트림이 하나의 값으로 줄어들 때까지 연산을 반복해서 조합한다. // 기본적인 반복문 int sum = 0; // sum 변수의 초기값 for (int x : numbers) { sum += x; // sum 값을 도출하기 위해 반복되는 연산 (+) } // 리듀스를 사용 // 첫 번째 인자 : sum 초기값 0 // 두.. 2023. 1. 8. [정리] 모던 자바 인 액션 - 스트림 활용(1) 필터링 filter(Predicate) : boolean을 반환하는 Predicate를 인수로 받아 일치하는 요소만 포함하는 스트림 반환 distinct() : 고유 요소로만 이루어진(=중복 제거된) 스트림 반환 // Predicate로 필터링 : boolean을 반환하는 Predicate을 인수로 받아 일치하는 요소만 필터링 List vegetarianMenu = menu.stream() .filter(Dish::isVegetarian) .collect(toList()); // 고유 요소 필터링 : distinct로 고유 요소 필터링 List numbers = Arrays.asList(1, 2, 1, 3, 3, 2, 4); numbers.stream() .filter(i -> i % 2 == 0) .d.. 2023. 1. 7. [정리] 모던 자바 인 액션 - 스트림 소개 스트림은 자바 8 API에 새로 추가된 기능으로, 스트림을 사용하면 선언형(구현코드 대신 질의의 형태)로 컬렉션 데이터를 처리할 수 있다. 선언형의 예로 데이터베이스 질의를 들 수 있는데, SELECT name FROM disches WHERE calorie < 400 ORDER BY calorie는 칼로리가 400 미만인 요리명을 출력하라는 SQL질의이며 결과를 얻기 위해 질의할 뿐 구체적인 구현 코드를 전달하진 않는다. 만약 자바 7 코드로 위 예제를 구현하려 했다면 아래와 같았을 것이다. // 400 칼로리보다 아래인 dish들만 수집 List lowCaloricDishes = new ArrayList(); for(Dish dish: menu) { if(dish.getCalories < 400){ .. 2023. 1. 6. [정리] 모던 자바 인 액션 - 람다 표현식 (Lambda Expression)(2) 람다 표현식이 함수형 인터페이스의 인스턴스로 동작할 수 있다고 하였는데, 실제 람다 표현식에는 이 람다가 어떤 함수형 인터페이스를 구현하고 있는지에 대한 정보가 나와있지 않다. 람다의 형식 검사, 형식 추론, 제약 람다가 어떤 함수형 인터페이스를 구현하고 있는지 직접적으로 나와 있진 않지만, 람다의 문법을 보고 람다의 형식을 추론할 수는 있다. 람다가 전달될 메서드의 파라미터, 람다가 할당되는 변수 등에서 람다 표현식의 형식을 추론해볼 수 있는데 이를 대상형식이라 한다. List heavierThan150g = filter(inventory, (Apple apple) -> apple.getWeight() > 150); 1. filter 메서드를 확인한다. 2. filter 메서드는 두 번째 파라미터로 P.. 2023. 1. 5. [정리] 모던 자바 인 액션 - 람다 표현식 (Lambda Expression)(1) 익명 클래스로 동작을 구현할 수 있었지만, 기대한만큼 깔끔한 코드가 나오진 못했다. 조금 더 깔끔하고 단순한 코드로 동작을 구현할 수 있는 자바 8의 새로운 기능 람다 표현식을 설명한다. 람다 표현식은 메서드로 전달할 수 있는 익명 함수를 단순화한 것이라 말할 수 있다. 람다를 사용함으로써 얻는 가장 큰 이득 중 하나는 익명 클래스 등에 형식상 들어가야만 했던 코드들을 더 이상 사용하지 않아도 된다는 점이다. // lambda 적용 전 Comparator byWeight = new Comparator() { public int compare(Apple a1, Apple a2) { return a1.getWeight().compareTo(a2.getWeight()) ; } }; // lambda 적용 후 .. 2023. 1. 4. [정리] 모던 자바 인 액션 - 동작 파라미터화 (Behavior Parameterization) 동작 파라미터화(Behavior Parameterization 또는 행위 매개변수)란 아직 어떻게 실행할 것인지 결정하지 않은 코드블록을 의미한다. 이 코드블록은 나중에 프로그램에서 호출하며 즉, 코드 블록 실행은 나중으로 미뤄진다. 코드 블록에 메서드의 동작이 파라미터화 된다. 동작을 파라미터화 하므로서 변화하는 요구사항에 보다 효율적으로 대응 가능해진다. 다음은 예제와 그 과정이다. 첫 번째 시도 : 녹색 사과 필터링 녹색 사과를 필터링 해달라는 요청이 있어 아래와 같이 구현하였다. 기능은 동작하지만 아래 로직으로는 오로지 녹색 사과만 필터링할 수 있다. public static List filterGreenApples(List inventory) { List result = new ArrayList.. 2023. 1. 3. [책 리뷰] 객체지향의 사실과 오해 책 정보 https://book.naver.com/bookdb/book_detail.nhn?bid=9145968 객체지향의 사실과 오해 : 네이버 도서 네이버 도서 상세정보를 제공합니다. search.shopping.naver.com 서론 나의 첫 회사는 대기업 계열사에 소속된 IT 회사였다 다른 계열사들의 시스템을 유지보수하는 업무를 맡았었는데, 오래 전 만든 시스템을 문제 생기지 않게 보수하고 운영하는 일이었기 때문에 대부분 오래된 소스들이었고 그 안에서도 설계를 포함한 개발을 할 기회는 잘 없었다. 이직 후, 만들어진지 5년도 안된 따끈한 시스템을 맡게 되었고 운영이 아닌 개발 직무를 담당하게 되면서 6년만에 처음으로 (부끄럽게도..) 설계를 포함한 기능 개발을 해보게 되었다. 막상 진짜 설계/개발.. 2023. 1. 2. [정리] 객체지향의 사실과 오해 - 7장 07 / 함께 모으기 마지막장에서는 객체지향 설계를 위한 세 가지 관점을 1장 커피공화국 예제와 함께 설명한다. 사용자 관점에서의 도메인 설계부터 메시지 기반으로 한 인터페이스 설계, 기능 수행을 위한 클래스 구현까지.. 앞서 배워온 개념들을 직접 적용해보고, 예제를 통해 정리해볼 수 있는 챕터이다. 객체 의인화, 메시지 위주의 설계, 책임과 협력, 사용자의 관점에서 본 도메인 모델, 인터페이스와 구현의 분리 등 올바른 객체지향 설계란 무엇이며 내가 이제까지 범해왔던 오류들은 무엇이었는지 예제 풀이 과정을 통해 정리해보자. 커피 전문점 도메인 다시 1장의 커피 공화국으로 얘기로 돌아가서 커피 전문점 도메인을 객체지향 관점에서 설계해보자 커피 전문점 안에는 메뉴판이 존재한다. 손님은 메뉴판에 있는 각 메뉴.. 2023. 1. 1. [정리] 객체지향의 사실과 오해 - 6장 06 / 객체 지도 길을 찾기 위한 두 가지 방법이 있다. 첫 번째는 다른 사람에게 길을 물어보는 것이고, 두 번째는 지도로 지형을 파악한 후 찾아가는 방법이다. 첫 번째 방법은 기능적이고 해결 지향적이다. 반면, 두 번째 방법은 구조적이고 문제 지향적이다. 두 번째 지도를 활용한 방법은 길을 찾기 위한 구체적인 '기능'이 아니라, 길을 찾을 수 있는 '구조'를 제공한다. 6장은 객체 설계를 지도에 빗대어 기능과 구조를 사용한 설계 방법 등에 대해 설명한다. 기능 설계 대 구조 설계 사용자가 원하는 기능을 제공할 수 있다면 설계가 어떠한지는 중요하지 않을 수 있다. 다만, 이 가정은 사용자가 원하는 기능(요구사항)이 바뀌지 않는다는 전제가 필요하다. 요구사항은 끊임없이 변경되기 때문에 이에 빠르게 대응하.. 2022. 12. 31. 이전 1 2 다음