자바함수
프로그래밍 언어에서 함수 라는 용어는 메서드 특히 정적 메서드와 같은 의미로 사용된다.
자바의 함수는 이에 더해 수학적인 함수처럼 사용되며 부작용을 일으키지 않는 함수를 의미한다.
자바 8에서는 함수를 새로운 값의 형식으로 추가했다. 이는 다음에 포스팅할 스트림 Stream 과 연계될 수 있도록 함수를 만들었기 때문이다. 먼저 함수를 값처럼 취급한다고 했는데 이 특징이 어떤 장점을 제공하는지 살펴보자.
자바 프로그램에서 조작할 수 있는 값을 생각해보자.
첫번째로 int_42, double_3.14 등의 기본값이 있다.
두번째로 객체도 값이다. new 또는 팩토리 메서드 또는 라이브러리 함수를 이용해서 객체의 값을 얻을 수 있다. 객체 참조는 클래스의 인스턴스를 가리킨다. 예를 들어 String_abc, Integer_new Integer(1111), HashMap_new HashMap<Integer, String>(100) 등으로 객체 참조를 얻을 수 있다.
심지어 배열도 객체이다. 그런데 왜 함수가 필요할까?
프로그래밍 언어의 핵심은 값을 바꾸는 것이다.
이런 값은 일급값. 또는 일급시민 이라고 명한다. 자바 프로그래밍 언어의 다양한 구조체, 메서드나 클래스 같은 값의 구조를 표현하는 데에 도움이 될 수 있다. 하지만 프로그램을 실행하는 동안 이러한 모든 구조체를 자유롭게 전달 할 수 없는데, 이렇게 전달할 수 없는 구조체를 이급시민 이라고 명한다. 인스턴스화한 결과가 값으로 귀결되는 클래스를 정의할 때 메서드를 아주 유용하게 활용할 수 있지만 여전히 메서드와 클래스는 그 자체로 값이 될 수 없다.
하지만 이게 중요할까? 그렇다.
예를 들어 런타임에 메서드를 전달할 수 있다면, 즉 메서드를 일급시민으로 바꾸면 프로그래밍에 유용하게 활용할 수 있다.
따라서 JAVA 8 설계자들은 이급시민을 일급시민으로 바꿀 수 있는 기능을 추가했다.
그렇다면 클래스 같은 이급시민도 일급시민으로 바꿀 수 있다면 좋지 않을까? 이미 자바스크립트 같은 다양한 언어에서 일급 시민으로 가득 찬 세계를 성공적으로 만들어가고 있다.
메서드 ; 메서드 참조 ( :: )
JAVA 8의 기능 중 하나인, 메서드 참조를 소개한다.
메소드 참조 Method Reference 는 람다 표현식이 단 하나의 메소드만을 호출하는 경우에 해당 람다 표현식에서 불필요한 매개변수를 제거하고 사용할 수 있도록 해준다.
아래에 이해하기 쉬운 예시를 적어보았다.
// JAVA 8 이전 코드
public static String valueOf(Object obj) { ... }
// JAVA 8 이후 코드
String::valueOf
Class :: method 형식으로 사용하며, 메소드에 소괄호는 쓰지 않는다.
'참조' 라는 말에서 알 수 있듯이 이미 존재하는 이름을 가진 메소드를 람다로써 사용할 수 있도록 참조. 즉 가리키는 역할을 한다. 이는 곧, 일반 함수를 람다 형태로 사용할 수 있도록 해주는 것이다. 그리고 메소드를 호출하는 것이 아니라 참조하는 것이기 때문에 메소드 뒤에 소괄호를 쓰지 않는 것이다.
위를 보면 알 수 있듯이, JAVA 8 에서는 더이상 메서드가 이급값이 아닌 일급값이다. 기존에 객체 참조 (new로 객체 참조를 생성) 을 이용해서 객체를 이리저리 주고받았던 것처럼 JAVA 8 에서는 Class :: method 식으로 메서드 참조를 만들어 전달 할 수 있게 되었다. 메서드는 코드를 포함하고 있으므로 코드를 마음대로 전달할 수 있다.
람다
JAVA 8에서는 기명 메서드를 일급값으로 취급할 뿐 아니라 람다_또는 익명함수를 포함하여 함수도 값으로 취급할 수 있다.
예를 들어 (int x) -> x + 1, 즉 'x라는 인수로 호출하면 x+1을 반환' 하는 동작을 수행하도록 코드를 구현할 수 있다.
클래스를 만들고 내부에 메서드를 정의해서 만들면 되지 굳이 왜 이와 같은 코드가 필요한지 의아할 수 있다. 물론 직접 메서드를 정의할 수 있지만, 이용할 수 있는 편리한 클래스나 메서드가 없을때 새로운 람다 문법을 이용하면 더 간결하게 코드를 구현할 수 있다.
람다 문법 형식으로 구현된 프로그램을 함수형 프로그래밍, 즉 '함수를 일급값으로 넘겨주는 프로그램을 구현한다' 라고 한다.
'📌 JAVA 자바 > 📚 모던 자바 인 액션' 카테고리의 다른 글
📚 04 - 스트림 (0) | 2023.04.24 |
---|---|
📚 03 - 자바 함수 ( 코드 넘겨주기 ) (0) | 2023.04.21 |
📚 01 - JAVA 8 설계의 밑바탕을 이루는 세가지 프로그래밍 개념 (0) | 2023.04.20 |
📚 00 - JAVA 8 이전 개념_제네릭 Generics (0) | 2023.04.20 |