티스토리 뷰

JAVA

6. 변수 유효범위

박중수 2015. 3. 29. 19:57

람다에서는 람다표현식 밖의 지역변수나 전역변수를 가져다 사용할 수 있다.


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
«   2025/04   »
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
글 보관함