[Java] 64. 스트림 API2 - 기능
·
Java/Modern Java(8~)
스트림 API2 - 기능#Java/adv3스트림 생성스트림이 제공하는 다양한 스트림 생성, 중간 연산, 최종 연산을 자세히 알아보자.생성 방법코드 예시특징컬렉션list.stream()List, Set 등 컬렉션에서 스트림 생성배열Arrays.stream(arr)배열에서 스트림 생성Stream.of(...)Stream.of("a", "b", "c")직접 요소를 입력해 스트림 생성무한 스트림(iterate)Stream.iterate(0, n -> n + 2)무한 스트림 생성(초깃값 + 함수)무한 스트림(generate)Stream.generate(Math::random)무한 스트림 생성 (Supplier 사용)컬렉션, 배열, Stream.of 은 기본적으로 유한한 데이터 소스로부터 스트림을 생성한다.iter..
[Java] 63. 스트림 API1 - 기본
·
Java/Modern Java(8~)
스트림 API1 - 기본#Java/adv3스트림 API 시작우리가 만든 MyStreamV3를 사용할 때를 떠올려보면 데이터들이 흘러가면서 필터되고, 매핑된다.자바도 스트림 API라는 이름으로 스트림 관련 기능들을 제공한다. (I/O 스트림이 아니다.)자바가 제공하는 스트림 API는 더 정교하고, 더 많은 기능을 제공한다.List names = List.of("Apple", "Banana", "Berry", "Tomato");// "B"로 시작하는 이름만 필터 후 대문자로 바꿔서 리스트로 수집Stream stream = names.stream();List result = stream .filter(name -> name.startsWith("B")) .map(s -> s.toUp..
[Java] 62. 메서드 참조
·
Java/Modern Java(8~)
메서드 참조#Java/adv3메서드 참조가 필요한 이유/예제1BinaryOperator add1 = (x, y) -> x + y;BinaryOperator add2 = (x, y) -> x + y;동일한 기능을 하는 람다를 여러 번 작성했는데, 코드가 중복되어 있어 유지 보수가 어려울 수 있다./예제2x + y를 하나의 메서드 add()로 분리하였다. 람다가 add()를 호출하게 된다.(x, y) -> add(x, y)남은 문제람다를 작성할 때마다 (x, y)-> add(x, y) 형태의 코드를 반복해서 작성해야 한다.매개변수를 전달하는 부분이 장황하다. 람다에서 동일한 모양의 매개변수를 add() 메서드에 그대로 전달하고 있다./예제3: 메서드 참조(Method Reference) 문법를 사용메서드 참..
[Java] 61. 람다 vs 익명 클래스
·
Java/Modern Java(8~)
람다 vs 익명 클래스#Java/adv3문법 차이익명 클래스익명 클래스는 클래스를 선언하고 즉시 인스턴스를 생성하는 방식이다.익명 클래스도 하나의 클래스이다.람다 표현식람다 표현식은 함수를 간결하게 표현할 수 있는 방식이다. ( 연산자 사용)함수형 인터페이스(메서드가 하나인 인터페이스)를 간단히 구현할 때 주로 사용한다.람다도 인스턴스가 생성된다.코드의 간결함익명 클래스는 람다 표현식에 비해 코드의 양이 상대적으로 많다.람다 표현식은 간결하고, 불필요한 코드를 최소화한다. 많은 생략 기능도 지원한다.상속 관계익명 클래스는 일반적인 클래스처럼 다양한 인터페이스와 클래스를 구현하거나 상속할 수 있다. 크게 제한사항이 없다.람다 표현식은 메서드를 딱 하나만 가지는 함수형 인터페이스만을 구현할 수 있다. 클..
[Java] 60. 람다 활용
·
Java/Modern Java(8~)
람다 활용#Java/adv3필터 만들기1psvm { List numbers = List.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); // 짝수만 거르기 List evenNumbers = filter(numbers, n -> n % 2 == 0); // 홀수만 거르기 List oddNumbers = filter(numbers, n -> n % 2 == 1);}static List filter(List numbers, Predicate predicate) { List filtered = new ArrayList(); for (Integer number : numbers) { if (predicate.test(number)) { filter..
[Java] 59. 함수형 인터페이스
·
Java/Modern Java(8~)
함수형 인터페이스#Java/adv3함수형 인터페이스와 제네릭1함수형 인터페이스에서 제네릭이 필요한 이유방법1: 함수형 인터페이스 따로 선언@FunctionalInterfaceinterface StringFunction { String apply(String s);}@FunctionalInterfaceinterface NumberFunction { Integer apply(Integer s);}StringFunction upperCase = s -> s.toUpperCase();NumberFunction square = n -> n * n;두 인터페이스의 apply 메서드는 하나의 인자를 입력받고 결과를 반환한다.타입이 다르기 때문에 두 개의 인터페이스를 따로 만들어서 람다를 할당해야 한다.타입..
[Java] 58. 람다
·
Java/Modern Java(8~)
람다#Java/adv3람다 정의자바 8부터 도입된 람다는 자바에서 함수형 프로그래밍을 지원하기 위한 핵심 기능이다.람다는 익명 함수이다. 따라서 이름 없이 함수를 표현한다.(매개변수) -> {본문}이름, 반환타입을 적지 않는다.익명 클래스처럼 new, 클래스명, 메서드 명, 반환 타입 등을 나열할 필요가 없다.자바는 독립적인 함수를 지원하지 않으며, 메서드는 반드시 클래스나 인터페이스에 속한다용어 - 람다 vs 람다식(Lambda Expression)람다: 익명 함수를 지칭하는 일반적인 용어다. 쉽게 이야기해서 개념이다.람다식: (매개변수) -> {본문} 형태로 람다를 구현하는 구체적인 문법 표현을 지칭한다.쉽게 이야기해서 람다는 개념을, 람다식은 자바에서 그 개념을 구현하는 구체적인 문법을 의미한다.람..
[Java] 57. 람다가 필요한 이유
·
Java/Modern Java(8~)
람다가 필요한 이유#Java/adv3람다가 필요한 이유1변하지 않는 부분과 변하는 부분을 분리하여, 변하지 않는 부분은 유지하고 변하는 부분은 매개변수(파라미터)를 통해 외부에서 전달받도록 한다.프로그래밍에서 중복을 제거하고, 좋은 코드를 유지하는 핵심은 변하는 부분과 변하지 않는 부분을 분리하는 것“Hello Spring”과 같은 구체적인 값(Value)을 매개변수를 통해 외부에서 전달받아 메서드의 동작을 달리하고, 재사용성을 높이는 방법을 값 매개변수화(Value Parameterization)라 한다.람다가 필요한 이유2어떠한 동작의 실행 시간을 측정하는 메서드 두 개 하나의 메서드에서 실행되도록 리팩토링하려면, 문자열 같은 단순한 값이 아니라 코드 조각을 전달해야 한다.두 메서드에서 시간을 측..
[Spring] Spring Initializr에서 AOP가 없는 이유
·
Spring
세 줄 요약Spring Initializr(start.spring.io) 화면에는 ‘Spring AOP’(spring-boot-starter-aop) 항목이 기본으로 표시되지 않는다.2015년부터 “불필요하게 AOP 스타터를 고르는 사용자가 많다”는 이유로 의도적으로 숨긴 정책이 지금까지 이어지고 있다.프로젝트를 만든 뒤 빌드 파일에 spring-boot-starter-aop를 직접 추가하거나, Initializr 검색창에 전체 좌표(org.springframework.boot:spring-boot-starter-aop)를 입력하면 된다.1. 화면에서 빠진 이유배경설명AOP 스타터가 실제 필요 없는 경우에도 많이 선택됐다는 통계가 나왔다‘@Transactional’, ‘@Async’ 같은 기능은 다른 스..
[Java] 56. HTTP 서버에 Reflection & Annotation 활용
·
Java/Reflection, Annotation
HTTP 서버 활용#Java/adv2/HTTP/HTTP 서버7 - 애노테이션 서블릿1 - 시작 : 애노테이션을 이용하여 ReflectionServlet의 문제점을 개선해보자.애노테이션@Retention( RetentionPolicy.RUNTIME)@Target(ElementType.METHOD)@Documentedpublic @interface Mapping { String value();}AnnotationServletpublic class AnnotationServletV1 implements HttpServlet { private final List controllers; public AnnotationServletV1(List controllers) { this.con..