본문 바로가기
Programming/JAVA(eclipse)

java 10 일차 _ 04. 람다식

by yoon9i 2024. 3. 21.

3. 람다표현식 ( lambda expression )
1) 용도: 익명클래스의 축소된 표현식이다.
2) 등장배경: '기능에만 집중하자' 
    ==> 함수명 프로그래밍(functional programming)

Flyer f = new Flyer( ) {
   @Override
   public void fly( ) {
         // 기능
   }
};
f.fly( );

3) 메서드가 4가지 형식이기 때문에 람다표현식도 4가지 표현식이 가능.
가. 파라미터 x 리턴값 x
나. 파라미터 o 리턴값 x
다. 파라미터 x 리턴값 o
라. 파라미터 o 리턴값 o

4) 단일책임원칙 개발방법론
- 객체하나당 메서드하나
==> 개념은 하나의 객체에 하나의 기능만 추가해서 명확한 책임을 부여하자.
==> 람다표현식에서 사용하는 인터페이스가 가진 메서드는 반드시 1개만
        가능.

/==> 추상메서드가 반드시 1개만 지정하도록 강제
@FunctionalInterface 
public interface Flyer {
    public abstract void fly( );
}

 

[ 파라미터가 없고 리턴값이 없는 경우]

package exam18_lambda;

@FunctionalInterface // 메서드가 2개가 오면 에러발생하도록 강제
interface Flyer {
	// 파라미터없고 리턴값 없는 추상메서드인 경우
	public abstract void fly();
//	public abstract void fly2();
}

public class TestMain1_파라미터없고리턴값없는경우 {

	public static void main(String[] args) {

		// 1. 익명클래스
		Flyer f = new Flyer() {
			@Override
			public void fly() {
				System.out.println("1. 익명클래스.fly() 호출");
			}
		};
		f.fly();
		
		// 2. 람다표현식: java: -> , java script: =>
		Flyer f2 = ()-> { System.out.println("2. 람다표현식.fly() 호출"); };
		f2.fly();
		
		// 실행문이 1개인 경우 {} 생략가능
		Flyer f3 = ()-> System.out.println("2. 람다표현식.fly() 호출");
		f3.fly();

	}

}

 

[ 파라미터 있고 리턴값 없는 경우]

package exam18_lambda;

@FunctionalInterface // 메서드가 2개가 오면 에러발생하도록 강제
interface Flyer2 {
	// 파라미터있고 리턴값 없는 추상메서드인 경우
	public abstract void fly(int n);
}

@FunctionalInterface 
interface Flyer3 {
	// 파라미터없고 리턴값 없는 추상메서드인 경우
	public abstract void fly(int n, String n2); // 파라미터 2개
}

public class TestMain2_파라미터있고리턴값없는경우 {

	public static void main(String[] args) {
		
		// 파라미터 1개 ##############################################
		System.out.println("파라미터 1개");
		// 1. 익명클래스
		Flyer2 f = new Flyer2() {
			
			@Override
			public void fly(int n) {
				System.out.println("1. 익명클래스.fly(): " + n);
			}
		};
		f.fly(10);
		
		// 2. 람다표현식
		Flyer2 f2 = (int n) -> { System.out.println("2. 람다표현식.fly(): " + n); };
		f2.fly(10);
		
		// 축약: 파라미터 변수의 타입 생략가능, 실행문이 한개인 경우 {} 생략가능
		Flyer2 f3 = (n)->System.out.println("2-1. 람다표현식.fly(): " + n);
		f3.fly(10);
		
		// 축약: 파라미터 변수가 한개인 경우는 () 생략가능 ==> 파라미터 변수가 두개 이상인 경우에는 () 생략 불가
		Flyer2 f4 = n->System.out.println("2-2. 람다표현식.fly(): " + n);
		f4.fly(10);
		
		// ############################################################
		System.out.println();
		// 파라미터 2개 ##################################################
		System.out.println("파라미터 2개");
		
		// 1. 익명클래스
		Flyer3 x = new Flyer3() {
			
			@Override
			public void fly(int n, String n2) {
				System.out.println("1. 익명클래스.fly(): " + n + "\t" + n2);
			}
		};
		x.fly(100, "hello");
		
		// 2. 람다표현식
		Flyer3 x2 = (int n, String n2) -> {
			System.out.println("2. 람다표현식.fly(): " + n + "\t" + n2);
		};
		x2.fly(100, "hello");
		
		// 축약: 파라미터 변수의 타입 생략가, 실행문이 한개인 경우 {} 생략가능
		Flyer3 x3 = (n, n2) -> System.out.println("2-1. 람다표현식.fly(): " + n + "\t" + n2);
		x3.fly(100, "hello");
		
		
		
	}// end main

}// end class

 

[ 파라미터 없고 리턴값 있는 경우 ]

package exam18_lambda;

@FunctionalInterface // 메서드가 2개가 오면 에러발생하도록 강제
interface Flyer4 {
	// 파라미터없고 리턴값 있는 추상메서드인 경우
	public abstract int fly();
}

public class TestMain3_파라미터없고리턴값있는경우 {

	public static void main(String[] args) {
		
		// 1. 익명클래스
		Flyer4 f = new Flyer4() {			
			@Override
			public int fly() {
				return 100;
			}
		};
		int result = f.fly();
		System.out.println("1. 익명클래스. 결과값: " + result);
		
		// 2. 람다 표현식
		Flyer4 f2 = () -> { return 100; };
		int result2 = f2.fly();
		System.out.println("2. 람다표현식. 결과값: " + result2);
		
		// 축약: return 문장만 있는 경우에는 {} 와 return 키워드 생략가능
		Flyer4 f3 = () -> 100;
		int result3 = f3.fly();
		System.out.println("2-1. 람다표현식. 결과값: " + result3);
		
		
	}// end main

}// end class

 

[ 파라미터 있고 리턴값 있는 경우 ]

package exam18_lambda;

@FunctionalInterface // 메서드가 2개가 오면 에러발생하도록 강제
interface Flyer5 {
	// 파라미터있고 리턴값 있는 추상메서드인 경우
	public abstract int fly(int n, int n2);
}

public class TestMain4_파라미터있고리턴값있는경우 {

	public static void main(String[] args) {
		
		// 1. 익명클래스
		Flyer5 f = new Flyer5() {
			@Override
			public int fly(int n, int n2) {
				return n+n2;
			}
		};
		int result = f.fly(10, 20);
		System.out.println("1. 익명클래스 결과값: " + result);
		
		// 2. 람다 표현식
		Flyer5 f2 = (int n, int n2) -> { return n + n2; };
		int result2 = f.fly(10, 20);
		System.out.println("2. 람다표현식 결과값: " + result2);
		
		// 축약
		Flyer5 f3 = (n, n2) -> { return n + n2; };
		int result3 = f.fly(10, 20);
		System.out.println("2-1. 람다표현식 결과값: " + result3);
		
		// 축약
		Flyer5 f4 = (n, n2) -> n + n2;
		int result4 = f.fly(10, 20);
		System.out.println("2-2. 람다표현식 결과값: " + result4);
		
		
	}// end main

}// end class

 

* 정리순서
1. 인터페이스 정리
2. 익명클래스 정리

/// ↓ 함수형프로그래밍 ///
3. 람다표현식 정리
4. 함수형 인터페이스
    ==> 실습에서 만든 파라미터 ( o | x ) 리턴값 ( o | x ) 형식의
           추상메서드를 가진 인터페이스를 API 제공된다.
    ex) Function, Consumer, Predicate, Operator, Supplier,... 인터페이스
5. 컬렉션의 스트림 문법