일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- java final 키워드
- java_this
- java반복문
- 화살표연산자
- javatime
- ai활용법
- java 추상 클래스
- 자바스크립트
- import 키워드
- java 제네릭
- javascript
- 오블완
- java 패키지
- java objact클래스
- java
- 창의적도구
- java스터디
- 티스토리챌린지
- asyncawait
- binraytree
- java 애노테이션
- gpt활용팁
- java super메소드
- js메서드
- 생성형AI
- java 메서드 오버라이딩
- javautil패키지
- JAVA데이터타입
- this키워드
- java 이진트리
- Today
- Total
코딩쿠의 코드 연대기
Java 람다식 본문
학습목표
- 람다식 사용법
- 함수형 인터페이스
- Variable Capture
- 메서드, 생성자 레퍼런스
람다식 사용법
Java 람다식은 Java 8부터 도입된 기능으로, 익명 함수를 간결하게 표현하는 방법입니다. 람다식을 사용하면 코드를 더욱 간결하고 읽기 쉽게 작성할 수 있으며, 함수형 프로그래밍 기법을 Java에서도 활용할 수 있게 됩니다.
람다식의 기본 구조
람다식은 다음과 같은 기본 구조를 가집니다.
Java
(매개변수) -> { 실행문; }
- 매개변수: 람다식에 전달되는 값을 나타냅니다. 괄호는 매개변수가 없거나 여러 개일 때 사용합니다.
- 화살표 (->): 매개변수와 실행문을 구분하는 기호입니다.
- 실행문: 람다식이 실행할 코드를 나타냅니다. 중괄호는 실행문이 여러 개일 때 사용합니다.
람다식 사용 예시
다음은 람다식을 사용하여 두 수를 더하는 간단한 예시입니다.
Java
// 함수형 인터페이스 정의
interface MyFunction {
int add(int a, int b);
}
public class LambdaExample {
public static void main(String[] args) {
// 람다식을 사용하여 MyFunction 인터페이스 구현
MyFunction adder = (a, b) -> a + b;
// 람다식 실행
int result = adder.add(5, 3);
System.out.println(result); // 출력: 8
}
}
람다식의 장점
- 간결성: 익명 클래스에 비해 코드가 훨씬 간결해집니다.
- 가독성: 코드의 의도를 명확하게 표현할 수 있습니다.
- 유연성: 변수에 저장하거나 메서드의 인자로 전달할 수 있습니다.
- 함수형 프로그래밍: 함수형 인터페이스와 함께 사용하여 함수형 프로그래밍 기법을 활용할 수 있습니다.
람다식 사용 시 주의 사항
- 람다식은 함수형 인터페이스에서만 사용할 수 있습니다. 함수형 인터페이스는 하나의 추상 메서드만 가지는 인터페이스입니다.
- 람다식의 실행문이 하나일 경우 중괄호를 생략할 수 있습니다.
- 람다식의 실행문이 return 문으로만 구성된 경우에도 중괄호를 생략할 수 없습니다.
참고 자료
- [JAVA] 람다식(Lambda)의 개념 및 사용법: https://khj93.tistory.com/entry/JAVA-%EB%9E%8C%EB%8B%A4%EC%8B%9DRambda%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B4%E1A%B3%A0-%EC%82%AC%EC%9A%A9%EB%B2%95
- [JAVA] 람다식(Lambda Expression)과 함수형 인터페이스(Funtional Interface): https://dd-developer.tistory.com/96
함수형 인터페이스
Java 함수형 인터페이스란?
Java 함수형 인터페이스는 단 하나의 추상 메서드만 선언된 인터페이스를 말합니다. Java 8에서 도입되었으며, 람다식을 통해 간결하고 직관적인 구현을 가능하게 합니다.
함수형 인터페이스의 특징
- 단 하나의 추상 메서드:
함수형 인터페이스는 반드시 단 하나의 추상 메서드만 포함해야 합니다. 이를 통해 람다식으로 구현할 수 있습니다. - @FunctionalInterface 어노테이션:
@FunctionalInterface
어노테이션을 사용하면 함수형 인터페이스임을 명시할 수 있습니다. 이 어노테이션은 컴파일 시 인터페이스가 함수형 인터페이스 조건을 충족하는지 검증합니다. - 람다식으로 구현 가능:
함수형 인터페이스의 추상 메서드는 람다식을 사용해 간단하게 구현할 수 있습니다. - default 메서드와 static 메서드:
하나의 추상 메서드 외에도 여러 개의default
메서드와static
메서드를 가질 수 있습니다.
함수형 인터페이스의 장점
- 코드 간결성:
람다식을 통해 코드를 단순화하고 중복을 줄일 수 있습니다. - 가독성 향상:
람다식은 의도를 명확히 드러내므로 코드의 이해도를 높입니다. - 재사용성 증가:
함수형 인터페이스는 변수에 저장하거나 메서드 매개변수로 전달할 수 있어 재사용성이 뛰어납니다. - 함수형 프로그래밍 지원:
Java에서도 함수형 프로그래밍의 기법을 활용할 수 있습니다.
함수형 인터페이스 예시
@FunctionalInterface
interface MyFunction {
int add(int a, int b);
}
위 예제에서 MyFunction
은 하나의 추상 메서드 add
를 가진 함수형 인터페이스입니다.@FunctionalInterface
어노테이션을 통해 명시적으로 함수형 인터페이스임을 나타냅니다.
java.util.function 패키지의 주요 함수형 인터페이스
Java는 java.util.function
패키지에서 다음과 같은 다양한 함수형 인터페이스를 제공합니다.
- Consumer:
입력값을 받아 소비하고, 결과를 반환하지 않습니다. - Supplier:
입력값 없이 결과를 반환합니다. - Function <T, R>:
입력값을 받아 처리한 후 결과를 반환합니다. - Predicate:
입력값을 평가한 결과를 boolean으로 반환합니다.
함수형 인터페이스 활용
함수형 인터페이스는 다음과 같은 방식으로 사용됩니다.
- 람다식과 함께 코드 간결화:
함수형 인터페이스의 메서드를 람다식으로 구현하여 복잡한 코드를 단순화할 수 있습니다. - Stream API와의 통합:
컬렉션 프레임워크의 Stream API와 함께 활용하여 데이터 처리를 효율적으로 수행할 수 있습니다.
Variable Capture
Java에서 Variable Capture란?
Variable Capture는 람다식, 로컬 클래스, 익명 클래스가 자신을 둘러싼 범위의 지역 변수에 접근하는 기능을 의미합니다.
Variable Capture가 필요한 이유
람다식은 익명 함수로, 자신의 외부에 선언된 변수에 접근하려면 특별한 메커니즘이 필요합니다. Variable Capture는 이 역할을 수행하며, 람다식이 외부 변수의 값을 가져와 사용할 수 있게 합니다.
캡처되는 변수의 조건
Java에서 람다식이 지역 변수를 캡처할 수 있는 조건은 다음과 같습니다.
- effectively final:
람다식은 한 번 초기화된 후 값이 변경되지 않는 effectively final 변수만 캡처할 수 있습니다.- effectively final 변수란, 명시적으로
final
로 선언되지 않았더라도 변경되지 않는 변수를 뜻합니다.
- effectively final 변수란, 명시적으로
Variable Capture의 동작 방식
람다식이 외부의 지역 변수를 캡처하면, 컴파일러는 해당 변수를 람다식 내부에서 사용 가능하도록 복사본으로 저장합니다.
- 복사본에 접근: 람다식은 실제 변수 대신 복사본에 접근합니다.
- 스택 안정성: 원래 변수가 스택에서 사라지더라도 람다식은 캡처된 값을 유지할 수 있습니다.
Variable Capture 예시
int num = 10;
// 람다식에서 num 변수 캡처
Runnable r = () -> System.out.println(num);
// num 값을 변경하려고 하면 컴파일 에러 발생
// num = 20;
r.run(); // 출력: 10
위 코드에서 num
은 effectively final 변수이기 때문에 람다식에서 캡처할 수 있습니다. 만약 num = 20;
처럼 변수의 값을 변경하려고 하면 컴파일 에러가 발생합니다.
캡처된 변수의 제약
- 읽기 전용:
람다식 내부에서는 캡처된 변수의 값을 변경할 수 없습니다. - 인스턴스 변수와 static 변수는 자유롭게 사용 가능:
람다식은 인스턴스 변수와 static 변수에 제한 없이 접근할 수 있으므로 Variable Capture의 조건에 해당하지 않습니다.
Variable Capture의 장점
- 유연성:
람다식 내부에서 외부 변수에 접근 가능하여 더 다양한 구현이 가능합니다. - 코드 간결화:
외부 변수 접근을 통해 불필요한 코드 반복을 줄이고 간결하게 작성할 수 있습니다.
메서드, 생성자 레퍼런스
Java 람다식에서 메서드 레퍼런스와 생성자 레퍼런스는 기존 메서드 또는 생성자를 재사용하여 람다식을 더욱 간결하게 표현하는 방법입니다. 람다식이 단순히 특정 메서드를 호출하거나 객체를 생성하는 경우, 메서드/생성자 레퍼런스를 사용하면 코드를 더욱 짧고 읽기 쉽게 만들 수 있습니다.
1. 메소드 레퍼런스
메소드메서드 레퍼런스는 기존 메서드를 참조하여 람다식을 표현하는 방법입니다. 람다식이 단순히 특정 메서드를 호출하는 경우, 메서드 레퍼런스를 사용하여 람다식을 더 간결하게 표현할 수 있습니다.
구문:
클래스이름::메소드이름
객체::메소드이름
예시:
Java
// 1. 정적 메소드 레퍼런스
class Calculator {
public static int add(int a, int b) {
return a + b;
}
}
BiFunction<Integer, Integer, Integer> adder = Calculator::add;
int result = adder.apply(5, 3); // 결과: 8
// 2. 인스턴스 메소드 레퍼런스
class StringHelper {
public int getLength(String str) {
return str.length();
}
}
StringHelper helper = new StringHelper();
Function<String, Integer> lengthGetter = helper::getLength;
int length = lengthGetter.apply("Hello"); // 결과: 5
// 3. 특정 객체의 인스턴스 메소드 레퍼런스
String str = "Hello";
Function<Integer, String> substringGetter = str::substring;
String sub = substringGetter.apply(1); // 결과: "ello"
2. 생성자 레퍼런스
생성자 레퍼런스는 기존 생성자를 참조하여 람다식을 표현하는 방법입니다. 람다식이 단순히 객체를 생성하는 경우, 생성자 레퍼런스를 사용하여 람다식을 더 간결하게 표현할 수 있습니다.
구문:
클래스이름::new
예시:
Java
class Member {
private String name;
public Member(String name) {
this.name = name;
}
}
Supplier<Member> memberSupplier = Member::new;
Member member = memberSupplier.get(); // 새로운 Member 객체 생성
Function<String, Member> memberFunction = Member::new;
Member member2 = memberFunction.apply("John"); // "John" 이름을 가진 Member 객체 생성
메소드/생성자 레퍼런스 사용 시 주의 사항
- 메서드/생성자 레퍼런스는 함수형 인터페이스의 추상 메서드와 시그니처가 일치해야 합니다.
- 메소드/생성자메서드/생성자 레퍼런스는 람다식보다 더 간결하게 코드를 표현할 수 있지만, 모든 람다식을 메서드/생성자 레퍼런스로 대체할 수 있는 것은 아닙니다.
참고 자료
- [Java] 람다식에서 메서드 참조/생성자 참조 사용법 - 몽구의 우당탕탕 개발 공부: https://mong9data.tistory.com/130
- 람다식을 더 짧게 - 메소드::참조 문법 - Inpa Dev : https://inpa.tistory.com/entry/JAVA8-%E2%98%95-%EB%9E%8C%EB%8B%A4%EC%8B%9D%EC%9D%84-%EB%8D%94-%EC%A7%A7%EA%B2%8C-%EB%A9%94%EC%86%8C%EB%93%9C-%EC%B0%B8%EC%A1%B0Method-Reference
- 람다식 - 메서드 참조(생성자의 메서드 참조 예시 포함) - Coding Planet: https://sharonprogress.tistory.com/331
- 람다와 스트림 - 메서드 참조(method reference) - 컴퓨터 공부하는 블로그: https://sgcomputer.tistory.com/306
'코딩스터디 > JAVA스터디' 카테고리의 다른 글
Java) javaUtil 패키지 (0) | 2024.11.23 |
---|---|
Java) 기본 API클래스 (0) | 2024.11.22 |
Java 제네릭 (1) | 2024.11.20 |
Java) I/O (0) | 2024.11.19 |
Java 애노테이션 (3) | 2024.11.18 |