상세 컨텐츠

본문 제목

인프런 강의 람다식 이해

자바

by esoesmio 2022. 12. 15. 17:53

본문

지금 인프런에서 스프링 강의를 듣고 있는데 강사님이 이런 코드를 쓰셨다.

public Optional<Member> findBYName(String name) {
        return store.values().stream()
                .filter(member -> member.getName().equals(name))
                .findAny();
    }

여기서 나는 아직 확실히 Java 기본기를 제대로 알지 못하는구나 라는 생각이 들었고, 하나씩 공부해보기로 했다.

 

일단 여기서 제대로 이해 못하는 것

1. Optional<>함수

2. stream() 함수

3. m -> member.getName() 과 같은 람다식 함수

 

Optional 함수는 다음 포스팅에서 공부해보기로하고, 오늘은 2와 3에 대해서 제대로 이해해보려한다!

 

일단,

[Stream API란 무엇일까?]

Stream API는 자바8부터 람다식과 함께 제공된 함수형 프로그래밍을 위한 기능으로,

컬렉션, 배열안에 있는 요소들을 하나씩 참조하며 반복적인 처리를 할 수 있는 것이다!

 

그냥 말로만 이해하기는 좀 어려우니

코드 예시를 보며 확인해보자!

* Stream쓰고 안쓰고 비교를 위해 리스트 정렬과 출력처리를 해보기.

String[] fruits = {apple, grape, orange};

//Stream 쓰지 않을 때
Arrays.sort(fruits); //원본 그대로의 데이터 정렬
//출력
for(String x: fruits) {
	System.out.println(x);
    }
    
//Stream을 썼을 때
Stream<String> fruits_stream = Arrays.stream(fruits); //Stream 객체 생성
//정렬 후 출력
fruits_stream.sorted().forEach(System.out::println);

1. Stream을 쓰지 않을 때

- 원본의 데이터가 변경된다.

- for문의 사용으로 코드가 길어진다.

 

2. Stream을 쓸 때

- 원본 데이터의 변경이 없다.

- 일시적이며 재사용이 불가하다.

- forEach문에 반복문이 들어가 있기에 코드가 간결하다.

 

* 정렬 후 출력에 사용되는 System.out::println은 람다식과 관련된 개념이다. 조금 뒤에 자세히 알아보자!

 

 

[Stream의 연산 기능들 알아보기]

public Optional<Member> findBYName(String name) {
        return store.values().stream() //stream 객체 생성
                .filter(member -> member.getName().equals(name)) //filter로 가공하기
               //여기서는 member라는 객체에서 getName()이름을 가져온 후, name와 동일한 것 탐색
                .findAny(); //어떤 것이든 찾아서 반환, 결과
    }

1. stream()으로 stream 객체를 생성한다.

 

2. filter()로 원하는 데이터를 뽑아낸다.

   이 외에도 map() 등 가공할 수 있는 함수들이 내장되어있다.

   여기에서 사용된 -> 이게 바로 람다식! 밑에서 알아보자!

 

3. findAny() 어떤것이든 찾음 혹은 sorted() 정렬, count() 개수를 반환 를 써서 원하는 결과를 가져온다.

 

 

 

이젠 위처럼 Stream API를 사용할 때, 함께 사용하게 되는 람다식에 대해 알아보자.

[람다식이란?]

프로그래밍 언어에서 사용되는 개념으로 익명 함수(匿名函數, Anonymous functions)를 지칭하는 용어

 

읭? 이게 무슨 말이지 싶었다.

 

즉.. 이 말을 쉽게 풀어내자면..!

원래 우리는 메서드(함수)를 사용하기 위해 아래의 예시처럼 메서드를 정의해주고 선언해준다.

일반 메서드 예시)

public String SayHello() {
	return "안녕하세요?";
    }

 

하지만 람다식은 위의 함수사용을 이러한 방식으로 풀어내준다.

람다식 예시)

() -> "안녕하세요?"

이처럼 메소드에 대한 정의없이도 바로 간결하게 사용할 수 있도록 해주는 것이 바로 람다식이다.

함수에 대한 이름이 없기에 익명 함수라고 일컬어지는 것이다.

 

 

이런 람다식의 장점으로는

1. 코드가 간결해진다.

2. 함수를 만드는 과정이 생략되기에 생산성이 올라간다.

3. 병렬 프로그램에 사용될 수 있다.

(=스레드가 여러개 실행중일때, 다른 곳에서 또 다른 기능을 실행하는 것)

 

물론 단점도 존재한다.

1. 재사용이 불가능하다.

2. 남용을 하게 될 경우 오히려 코드가 더욱 복잡해진다.

3. 디버깅이 어렵다.

 

그래서 Test케이스를 작성할 때는 함수를 재사용할 필요가 줄어드니, 본문 제일 위의 코드 예시처럼 테스트케이스에 람다가 잘 사용될 수 있는 것 같다!

 

[:: 메소드 참조란?]

람다표현식에서 불필요한 매개변수를 제거하는 것

 

이것도 쉽게 말하자면 람다식의 코드를 또 간편하게 줄여주는 것이 메소드 참조 :: 이다!

코드 예시로 알아보자.

() -> System.out.println(); // 람다식 출력

System.out::println; //참조형 메서드 출력

이처럼 간편해진다.

메서드 참조는 생성자 참조도 가능하고, 정적, 인스턴스 메소드도 모두 참조 가능하다.

 

쉽게 이해해보는 Stream과 람다식, 그리고 메소드 참조 끝!!

zzzㅋㅋㅋㅋ

 

참조 사이트:

https://mong9data.tistory.com/130

https://mangkyu.tistory.com/113

'자바' 카테고리의 다른 글

[object]객체 복사하기  (0) 2023.03.22
한번만쓰는 익명함수  (0) 2023.03.21
지역중첩클래스 쓰는법  (0) 2023.03.21
정적 중첩클래스, 인스턴트중첩클래스 사용법  (7) 2023.03.21
제네릭 이해  (2) 2022.12.15

관련글 더보기

댓글 영역