티스토리 뷰
Goal
- 람다식의 정의와 함수형 프로그래밍에 대해 간단히 알아본다
- 람다식 사용방법에 대해 알아본다
- 기존방식과 람다식을 비교해본다
- 함수를 변수처럼 사용하는 람다식의 특징에 대해 알아본다
1. 람다식이란?
- 자바에서 함수형 프로그래밍(functional programming)을 구현하는 방식
- 클래스를 생성하지 않고 함수의 호출만으로 기능을 수행
- 함수형 인터페이스를 선언한뒤, 인터페이스의 메서드를 구현할 클래스에서 함수를 호출하여 사용한다.
- 자바 8부터 지원되는 기능
1-1 함수형 프로그래밍
- 순수함수(pure function)를 구현하고 호출하는 프로그래밍
* 순수함수 : 매개 변수만을 사용하도록 만든 함수로 외부 자료에 부수적인 영향(side effect)이 발생하지 않도록 함.
- 입력 받은 자료를 기반으로 수행되고 외부에 영향을 미치지 않으므로 병렬처리 가능, 안정적인 확장성 있는 프로그래밍 방식
2. 람다식 사용방법
1) 함수형 인터페이스 선언
package lambda;
@FunctionalInterface //메서드를 1개만 선언하도록 에너테이션 지정
public interface MyMaxNumber {
int getMaxNumber(int x, int y); //1)구현할 메서드 선언
// 함수형 인터페이스에는 메서드를 2개 이상선언할 수 없음.
/* 익명 함수를 사용하는 함수형 인터페이스의 특성상
* 매개변수의 숫자가 같을 경우, 어떤 함수를 처리해야 할 지 모르는 상황이 있기 때문에
* @FunctionalInterface를 사용하여 메서드를 1개만 선언하도록함.
*/
}
2) 인터페이스의 메서드 구현 및 호출
package lambda;
public class TestMyNumber {
public static void main(String[] args) {
//2)메서드 구현 및 호출
MyMaxNumber max = (x, y) -> (x >= y) ? x : y;
System.out.println(max.getMaxNumber(10, 20));
}
}
3. 기존방식과 람다식 비교
- 문자열을 연결하는 메서드를 만들어 사용하는 것을 일반적인 방식과 람다식을 통해 비교해본다.
3-1 일반적인 방식
- 인터페이스를 선언한 뒤, 인터페이스의 내용을 구현한 클래스를 만들고, 그 클래스를 사용할 메인 클래스가 필요하다.
1) 인터페이스에 선언
package lambda;
public interface StringConcat {
public void makeString(String s1, String s2);
}
2) 인터페이스를 implements하는 클래스 생성
package lambda;
public class StringConImpl implements StringConcat {
@Override
public void makeString(String s1, String s2) {
System.out.println(s1 + "," + s2);
}
}
3) 구현된 메서드를 사용하기 위한 메인 클래스
package lambda;
public class TestStringConcat {
public static void main(String[] args) {
//객체지향에서 메서드 사용방식
StringConImpl impl = new StringConImpl();
impl.makeString("hello", "world");
}
3-2 람다식
1) 함수형 인터페이스 선언
package lambda;
@FunctionalInterface
public interface StringConcat {
public void makeString(String s1, String s2);
}
2) 메인 클래스에서 함수를 호출하여 사용
package lambda;
public class TestStringConcat {
public static void main(String[] args) {
//람다를 이용한 메서드 사용
StringConcat concat = (s, v) -> System.out.println(s + "," + v);
concat.makeString("hello", "world");
//람다식 구현 원리
//내부적으로 익명 내부 클래스를 구현함
StringConcat concat2 = new StringConcat() {
@Override
public void makeString(String s1, String s2) {
System.out.println(s1 + "," + s2);
}
};
concat2.makeString("hello", "world");
}
}
4. 함수를 변수처럼 사용하는 람다식
- 프로그램에서 변수는 다음과 같이 선언하여 사용한다.
int number = 10; // 자료형에 기반하여 선언하고
int numberGet(int n1, int n2); // 매개변수로 전달하고
return number; // 메서드의 반환 값으로 사용
- 람다식도 프로그램내에서 변수처럼 선언하며, 매개변수나, 메서드의 반환 값으로 사용가능하다.
4-1 변수에 대입
- 람다식의 문법을 살펴보면, 메서드의 선언 내용이 변수에 대입되는 것을 알 수 있다.
package lambda;
//함수형 인터페이스 선언
@FunctionalInterface
interface PrintString {
void showString(String str);
}
public class TestLambda {
public static void main(String[] args) {
//함수의 구현부가 lambdaStr라는 변수에 대입됨.
PrintString lambdaStr = s -> System.out.println(s);
lambdaStr.showString("Test"); //변수를 통해 구현한 메서드 실행
}
}
4-2 매개변수로 사용
- 사용변수의 이름이 매개변수로 넘어갈 수 있음
package lambda;
@FunctionalInterface
interface PrintString {
void showString(String str);
}
public class TestLambda {
public static void main(String[] args) {
PrintString lambdaStr = s -> System.out.println(s);
lambdaStr.showString("Test");
showMyString(lambdaStr); //변수처럼 람다식 대입
}
//함수의 구현부를 매개변수로 사용.
public static void showMyString(PrintString p) {
p.showString("Test2");
}
}
4-3 반환값으로 사용
package lambda;
@FunctionalInterface
interface PrintString {
void showString(String str);
}
public class TestLambda {
public static void main(String[] args) {
PrintString lambdaStr = s -> System.out.println(s);
lambdaStr.showString("Test");
//returnString() 메서드를 활용하여 람다식구현
PrintString test = returnString();
test.showString("Test3");
}
//함수의 구현부가 변수처럼 return됨.
public static PrintString returnString() {
return s -> System.out.println(s + "!!!");
}
}
'Java > Java 올인원 패키지' 카테고리의 다른 글
30. 예외 처리 (Java) (0) | 2020.03.24 |
---|---|
29. 스트림 (Java) (0) | 2020.03.23 |
27. 내부 클래스 (Java) (0) | 2020.03.21 |
25. Set 인터페이스 (Java) (0) | 2020.03.19 |
24. List 인터페이스 (Java) (0) | 2020.03.19 |
- 20200804
- 20200424
- 20200417
- 20201204
- chapter7
- 20200415
- 20200413
- 20200624
- 20200510
- 20200504
- 20200503
- 20200421
- 20200330
- 20200502
- 생활코딩리눅스
- 20200319
- 20200512
- chapter8
- 20200427
- 20200423
- 백준
- 20200425
- 20200622
- 20200406
- likelion
- 20200317
- 20200428
- 20200429
- 20200403
- 20200420
- Total
- Today
- Yesterday