Java 기초 다지기 3

변현섭·2023년 6월 9일
0

Spring 잡학사전

목록 보기
3/10

Ⅲ. 함수형 프로그래밍

1. 람다

코드의 양을 줄여 읽기 쉬운 코드로 만들기 위해 람다식을 사용한다. 람다는 익명함수를 의미한다. 람다식을 왜 알아야 하는지 이해하기 위해 아래의 예시를 보자.


람다식을 사용하면 아래와 같이 코드를 간추릴 수 있다.

괄호 사이에 int a, int b가 파라미터에 해당하고, -> 뒤의 a+b가 리턴 값이다. 흥미로운 점은 함수의 이름이 없음에도 컴파일러가 어떤 함수를 호출하는지 알고 있다는 것이다. 이게 어떻게 가능할까?

생각보다 간단한 이유인데, 이는 인터페이스에 함수가 하나밖에 없기 때문이다. 이러한 점에서 알 수 있듯, 람다식을 사용하려면 인터페이스에 메서드가 반드시 1개만 있어야 한다.

자바에서 제공하는 @FunctionalInterface 어노테이션을 사용하면 인터페이스에 2개 이상의 메서드를 작성할 수 없게 되므로 인터페이스 상단에 추가해주는 것이 좋다.

람다식을 사용하면 구현체 클래스 없이 인터페이스 객체를 생성할 수 있다는 장점이 있다.

2. 스트림

사실 람다식이나 스트림을 다 공부하기에는 너무 방대해서 간단히 소개 정도만 하고 넘어가겠다. 예를 들어 배열에서 짝수만 뽑아 중복을 제거한 후 역순으로 정렬하는 프로그램을 만든다고 하자. 원래대로라면, HashSet을 이용해 생성자 입력으로 ArrayList를 주고 이를 다시 ArrayList로 바꾸어 sort함수를 호출했을 것이다.

이를 스트림으로 표현하면 아래와 같이 나타난다.

Arrays.stream(data)는 정수배열을 IntStream으로 생성하고, .boxed()는 IntStream을 Stream 로 바꾼다. 둘이 어떤 차이가 있는지에 대해 설명하자면, IntStream은 원시타입이고, Stream는 포장클래스에 감싸진 형태인 것이다.위에서 배웠 듯이 원시타입은 Collection에 담을 수 없기 때문에 이를 바꿔주는 것이다.

.filter()는 람다식을 사용하여 짝수만 필터링하고 있고, .distinct()는 중복 제거를 위해 사용한다. .sorted()는 stream에서 사용하는 정렬메서드이고, .mapToInt(Integer::intValue)는 다시 IntStream으로 변환한다. 변환이 필요한 이유는 이후에 나오는 .toArray()가 int타입(원시타입) 배열을 리턴하기 때문이다.

profile
Java Spring, Android Kotlin, Node.js, ML/DL 개발을 공부하는 인하대학교 정보통신공학과 학생입니다.

0개의 댓글