[TIL | 내일배움캠프] Java 문법-람다, 스트림

KnitDev - BCJ·2025년 10월 2일

Java

목록 보기
7/8

지난번 간략하게 이해하고 넘어갔던 람다와 스트림을 집중해서 파고들어가보고자 한다.

람다

람다는 일종의 표현 방식이다.
-> : 이렇게 생긴 표현식으로 특정 연산을 진행시키는 이름없는 함수(익명 함수)인데 이름이 없다는 건 우리가 따로 명명하지 않아도 잘 돌아가주는 메서드라는 의미다.

예를 들어서 우리가 특정 연산을 반복해주는 메서드가 필요하다. 그렇다면 맨 처음 할 일은 Java 클래스를 생성해야 한다. 클래스 안에 메서드를 정의해야 하니까!
이렇게 되면 클래스의 이름을 지어주고, 그 안에서 쓸 인수나 변수를 설정하고, 등등등 이름짓고 동작을 작성해야 한다.
그러나 람다식을 사용하면 이 과정들을 생략하고 한줄로 원하는 메서드를 작성할 수 있다.

특징

  • 함수형 인터페이스만 사용할 수 있다.
    함수형 인터페이스? 그게 뭔데?? 함수형 인터페이스는 하나의 추상 메서드만 갖는 인터페이스를 말한다.
    추상 메서드는 또 뭔데? 선언은 되었으나 구현되지 않은 메서드를 말한다.
    이렇게만 말하면 솔직히 이해가 어렵다. 작성할 때의 시점에서 설명하자면, 이제부터 내가 두 수 a, b를 더하는 메서드를 작성하고 싶다. 이 때 본문에 냅다
int sum(int a, int b);

이렇게 작성해버린다. 이 sum()이라는 메서드는 구현되지 않았지만 선언은 되어있다. 이 한 줄이 하나의 추상 메서드라고 부를 수 있다.

  • 하나의 추상 메서드만 가질 수 있다.
    말이 어렵지만 내용은 간단하다. 같은 이름으로 여러 형태를 정의하면 안 된다. 위에 적었던 예시를 활용하겠다.
int sum(int a, int b);
int sum(int a, int b, int c);

컴파일러는 sum()의 인수가 2개인 것, 3개인 것 중 어느 걸 호출하면 될지 몰라 오류가 나게 된다.

활용법

람다는 변수를 선언할 때, 매개변수를 전달할 때 등 조건을 만족한다면 객체로 유용하게 사용할 수 있다.

example

public enum OperatorType {
    ADD('+', (num1, num2) -> num1 + num2),
    MINUS('-', (num1, num2) -> num1 - num2),
    MULTIPLY('*', (num1, num2) -> num1 * num2),
    DIVIDE('/', (num1, num2) -> {
        if (num2==0) throw new ArithmeticException("나눗셈 연산에서 분모(두 번째 정수)에 0이 입력될 수 없습니다.");
        return num1 / num2;
    });
...}

계산기 과제에서 람다식을 사용했던 부분을 발췌해왔다. 람다식을 쓴 부분이 객체처럼 사용되고 있다.

스트림

스트림은 문법 개념보다는 활용법이 중요해(자주 사용하게 될 예정이라) 중간연산, 최종연산에 잘 쓰이는 메서드를 정리하도록 하겠다.

중간연산

1. 필터

  • filter(Predicate predicate) : ()안의 조건에 해당되는 요소만 반환한다.
    • distinct() : 스트림의 중복되는 요소를 제거한 결과물을 반환한다.
    • limit(long maxSize) : maxSize 길이(크기)까지의 요소만 반환한다.
    • skip(long n) : 스트림의 처음부터 n개까지의 요소를 건너뛰고 나머지 요소만 반환한다.

2. 변환

  • map(Function<T, R> mapper) : 요소를 ()안의 함수가 적용된 결과로 변환해 반환한다.
  • IntStream의 반환 → mapToInt(), flatMapToInt()
  • LongStream의 반환 → mapToLong(), flatMapToLong()
  • DoubleStream의 반환 → mapToDouble(), flatMapToDouble()

3. 정렬

  • sorted() : 스트림의 요소를 정렬해준다. 문자열은 abc.. / 숫자는 오름차순이 기본 설정이다.
    ++ 숫자로 이루어진 stream()을 내림차순으로 정렬하고 싶은 경우 sorted(Comparator.reverseOrder())를 쓰면 된다.

최종연산

  • forEach() : 각 요소마다 ()안의 동작을 수행한다.
  • toArray() : 스트림의 요소를 모두 배열로 반환한다.
  • collect() : 스트림의 요소들을 ()안의 자료형으로 반환한다. 이 때 타입을 변환할 수 있는데, ()안에는 Collection 클래스의 toArray(), toList(), toSet(), toMap(), toCollection()을 사용할 수 있다.
    ex) .collect(Collectors.toList())
profile
우당탕탕얼레벌레 개발 일지와 일상

0개의 댓글