티스토리 뷰

package Lambda;

// 1. 파라미터와 리턴타입이 없는 경우 (파라미터: X, 리턴타입: X)
@FunctionalInterface
interface MyFunc1 {
	// 함수형 인터페이스 어노테이션(@FunctionalInterface) 선언 시 에러 발생!
	// => 함수형 인터페이스는 반드시 하나의 추상메서드(abstract method)를 가져야함
	public void methodA();
//	public void methodB();
}

// 2. 파라미터가 있는 람다식 (파라미터: O, 리턴타입: X)
@FunctionalInterface
interface MyFunc2 {
	void methodB(String msg);
}

// 3. 리턴타입이 있는 람다식 (파라미터: O, 리턴타입: O)
@FunctionalInterface
interface MyFunc3 {
	String methodC(String msg);
}


public class Ex2 {

	// 1. 파라미터와 리턴타입이 없는 경우 (파라미터: X, 리턴타입: X)
	public static void useFIMethodA(MyFunc1 fi) {
		fi.methodA();
	}
	
	// 2. 파라미터가 있는 람다식 (파라미터: O, 리턴타입: X)
	public static void useFIMethodB(MyFunc2 fi) {
		fi.methodB("홍길동");
	}
	
	// 3. 리턴타입이 있는 람다식 (파라미터: O, 리턴타입: O)
	public static String useFIMethodC(MyFunc3 fi) {
		return fi.methodC("홍길동");
	}
	
	public static void main(String[] args) {
		
		useFIMethodA(new MyFunc1() {
			
			@Override
			public void methodA() {
				System.out.println("익명 내부클래스 형태");
			}
		});
		System.out.println("-------------------------------");
		
// 1. 파라미터와 리턴타입이 없는 경우 (파라미터: X, 리턴타입: X)
		System.out.println("(파라미터: X, 리턴타입: X)");
		
		// 표현방식1
		useFIMethodA(() -> {
			System.out.println("람다식2");
		});
		
		// 표현방식2
		useFIMethodA(() -> System.out.println("람다식1"));
		
		System.out.println("------------------------");
        
// 2. 파라미터가 있는 람다식 (파라미터: O, 리턴타입: X)
		System.out.println("(파라미터: O, 리턴타입: X)");
		
		// 표현방식1
		useFIMethodB((String msg) -> {
			System.out.println("람다식1 : " + msg);
		});
		
		// 표현방식2
		// 파라미터 갯수:1 , 실행문:1 --> 소괄호(), 중괄호{} 생략 가능!
		useFIMethodB(msg -> System.out.println("람다식2 : " + msg));
		
		System.out.println("------------------------");
        
// 3. 리턴타입이 있는 람다식 (파라미터: O, 리턴타입: O)
		System.out.println("(파라미터: O, 리턴타입: O)");
		
		// 표현방식1
		String result = useFIMethodC((String msg) -> { 
			return "람다식1 : " + msg;
		});
		System.out.println(result);
		
		// 표현방식2
		System.out.println(useFIMethodC(msg -> "람다식2 : " + msg));
		
	}
}

출력 결과

 

람다의 실행블록에서 변수 참조 (this)

람다식은 컴파일러에 의해 익명의 내부클래스로 처리되기 때문에 변수에 대한 참조 규칙이 동일하다.
- 외부클래스의 멤버를 자유롭게 사용할 수 있다.
- 자바8부터는 일반 로컬 변수도 사용할 수 있는데 final 키워드가 적용된 것처럼 새로운 값을 할당할 수는 없다!

하지만 this를 사용하는 방법이 약간 다르다.
- 람다식에서 this는 타켓인터페이스가 아닌 외부클래스를 나타낸다.
- 따라서, 람다식 내에서 this와 외부클래스.this는 동일한 객체를 나타낸다.

 

 

'배운 것 기록 > java' 카테고리의 다른 글

BigInteger, BigDecimal 클래스  (0) 2022.07.12
Formatting - SimpleDataFormat, DateTimeFormatter  (0) 2022.07.11
Thread  (0) 2022.06.28
StringBuilder / StringBuffer  (0) 2022.06.25
Generic  (0) 2022.06.22
댓글
최근에 올라온 글
«   2025/02   »
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
글 보관함