java, spring

[Java] 스트림(Stream), 람다(Lambda), 메서드 참조 Study 1

isaac.kim 2022. 12. 31. 10:31
728x90
반응형

[Java] 스트림(Stream), 람다(Lambda), 메서드 참조 Study 1

 

[모던 자바 인 액션 | Modern Java in Action]

 

이 책에서 첫 장에 Java Stream에 대해 이렇게 설명한다.

 

"데이터베이스 질의처럼 간단하게 프로그래밍할 수도 있다."

"스트림이 처리하는 데이터(심지어 처리된 데이터)를 모두 메모리에 저장하지 않을 수도 있도록 설계되었다."

"스트림을 이용하면 컴퓨터 메모리에 저장할 수 없는 큰 데이터도 문제없이 처리할 수 있다. 또한 자바 8은 컬렉션에서는 할 수 없는 최적화를 스트림 동작에 적용했다. 예를 들어 같은 스트림의 여러 동작을 그룹화해서 데이터를 여러 번 탐색할 필요 없이 한 번만 탐색할 수 있다. 심지어 컬렉션과 달리 자바는 자동으로 스트림 동작을 병렬화할 수 있다."

 

스트림의 장점에 대한 설명이다.

 

반응형

 

자바 8에 java.util.stream 패키지에 스트림 API가 추가되었다. 스트림은 유닉스 혹은 리눅스에서 명령어로 복잡한 파이프라인을 구성했던 것처럼 스트림 API는 파이프라인을 만드는 데 필요한 많은 메서드를 제공한다.

스트림 API의 핵심은 기존에는 한 번에 한 항목을 처리했지만, 우리가 하려는 작업을 데이터베이스 질의처럼 고수준으로 추상화해서 일련의 스트림으로 만들어 처리할 수 있다는 것이다. 또한 스트림 파이프라인을 이용해 입력 부분을 여러 CPU 코어에 쉽게 할당할 수 있다는 부가적인 이득도 얻을 수 있다. 스레드라는 복잡한 작업을 사용하지 않으면서도 공짜로 병렬성을 얻을 수 있다.라고 소개되어 있다.

 

이 책을 보기 전에 좋은 코드라고 생각되었던 내용들이 이 책에 들어 있는 것 같다. 그리고 거기엔 stream이 있었다.

stream 사용에 시너지를 더해줄 람다(lambda). 메서드 참조 등의 개념을 같이 학습하면 더 간결한 코드를 사용할 수 있을 것이다.

 

 

람다(lambda)

먼저 간단하게 람다 이전 코드와 람다(lambda)를 사용한 코드를 비교해 보자.

 

아래 코드는 같은 결과를 나타내는 코드를 세 가지로 표현해본 것이다.

 

1. 반복문(for문)을 활용

2. 확장 For문 활용

3. Lambda 표현식 활용

일단 람다(lambda)를 활용하면 코드가 간결해진다. 그리고 다음으로 학습해나갈 스트림이나 메서드 참조 등을 함께 활용하면 기존에 사용하던 java코드를 보다 간결하게 사용할 수 있을 것이다.

 

 

메서드 참조

다음은 책에서 메서드 참조를 활용한 방법을 간단히 소개한다. 다음 코드는 숨김 파일을 필터링 해내는 코드인데 메서드 참조를 활용하여 어떻게 달라지는지  보자.

 

기존 코드

file[] hiddenFile = new File(".").listFile(new FileFilter() {
	public boolean accept(File file) {
    	return file.isHidden();	// 숨겨진 파일 필터링
    }
});

자바 8에서 가능한 표현

File[] hiddenFiles = new FIle(".").listFiles(File::isHidden);

여기서 사용된 개념이 메서드 참조(method reference)::('이 메서드를 값으로 사용하라'는 의미)이다. File 클래스의 isHidden 메서드를 값으로, 파라미터화 할 수 있는 방법이다. 이러한 기능들을 사용한다면 기존 코드들을 간결하게 사용할 수 있게 된다.

 

자바 스트림, 람다, 메서드 참조 등의 개념을 공부하며 자바에서 함수형 프로그래밍을 하는 방법과 간결한 코드 사용법에 대한 공부를 이어나가려고 한다.

728x90
반응형