[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어떠한 동작의 실행 시간을 측정하는 메서드 두 개 하나의 메서드에서 실행되도록 리팩토링하려면, 문자열 같은 단순한 값이 아니라 코드 조각을 전달해야 한다.두 메서드에서 시간을 측..
[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..
[Java] 55. 애노테이션
·
Java/Reflection, Annotation
애노테이션#Java/adv2/애노테이션이 필요한 이유리플렉션으로 해결하지 못했던 문제들요청 이름과 메서드 이름을 다르게 하고 싶다면?/ , /favicon.ico 와 같이 자바 메서드 이름으로 처리하기 어려운 URL은 어떻게 처리할까?해결 방안: 메서드에 추가 정보를 적어두고, 추가 정보를 통해 메서드를 리플렉션으로 찾고 호출해보자.프로그램 실행 중에 읽어서 사용할 수 있는 주석이 필요하다. 애노테이션/애노테이션 예제package annotation.mapping;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;@Rete..
[Java] 54. 리플렉션(Reflection)
·
Java/Reflection, Annotation
리플렉션#Java/adv2/리플렉션이 필요한 이유기존 WAS의 문제점기존 커맨드 패턴 하나의 클래스에 하나의 기능새로 커맨드 클래스를 만들때마다 URL 경로와 클래스를 매핑해야 함.해결 방법: 하나의 클래스 안에서 다양한 기능을 처리하는 것.메서드와 경로를 어떻게 매핑할까? 리플렉션을 이용해 URL 경로와 같은 이름의 메서드를 호출하자./클래스와 메타데이터리플렉션(Reflection): 클래스가 제공하는 다양한 정보를 동적으로 분석하고 사용하는 기능"반사하다" 또는 "되돌아보다”. 프로그램이 자기 자신의 내부를 “반사하여” 들여다본다.프로그램이 실행 중에 자기 자신의 구조를 들여다보고, 그 구조를 변경하거나 조작할 수 있는 기능프로그램 실행 중에 클래스, 메서드, 필드 등에 대한 정보를 얻거나, ..
[Java] 53. HTTP 서버 만들기
·
Java/IO, Network
HTTP 서버 만들기#Java/adv2/HTTP/HTTP 서버1 - 시작싱글 스레드로 serverSocket에서 socket을 받아, HTTP 요청 메시지를 받아 출력하고, 간단한 html 문서를 HTTP 응답 메시지로 내려주는 서버BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream(), UTF_8));PrintWriter writer = new PrintWriter(socket.getOutputStream(), false, UTF_8))false는 AutoFlush 옵션이다. flush 옵션이 false면 print해도 바로 전송되는게 아니라, 버퍼에 모였다가 flush 해줘야 전송된다. 마지막에 꼭..
[Java] 52. 채팅 프로그램(feat. Command Pattern)
·
Java/IO, Network
채팅 프로그램(feat. Command Pattern)#Java/adv2/Network/채팅 프로그램 - 설계/채팅 프로그램 설계 - 클라이언트기존 클라이언트는 콘솔에서 입력받는 부분에서 블로킹되기 때문에, 메시지가 도착해도 콘솔에 바로 출력할 수 없다. 콘솔 입력과 서버로부터 메시지를 받는 부분을 별도의 스레드로 분리/채팅 프로그램 설계 - 서버서버에서 모든 세션을 관리해야, 하나의 클라이언트가 보낸 메시지를 서버가 받아서 모든 클라이언트에게 메시지를 전송할 수 있다. 이전 챕터의 세션 매니저를 잘 활용하자./채팅 프로그램 - 클라이언트ReadHandler, WriteHandler : 두 작업을 별도의 스레드로 분리..