Super Coding Addict
Ch12. 람다식 (1) 본문
* 람다식
- 자바8부터 지원
- 자바에서 함수형 프로그래밍을 구현하는 방식
- 클래스 생성X, 함수의 호출만으로 기능 수행
* 함수형 프로그래밍
- 순수 함수를 구현, 호출 --> 외부변수 사용X
==> 매개변수만을 사용, 따라서 외부 자료에 부수적 영향(side effect) 발생X
==> 외부에 영향 미치지 않으므로 병렬처리등 가능, 안정적인 확장성 있는 프로그램 방식
* 람다식 문법
- 매개변수가 1개인 경우 괄호 생략 가능 (두 개인 경우 생략불가)
str -> {System.out.println(str);}
- 중괄호 안의 구현부 한 문장입면 중괄호 생략가능
str -> System.out.println(str);
- 중괄호 안의 구현부가 한 문장이더라도 return문이면 중괄호 생략불가
str -> return str.length(); //오류!!
- 중괄호 안의 구현부가 반환문 하나라면 return과 중괄호 모두 생략 가능
(x, y) -> x + y //두 값 더하여 반환
str -> str.length() // 문자열 길이 반환
* 예제1
# MyMaxNumber 인터페이스
package ch12.lambda;
@FunctionalInterface //함수형 인터페이스는 메서드 2개 이상 선언X
public interface MyMaxNumber {
int getMaxNumber(int x, int y);
//void add(int x, int y); //익명함수이기 때문에 어떤 것인지 알 수 없다
}
--> @FunctionalInterface : 함수형 인터페이스임을 나타내는 어노테이션
--> 함수형 인터페이스에는 메서드를 1개만 선언할 수 있는데, 이는 람다식이 익명함수를 구현하기 때문에 매개변수를 2개인 메서드가 2개 있다면 어떤 메서드인지 알 수 없기 때문이다
# TestMyNumber 클래스
package ch12.lambda;
public class TestMyNumber {
public static void main(String[] args) {
MyMaxNumber max = (x, y)-> (x >= y) ? x : y;
System.out.println(max.getMaxNumber(10, 20));
}
}
//실행 결과 : 20
--> MyMaxNumber 인터페이스에서 선언한 getMaxNumber함수를 오버라이딩하지만, 람다식은 익명함수로 이를 처리한다.
* 예제2
- 예제1에서도 사실 객체가 내부적으로 생성되지만 보이지 않을 뿐이기에, 람다식이 구현되는 원리를 좀 더 풀어서 보여주기
# StringConcat 인터페이스
package ch12.lambda;
@FunctionalInterface
public interface StringConcat {
public void makeString(String s1, String s2);
}
# StringConcat 클래스 - 상속한 StringConcat클래스의 추상메서드인 makeString 오버라이딩
package ch12.lambda;
public class StringConImpl implements StringConcat{
@Override
public void makeString(String s1, String s2) {
System.out.println(s1 + "," + s2);
}
}
# TestStringConcat 클래스 (메인)
package ch12.lambda;
public class TestStringConcat {
public static void main(String[] args) {
StringConImpl impl = new StringConImpl();
impl.makeString("hello", "world");
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", "newWorld");
}
}
--> 인터페이스를 구현한 StringConImpl 객체를 생성한 뒤 메서드를 호출
--> 인터페이스인 StringConcat 객체를 생성하면서 그 안에서 메서드 오버라이딩을 한 뒤 메서드를 호출 할 수 있다
'JAVA 문법' 카테고리의 다른 글
Ch12. 스트림 (1) (0) | 2021.02.06 |
---|---|
Ch12. 람다식 (2) (0) | 2021.02.06 |
Ch07. 상속과 다형성 (1) (0) | 2021.01.22 |
Ch06. 배열(2) (0) | 2021.01.20 |
Ch06. 배열(1) (0) | 2021.01.19 |