공부/인프런 워밍업 클럽_BE

[인프런 워밍업 클럽_0기] BE 세 번째 과제 (진도표 3일차)

데부한 2024. 2. 19. 21:53
반응형

배너를 클릭하면 해당 사이트로 이동

 

강의 출처

 

자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인

Java와 Spring Boot, JPA, MySQL, AWS를 이용해 서버를 개발하고 배포합니다. 웹 애플리케이션을 개발하며 서버 개발에 필요한 배경지식과 이론, 다양한 기술들을 모두 학습할 뿐 아니라, 다양한 옵션들

www.inflearn.com

 

 

진도표 3일차와 연결됩니다
우리는 JdbcTemplate을 사용하는 과정에서 익명 클래스와 람다식이라는 자바 문법을 사용했습니다. 익명 클래스는 자바의 초창기부터 있던 기능이고, 람다식은 자바 8에서 등장한 기능입니다. 다음 키워드를 사용해 몇 가지 블로그 글을 찾아보세요! 아래 질문을 생각하며 공부해보면 좋습니다! 😊
 
[키워드]
익명 클래스 / 람다 / 함수형 프로그래밍 / @FunctionalInterface / 스트림 API / 메소드 레퍼런스
 
[질문]
자바의 람다식은 왜 등장했을까?람다식과 익명 클래스는 어떤 관계가 있을까? - 람다식의 문법은 어떻게 될까?

 

키워드

익명 클래스

  • 클래스 선언과 객체의 생성을 동시에 하기 때문에 단 한 번만 사용 가능 → 일시적으로 한 번만 사용되고 버려지는 객체  → 재사용 불가
  • 이름이 없기 때문에 생성자도 가질 필요가 없다.
  • 단 하나의 클래스를 상속받거나 단 하나의 인터페이스만을 구현할 수 있음.
  • 클래스 파일명 : '외부 클래스명$숫자.class' 형식
  • 오버라이딩한 메서드 사용만 가능하고 새로 정의한 메서드는 외부에서 사용이 불가능하다.
  • 사용 이유
    • 프로그램 내에서 일시적으로(단발성으로) 한 번만 사용되어야 하는 객체일 경우
    • 재사용성이 없고, 확장성을 활용하는 것이 유지보수에서 더 불리할 때
  • 선언 위치
    • 클래스 필드로 이동
    • 지역 변수로서 이용
    • 메서드 아규먼트로 이용

 

반응형

 

람다

  • 메서드를 하나의 식(expression)으로 표현
  • 함수를 간략하면서도 명확한 식으로 표현할 수 있게 함
  • 메서드의 이름과 반환값이 없어짐 → 익명 함수(anonymous function)라고도 함
  • 메서드를 변수처럼 다루는 것이 가능함
  • 스트림 API의 매개변수로 전달 가능
  • 람다식 내에서 사용되는 지역변수는 final이 붙지 않아도 상수로 간주
  • 형식
// 기존 메서드
반환타입 메서드이름 (매개변수 선언) {
	문장들
}


// 람다식
(매개변수 선언) -> {
	문장들
}
  • 반환값이 있는 메서드의 경우 return문 대신 '식(expression)'으로 대신할 수 있음.
  • 식의 연산결과가 자동적으로 반환값이 됨. 문장이 아닌 '식'이므로 끝에 ';' 붙이지 않음.
  • 매개변수는 타입 추론으로인해 타입 생략이 가능하다. 단, 두 매개변수 중 어느 하나의 타입만 생략하는 것은 허용되지 않음
  • 매개변수가 하나만 있을 경우 괄호 생략 가능. 단, 매개변수의 타입이 있으면 생략 불가능함
  • 괄호{} 안의 문장이 하나일 때는 괄호{}를 생략할 수 있음.
  • 단점
    • 람다를 사용하면서 만든 무명함수는 재사용 불가
    • 디버깅 어려움
    • 람다를 남발하면 비슷한 함수가 중복 생성되어 코드가 지저분해짐
    • 재귀로 만들 경우에 부적합

 

