지난번 간략하게 이해하고 넘어갔던 람다와 스트림을 집중해서 파고들어가보고자 한다.
람다는 일종의 표현 방식이다.
-> : 이렇게 생긴 표현식으로 특정 연산을 진행시키는 이름없는 함수(익명 함수)인데 이름이 없다는 건 우리가 따로 명명하지 않아도 잘 돌아가주는 메서드라는 의미다.
예를 들어서 우리가 특정 연산을 반복해주는 메서드가 필요하다. 그렇다면 맨 처음 할 일은 Java 클래스를 생성해야 한다. 클래스 안에 메서드를 정의해야 하니까!
이렇게 되면 클래스의 이름을 지어주고, 그 안에서 쓸 인수나 변수를 설정하고, 등등등 이름짓고 동작을 작성해야 한다.
그러나 람다식을 사용하면 이 과정들을 생략하고 한줄로 원하는 메서드를 작성할 수 있다.
int sum(int a, int b);
이렇게 작성해버린다. 이 sum()이라는 메서드는 구현되지 않았지만 선언은 되어있다. 이 한 줄이 하나의 추상 메서드라고 부를 수 있다.
int sum(int a, int b);
int sum(int a, int b, int c);
컴파일러는 sum()의 인수가 2개인 것, 3개인 것 중 어느 걸 호출하면 될지 몰라 오류가 나게 된다.
람다는 변수를 선언할 때, 매개변수를 전달할 때 등 조건을 만족한다면 객체로 유용하게 사용할 수 있다.
public enum OperatorType {
ADD('+', (num1, num2) -> num1 + num2),
MINUS('-', (num1, num2) -> num1 - num2),
MULTIPLY('*', (num1, num2) -> num1 * num2),
DIVIDE('/', (num1, num2) -> {
if (num2==0) throw new ArithmeticException("나눗셈 연산에서 분모(두 번째 정수)에 0이 입력될 수 없습니다.");
return num1 / num2;
});
...}
계산기 과제에서 람다식을 사용했던 부분을 발췌해왔다. 람다식을 쓴 부분이 객체처럼 사용되고 있다.
스트림은 문법 개념보다는 활용법이 중요해(자주 사용하게 될 예정이라) 중간연산, 최종연산에 잘 쓰이는 메서드를 정리하도록 하겠다.