대용량 데이터를 처리해야 하는 경우 객체를 만드는 시간이 걸리기 때문에 객체 지향 프로그래밍 기법 보다는 함수적 프로그래밍 기법을 사용한다.
따라서, 현대적 프로그래밍은 객체 지향 프로그래밍 + 함수적 프로그래밍이라 할 수 있다.
Java는 Java 8부터 람다식(Lambda Expression)을 지원하기 시작했다. 람다식은 함수적 프로그래밍 기법이라고 할 수 있으며, 익명 함수(anonymous function)을 생성하는 식이다.
위의 y = f(x) 라는 함수가 람다식에선 (타입 매개변수,...) → { 실행문; ... } 형식으로 바뀌는데 f(x)의 x가 타입 매개변수가 되고, y가 실행문이 된다고 생각하면 된다.
다음은 람다식의 장점과 단점을 나타낸다.
람다식은 함수적 인터페이스인 경우에만 사용이 가능하다.
인터페이스를 구현하는 방식은 여러가지가 있다.
하나씩 예제를 살펴보자.
MaxNumber라는 interface가 있다. 그리고 getMaxNumber(int x, int y) 라는 메소드를 정의해놓았다.
//MaxNumber Interface
public interface MaxNumber {
int getMaxNumber(int x, int y);
}
//MaxNumber Interface 구현 클래스
public class MaxNumberImpl implements MaxNumber {
@Override
public int getMaxNumber(int x, int y) {
return x >= y ? x : y;
}
}
MaxNumber 인터페이스를 MaxNumberImpl이라는 클래스로 구현한 후 Main 클래스에서 MaxNumber를 생성한 후 getMaxNumber 메소드를 호출해준다.
public class Main {
public static void main(String[] args) {
//1. 인터페이스를 직접 클래스로 구현 후 메인 메소드에서 생성 후 호출
MaxNumber maxNumber = new MaxNumberImpl();
System.out.println(maxNumber.getMaxNumber(3,1));
}
}
//출력 결과 : 3
호출 결과 3과 1중 큰 수인 3이 출력 됨을 확인 할 수 있다.
public class Main {
public static void main(String[] args) {
//2. 익명함수로 메인 클래스 내에서 구현하여 호출
MaxNumber maxNumber = new MaxNumber() {
@Override
public int getMaxNumber(int x, int y) {
return x >= y ? x : y;
}
};
System.out.println(maxNumber.getMaxNumber(3,1));
}
}
MaxNumber Interface를 직접 메인 메소드 내에서 구현하여 호출한 방식이다.
똑같이 출력 결과가 3임을 알 수 있다.
public class Main {
public static void main(String[] args) {
//3. 람다식을 이용하여 호출 방식
MaxNumber maxNumber = (x, y) -> x >= y ? x : y;
System.out.println(maxNumber.getMaxNumber(3,1));
}
}
MaxNumber Interface를 람다식으로 호출하고 메소드를 람다식 내 코드블록에서 구현해주었다.
똑같이 출력 결과가 3임을 알 수 있다.
3가지 방식을 알아보았다. 당장 3가지 코드를 비교해보아도 1번과 2번의 방식보다는 3번 람다식으로 표현한 방식이 더 코드가 간결하고 효율적임을 알 수 있다.
MaxNumber maxNumber = (str) → {System.out.println(str);};
MaxNumber maxNumber = str → {System.out.println(str);};
MaxNumber maxNumber = (str) → System.out.println(str);
MaxNumber maxNumber = (str) → { return String.valueOf(str);};
MaxNumber maxNumber = (str) → String.valueOf(str);
MaxNumber maxNumber = () → System.out.println("매개변수 없음");