
자바 프로그래밍은 익숙하지만 Java 버전에 대해서는 무지했던 것 같다. 아무생각없이 안정화된 버전을 사용하고, 막상 해당 버전에서 갖는 특성을 이해해볼 생각은 하지 않았다. 그럼 Java8은 어떤 특징이 있을까?
Lambda Expression
java8 부터는 람다표현식(람다식)을 지원합니다.
아마도 java8 이전버전을 사용하시던 분이라면 람다식이 익숙하지 않으실 수 있는데 사실 람다식, 또는 람다함수는 java8에서 처음 나온 개념이 아닙니다.
람다식은 수학 람다 계산법에서 사용된 식으로 프로그래밍 언어로서는 LISP에 첫 도입이 되어 이후 C#, Scala, Python 등 현재는 대부분의 언어에서 지원하고 있습니다.
람다식은 익명함수를 지칭하는 용어로서 말 그대로 선언되어있지 않은 함수를 자체적으로 함수화한 표현식을 뜻합니다. 설명으로만 풀어 쓰자니 이해하기 힘드실 것 같아 예제를 통해 알아보도록 하겠습니다.
public String concat(String message1, String message2){
return message1+message2;
}
위에서 선언한 concat 메서드는 2개의 String parameter를 받아 붙여주는 메서드 입니다. 위의 메서드를 람다식으로 표현하자면 다음과 같습니다.
(a,b)-> a+b
// (a,b) : parameter 선언
// -> : parameter와 body를 구분하는 구분자
// a+b : return 값
혹은 다음과 같이 표현이 가능합니다.
(a,b)->{return a+b;}
// (a,b) : parameter 선언
// -> : parameter와 body를 구분하는 구분자
// {return a+b;} : 함수 body
위의 예제로 알 수 있듯이 람다식의 가장 큰 장점은 코드가 매-우 간결해질 수 있다는 장점이 있습니다. 하지만 모든 경우에서 이러한 람다식을 사용 할 수 있는 것은 아닙니다.
Functional Interface
자바에서 람다식을 사용 가능한경우는, Functional Interface (함수현 인터페이스)로 선언되어있는 경우에서만 람다식으로 표현이 가능합니다.
따라서 어떤 경우에 람다식 표현을 사용하는지 알아보기 위해 먼저, Functional Interface (함수형 인터페이스)에 대해서 알아보도록 하겠습니다.
함수형 인터페이스는 하나의 메서드만을 갖는 Interface 입니다. 다음은 함수형 인터페이스 예제 코드입니다.
@FunctionalInterface
interface Concat{
publicStringprocess(String message1,String message2);
}
위의 예제를 보시면 concat 인터페이스는 process 하나의 메서드만을 갖습니다.
위와 같은 조건을 만족할 때, 해당 인터페이스는 함수형인터페이스의 조건에 충족한다고 할 수 있겠습니다.
위와같은 인터페이스가 있을때, 일반적으로는 인터페이스를 구현한 구현체를 직접 작성하여 해당 메서드를 호출할수도 있겠지만, 다음과 같은 람다식을 통해서 표현이 가능해집니다.
public static void main(String[] args){
Concat concatString=(m1, m2)-> m1+ m2;
System.out.println(concatString.process("하나","둘"));
}
해당 익명함수를 사용하게 되면 원하는 상황적 옵션에 따라서 결과값을 다르게 도출이 가능해집니다.
public static void main(String[] args){
Concat concatString=(m1, m2)-> m1+ m2;
System.out.println(concatString.process("하나","둘"));
Concat concatSplitString=(m1, m2)-> m1+ ","+ m2;
System.out.println(concatSplitString.process("하나","둘"));
}
위의 함수형 인터페이스를 메서드화시키면 다음과 같이 함수형 프로그래밍답게 코드를 구현 할 수 있습니다.
public static void main(String[] args){
concat("하나", "둘",(m1, m2)-> m1+ m2);
concat("하나", "둘",(m1, m2)-> m1+ ","+ m2);
}
public static void concat(String m1, string m2,Concat func){
System.out.println(concatString.process(m1,m2));
}
java.util.function
java에서는 람다식을 더 편하게 사용 할 수 있도록 위와같이 별도의 Functional Interface를 선언하지 않고 익명함수를 사용할수 있도록 java.util.function 내장 함수형 인터페이스를 제공하고 있습니다.
굉장히 많은데 어떤 interface가 있는지는 다음에..!
끝
'Program Language > java' 카테고리의 다른 글
| 객체지향 생활체조 8, 일급 컬렉션이란 (2) | 2023.11.23 |
|---|---|
| 프로젝트, 패키지, 메소드, 클래스 네이밍 규칙 (1) | 2023.10.21 |
| 객체지향을 위한 생활체조, 클린코드를 지향합니다. (0) | 2023.10.18 |
| 정확히 모르고 쓰면 사수한테 등짝 스매시 맞는 Thread, 당신도 모르는 사이 쓰고 있었다? (0) | 2023.10.17 |
| 인터페이스 네이밍은 어떻게 해야할까? (0) | 2023.10.10 |