티스토리 뷰
람다에서는 람다표현식 밖의 지역변수나 전역변수를 가져다 사용할 수 있다.
public class RamdaTest {
public static void main(String[] arg){
printHello(10);
}
public static void printHello(int count){
Runnable r = () -> {
for(int i=0; i<count; i++)
System.out.println("Hello");
}
new Thread(r).start();
}
}
위의 예에서는 printHello의 실행이 끝나고 나서도 Hello가 출력되는 액션이 수행될 수 있다.
그렇다면 람다 표현식 안의 count 변수는 무엇을 참조해서 사용하는 것일까
람다 표현식은 세가지로 구성되어 있다.
(count, text)<파라미터> -> {
for(int i=0; i<count; i++){
System.out.println(text);
}
}<코드블록> + <자유변수>
즉 파라미터, 코드블록, 자유변수 이렇게 세가지로 구성되어 있다.
맨 위의 예제에서는 람다 표현식이 int 타입의 count 자유변수를 사용하고있다.
이와 같은 경우 람다 표현식이 count를 캡쳐했다고 한다.
이렇게 자유변수를 이용하는 코드블록을 클로저(closer)라고 한다.
★ 캡쳐된 자유변수는 값을 변경할 수 없다. 람다표현식에서는 값이 변하지 않는 자유변수만
참조해야 한다. 왜냐하면 스레드에 안전하지 않기 때문이다. 여러 스레드가 동시에 값을 변경
하면 무슨 일이 일어나는지 알 수가 없다.
★ 어떤 코드블록과 그 안에 있는 람다 표현식의 변수명은 중첩될 수 없다.
ex)
public void compare(String str1, String str2){
BiFunction<String, String, int> bi = (str1, str2) -> Integer.compare(str1.length(),str2.length());
}
위의 예에서는 str1과 str2의 변수명이 중첩되므로 오류다.
★ 람다 표현식 안에서 this를 사용하게 되면 람다를 생성하는 메소드의 this를 참조하게 되므로
이를 조심할 수 있도록 한다
'JAVA' 카테고리의 다른 글
8. 정적 메소드 (0) | 2015.03.30 |
---|---|
7. default 메소드 (0) | 2015.03.30 |
5. 생성자 레퍼런스 (0) | 2015.03.29 |
4. 메소드 레퍼런스 (0) | 2015.03.29 |
3. 함수형 인터페이스 (0) | 2015.03.29 |
- Total
- Today
- Yesterday
- 클로저
- 컴퓨터 시간
- gitlab
- 시간
- Java8
- Java
- react
- 리액트
- opensource
- 퍼포먼스
- 코어
- json
- 자료구조
- 메모리
- Clojure
- 자바 성능
- Docker
- Swift 2.0
- 성능개선
- 자바
- Stream
- 성능
- 날짜
- 알람
- javascript
- Jackson
- 프로세서
- RAMDA
- rambda
- 람다
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |