2021. 6. 26. 22:41ㆍBig Dreamer_Developer/Java
1.3 자바 함수
프로그래밍 언어에서 함수라는 용어는 메서드 특히 정적 메서드와 같은 의미로 사용된다. 자바의 함수는 이에 더해 수학적인 함수처럼 사용되며 부작용을 일으키지 않는 함수를 의미한다. 곧 살펴보겠지만 다행히 자바 8에서 함수 사용법은 일반적인 프로그래밍 언어의 함수 사용법과 아주 비슷하다.
자바 8에서는 함수를 새로운 값의 형식으로 추가했다. 이는 1.4절에서 설명할 멀티코어에서 병렬 프로그래밍을 활용할 수 있는 스트림과 연계될 수 있도록 함수를 만들었기 때문이다. 객체 참조는 클래스의 인스턴스를 가리킨다.
프로그래밍 언어의 핵심은 값을 바꾸는 것이다. 역사적으로 그리고 전통적으로 프로그래밍 언어에서는 이 값은 퍼스트클래스값이라고 부른다. 바라 프로그래밍 언어의 다양한 구초제(메서드, 클래스 같은)가 값의 구조를 표현하는 데 도움이 될 수 있다. 하지만 프로그램을 실행하는 동안 이러한 모든 구조체를 자유롭게 전달할 수는 없다. 이렇게 전달할 수 없는 구조체는 세컨드클래스 값(시민)이다. 메서드, 클래스 등은 이급 자바 시민에 해당한다. 인스턴스화한 결과가 값으로 귀결되는 클래스를 정의할 때 메서드를 아주 유용하게 활용할 수 있지만 여전히 메서드와 클래스는 그 자체로 값이 될 수 없다. 하지만 이게 중요할까? 그렇다. 예를 들어 런타임에 메서드를 전달할 수 있다면, 즉 메서드를 일급 시민으로 만들면 프로그래밍에 유용하게 활용할 수 있다. 따라서 자바 8 설계자들은 이급 시민으로 만들면 바꿀 수 있는 기능을 추가했다. 클래스 같은 이급 시민도 일급 시민으로 바꿀 수 있다면 좋지 않을까? 이미 스몰토크, 자바스크립트 같은 다양한 언어에서 일급 시민으로 가득 찬 세계를 성공적으로 만들어가고 있다.
1.3.1 메서드와 람다를 일급 시민으로
자바 8의 설계자들은 메서드를 값으로 취굽할 수 있게, 그리하여 프로그래머들이 더 쉽게 프로그램을 구현할 수 있는 환경이 제공되도록 자바 8을 설계하기로 결정했다. 더불어 자바 8에서 메서드를 값으로 취급할 수 있는 기능은 스트림 같은 다른 자바 8기능의 토대를 제공했다.
첫번째로 메서드 참조(method reference)라는 새로운 자바 8의 기능을 소개한다. 디렉토리에서 모든 숨겨진 파일을 필터링한다고 가정하자. 우선 주어진 파일이 숨겨져 있는지 여부를 알려주는 메서드를 구현해야 한다. 다행히 File 클래스는이미 isHidden 메서드를 제공한다. isHidden은 File 클래스를 인수로 받아 boolean을 반환하는 함수다. 다음 예제처럼 FileFilter 객체 내부에 위치한 isHidden의 결과를 File.listFiles 메서드로 전달하는 방법으로 숨겨진 파일을 필터링할 수 있다.
File[] hiddenFiles = new File(".").listFiles(new FileFilter() {
public boolean accept(File file) {
return file.isHidden(); <-- 숨겨진 파일 필터링!
}
});
하지만 위 코드가 썩 마음에 들지 않는다. 단 세 행의 코드지만 각 행이 무슨 작업을 하는지 투명하지 않다. 이제 자바 8에서는 다음처럼 코드를 구현할 수 있다.
File[] hiddenFiles = new File(".").listFiles(File::isHidden);
이미 isHidden이라는 함수는 준비되어 있으므로 자바 8의 method reference::('이 메서드를 값으로 사용하라'는 의미)를 이용해서 listFiles에 직접 전달할 수 있다. 여기서 메서드가 아닌 함수라는 용어를 사용했다는 사실도 주목하자.
이쯤에서 눈치챘을 수 있지만, 자바 8에서는 더 이상 메서드가 이급값이 아닌 일급값이라는 것을 알 수 있다. 기존에 객체 참조(object reference, new로 객체 참조를 생성함)를 이용해서 객체를 이리저리 주고받았던 것처럼 자바 8에서는 File::isHidden을 이용해서 메서드 참조를 만들어 전달할 수 있게 되었다. 메서드는 코드를 포함하고 있으므로 코드를 마음대로 전달할 수 있다.
람다 : 익명 함수
자바 8에서는(기명named) 메서드를 일급값으로 취급할 뿐 아니라 람다(또는 익명 함수anonymous function)를 포함하여 함수도 값으로 취급할 수 있다. 람다 문법 형식으로 구현된 프로그램을 함수형 프로그래밍, 즉 '함수를 일급값으로 넘겨주는 프로그램을 구현한다'라고 한다.
'Big Dreamer_Developer > Java' 카테고리의 다른 글
JAVA 객체 지향 프로그래밍_1 (0) | 2021.06.30 |
---|---|
JAVA 객체 지향 프로그래밍 (0) | 2021.06.30 |
모던자바인액션(Modern Java in Action) Part1_기초(.1 - .2) (0) | 2021.06.26 |