-
25. 람다식개발자 수업/Java 2021. 10. 19. 16:23
1. 프로그래밍 방법론
1) 절차식 프로그래밍
- 순차적인 명령을 수행하고 간단한 분기만 가능
2) 구조적 프로그래밍
- 특정 변수를 묶어 구조화하고 이를 통해 프로그래밍 효율 높임
3) 객체지향 프로그래밍
- 객체를 기반으로 프로그래밍 되며 클래스, 속성, 기능 등의 현실세계 모델을 반영함
4) 함수형 프로그래밍
- 객체의 형태를 벗어나 함수형을 확장해 함수를 변수처럼 사용 가능
2. 함수형 프로그래밍과 람다식(Lambda expression)
1) 자바는 OOP : 기능을 수행하기 위해 객체를 만들고 그 객체 내부에 멤버 변수를 선언해서 기능을 수행하는 메서드를 구현
2) 자바 8부터 함수형 프로그래밍 방식을 지원하고 이를 람다식이라 함
- 자바에서 람다식을 수용한 이유
- 코드가 매우 간결해짐
- 대용량 데이터를 필터링 또는 매핑해서 쉽게 집계할 수 있음
3) 함수의 구현과 호출만으로 프로그래밍이 수행되는 방식
4) 객체지향 프로그래밍보다 효율적인 경우
- 대용량 데이터 처리 시에 유리
- 데이터 포장 객체를 생성 후 처리하는 것보다, 데이터를 바로 처리하는 것이 속도에 유리함
- 멀티코어 CPU에서 데이터를 병렬 처리하고 취합할 때, 객체보다는 함수가 유리함
- 이벤트 지향 프로그래밍에 적합(이벤트가 발생하면 핸들러 함수 실행)
5) 현대적 프로그래밍 = 객체지향 프로그래밍 + 함수적 프로그래밍
6) 람다 계산법에서 사용된 식을 프로그래밍 언어에 접목
7) 익명 함수(anonymous function)를 생성하기 위한 식
8) 람다식 -> 매개변수를 가진 코드 블록 -> 익명 내부 객체
9) 함수를 기반으로 하는 프로그래밍이고 입력받는 자료 이외에 외부 자료를 사용하지 않아 여러 자료가 동시에 수행되는 병렬처리가 가능함
10) 함수형 프로그래밍은 함수의 기능이 자료에 독립적임을 보장함
동일한 자료에 대해 동일한 결과를 보장함
3. 람다식 문법
1) 익명 함수 만들기
2) (매개변수) -> {실행문;} <--- 매개변수와 매개변수를 이용한 실행문public interface Add { public int add(int x, int y); } /* * 함수적 스타일의 람다식 작성법 * (타입 매개변수, ...) -> {실행문; ...} * ex) (int a) -> {System.out.println(a);} * 약식표현 * 1) 매개 타입은 런타입 시에 대입 값에 따라 자동 인식되므로 생략 가능 * (a) -> {System.out.println(a);} * 2) 하나의 매개변수만 있을 경우에는 괄호() 생략 가능 * a -> {System.out.println(a);} * 3) 하나의 실행문만 있다면 중괄호{} 생략 가능 * a -> System.out.println(a); * 4) 매개변수가 없다면 괄호() 생략 불가 * 5) 리턴 값이 있는 경우에는 return문 사용 * 6) 중괄호{}에 return문만 있을 경우 return문 및 중괄호 생략 가능 */ public class AddTest { public static void main(String[] args) { Add addobj = (x, y) -> {return x+y;}; // 함수 구현 //Add addobj = (x, y) -> x+y; 약식표현 System.out.println(addobj.add(2, 3)); // add() 함수 호출 } }
4. 함수형 인터페이스 선언하기
1) 람다식을 선언하기 위한 인터페이스
2) 익명 함수와 매개 변수만으로 구현되므로 인터페이스는 단 하나의 메서드만을 선언해야 함
3) @FunctionalInterface 어노테이션@FunctionalInterface public interface MyInterface { void method(); // 추상메서드가 2개 이상이면 컴파일 예외 발생 } /* * 람다식 문법 * 구현부 * ----------------- * (타입 매개변수) -> {실행문; 실행문; ...}; * ----------- -- * 선언부 람다식연산자 */ public class LambdaTest { public static void main(String[] args) { /* * 람다식을 이용해서 익명내부객체를 생성함 * 매개변수가 없을 때는 () 생략 불가함 * {}는 추상메서드 method()의 구현부가 들어가야 함 * 구현부가 2줄이기 때문에 {} 생략할 수 없음 */ MyInterface myInterface = () -> { String str = "람다식으로 만든 익명내부객체입니다."; System.out.println(str); }; myInterface.method(); MyInterface myInterface2 = new MyInterface() { @Override public void method() { String str = "직접 만든 익명내부객체입니다."; System.out.println(str); } }; myInterface2.method(); myInterface = () -> { String str = "람다식으로 만든 익명내부객체2입니다."; }; myInterface.method(); // 실행문이 하나일 경우에는 {} 생략 가능 myInterface = () -> System.out.println("람다식으로 만든 익명내부객체3입니다."); myInterface.method(); // 소결론 : 익명내부객체를 생성 시 코드의 라인 절감을 목적으로 람다식을 사용 } }
@FunctionalInterface public interface MyInterface { void method(int x); // 매개변수 있음 } public class LambdaTest { public static void main(String[] args) { MyInterface myInterface = null; myInterface = (x) -> { int result = x * 10; System.out.println("매개변수 x 값을 가지고 람다식 구현한 메서드의 값 : " + result); }; // 500은 매개변수임 => 람다식의 매개변수인 x에 대입되어짐 myInterface.method(500); // 매개변수가 하나이기 때문에 () 생략 가능함 // 실행문이 하나이기 때문에 {} 생략 가능함 myInterface = x -> System.out.println("매개변수 x 값을 가지고 람다식 구현한 메서드의 값2 : " + (x * 10)); myInterface.method(600); } }
@FunctionalInterface public interface MyInterface { int method(int x, int y); // 2개의 매개변수와 리턴 값이 존재하는 추상 메서드 } public class LambdaTest { public static void main(String[] args) { MyInterface myInterface = null; myInterface = (x, y) -> { int result = x+y; return result; }; int result = myInterface.method(100, 200); System.out.println("매개변수 2개와 리턴 값 있는 람다식의 값 : " + result); myInterface = (x, y) -> {return x + y;}; result = myInterface.method(300, 200); System.out.println("매개변수 2개와 리턴 값 있는 람다식의 값2 : " + result); // return문 하나라면 생략 가능 myInterface = (x, y) -> x + y; result = myInterface.method(1000, 200); System.out.println("매개변수 2개와 리턴 값 있는 람다식의 값3 : " + result); // 메서드 호출 시 매개값으로 x, y 사용 myInterface = (x, y) -> add(x, y); result = myInterface.method(700, 200); System.out.println("add 메서드 호출 후 람다식의 값 : " + result); } public static int add(int x, int y) { return x + y; } }