함수형 프로그래밍 /  @FunctionalInterface

  • 람다식을 다루기 위한 인터페이스
  • 함수형 인터페이스에는 오직 하나의 추상 메서드가 정의되어야 함 → 람다식과 인터페이스의 메서드가 1:!
  • @FunctionalInterface를 붙이면 컴파일러가 함수형 인터페이스를 올바르게 정의했는지 체크해줌
    • @Overrie 어노테이션과 비슷한 역할을 한다.

 

스트림(Streame) API

  • 스트림이란 데이터를 운반하는데 사용되는 연결 통로
  • 스트림은 데이터를 추상화하여 다룸. 
  • 스트림 API의 특징
    • 스프림은 외부 반복을 통해 작업하는 컬렉션과 달리 반복을 통해 작업 수행
    • 스트림은 최소한 재사용이 가능한 컬렉션과 달리 단 한 번만 사용할 수 있음
    • 스트림은 원본 데이터를 변경하지 않음
    • 스트림의 연산은 필터 -> 맵(filter-map) 기반의 API를 사용하여 지연(lazy) 연산을 통해 성능 최적화
    • 스트림은 paralleSTream() 메서드를 통해 손쉬운병렬 처리 지원

 

반응형

 

메서드 레퍼런스

  • 람다 표현식을 더 간단하게 표현하는 방법
  • 람다식과 함께 사용될 수 있다
  • ClassName::MethodName() 형식으로 입력함.
  • 분류
    • Static 메서드 레퍼런스
    • Instance 메서드 레퍼런스
    • Constructor 메서드 레퍼런스

 

 

자바의 람다식은 왜 등장했을까?

이 부분은 OT날 강사님께 짧막한 '자바의 역사' 강의에서 언뜻 들었던 게 생각이 난다. 자바 8에서 엄청난 기능들이 추가되었고, 그 전에 자바는 영 힘을 못 쓰는 언어라 했다. Node.js 등 새로운 프레임워크나 언어가 유행하면서 자바는 서서히 침체되었다고 한다. 그러면서 함수형 프로그래밍이 덩달아 유행했는데 이러한 변화 때문에 자바에 함수형 프로그래밍을 지원하기 위한 람다식이 추가된 것으로 생각된다..!

아래) 모던 자바 인 액션 참고

프로그래밍 언어 생태계에 변화가 생겼다. 바로 빅데이터. 멀티코어 컴퓨터나 컴퓨팅 클러스터를 이용해서 빅데이틀 효과적으로 처리할 필요성이 커졌다. 즉, 병렬 프로세싱을 활용해야 하는 데 자바 8 이전의 언어를 사용하기엔 미숙했다. 즉, 변화하는 환경에 발맞춰 다양한 기능을 가진 자바 8을 출시한 것이다.

 

람다식과 익명 클래스의 관계?

  • 람다 표현식은 익명 함수의 일종이다. 이름은 없만 파라미터 리스트, 바디, 반환 형식을 가지며 예외을 던질 수 있다.
  • 차이점
    • 익명 내부 클래스는 새로운 클래스를 생성하지만, 람다는 새로운 메서드를 새성하여 포함한다.
    • 익명 내부 클래스의 this: 새로 생성된 클래스, 람다의 this : 람다식을 포함하는 클래스

 

람다식 문법

  • 기본
(타입 매개변수, ...) -> {실행문;... }
  • 타입 매개변수 : 오른쪽 블록을 실행하기 위해 필요한 값 제공
  • -> : 매개변수를 이용해서 블록 실행

 

  • a 메서드 출력
a -> (System.out.println(a));

 

  • 하나의 매개변수가 존재할 때는 소괄호 제거 가능 / 중괄호 안에 실행문이 하나만 있다면 중괄호 제거 가능
a -> System.out.println(a);

 

  • 중괄호 안에 return문만 있을 경우 중괄호와 return문을 제거하고 사용하는 것이 일반적임
(x,y) -> x + y;

 

 

와 오늘은 진짜 엄청 피곤해서 별로 집중을 못했다... 직장인이라 체력 관리를 더 잘해야 더 스터디를 활용할 수 있을 거 같다...ㅠ


 

Reference

https://mangkyu.tistory.com/113

https://gimmesome.tistory.com/209

https://steady-coding.tistory.com/304

 

반응형