Jun's Blog

[Java] Lambda 간단한 예제 본문

High Java/Lambda

[Java] Lambda 간단한 예제

Fizzyelf 2020. 12. 1. 20:21
/**
 * 람다식 => 익명함수를 생성하기 위한 식
 * 			자바에서는 '매개변수를 가진 코드 블럭' => 런타임시 익명구현 객체로 생성된다.
 * 
 *   형식) 인터페이스명 객체변수명 = 람다식;
 *   
 *   람다식의 형식) (매개변수들...) -> {처리할 코드들;...}
 *   
 *   => 람다식으로 변환할 수 있는 인터페이스는 추상메서드가 1개인 인터페이스만 처리할 수 있다.
 *   	이런 인터페이스를 '함수적 인터페이스'라고 한다.
 *   	이 함수적 인터페이스를 만들 때는 @FunctionalInterface로 지정한다.
 */
public class T01_LambdaTest {
	public static void main(String[] args) {
		
		// 람다식을 사용하지 않는 경우
		Thread th1 = new Thread (
			new Runnable() {
				
				@Override
				public void run() {
					for(int i=0; i <=10; i++) {
						System.out.println(i);
					}
					
				}
			}
		);		
		th1.start();
		
		// 람다식을 사용하는 경우
		Thread th2 = new Thread(
			() -> {
				for(int i=0; i<=10; i++) {
					System.out.println("람다 -" + i);
				}
			}
				
		);
		th2.start();
	}
}
public class T02_LambdaTest {
	public static void main(String[] args) {
		
		// 람다식을 사용하지 않았을 경우
		LambdaTestInterface1 lam1 = new LambdaTestInterface1() {
			
			@Override
			public void test() {
				System.out.println("안녕하세요");
				System.out.println("익명구현 객체 방식입니다.");
			}
		};
		lam1.test(); // 메서드 호출
		
		LambdaTestInterface1 lam2 = () -> 
			System.out.println("반가워요\n람다식으로 처리하는 방식입니다.");
		
	
		lam2.test(); // 메서드 호출
		System.out.println("------------------------------------------------");
			
		/**
		 * 람다식 작성 방법
		 * 
		 * 기본형식) (자료형이 매개변수명, ...) -> {실행문들; ...}
		 * 1) 매개변수의 '자료형 이름'은 생략할 수 있다.
		 *  예) (int a) -> {System.out.println(a);}
		 *  	(a) -> {System.out.println(a);}
		 *  
		 * 2. 매개변수가 1개일 경우에는 괄호'()'를 생략할 수 있다
		 *  (단, '자로형이름'을 지정할 경우네는 괄호를 생략할 수 없다.
		 *  예) a-> {System.out.println(a);}
		 *  
		 * 3. "실행문"이 1개일 경우에는 '{ }'를 생략할 수 있다.
		 *   (이 때 문장의 끝을 나타내는 세미콜론(;)도 생략한다.)
		 *   예) a -> System.out.println(a)
		 *   
		 * 4) 매개변수가 하나도 없으면 괄호 '()'를 생략할 수 있다.
		 *  예) () -> System.out.println(a)
		 *  
		 * 5. 반환값이 있을 경우에는 return 명령을 사용한다.
		 * 
		 *  예) (a,b) -> {return a+b;}
		 * 		(a,b) -> return a + b;
		 * 
		 * 6. 실행문에 return 문만 있을 경우 return 명령과 '( )'생략할 수 있다
		 *  예) (a+b) -> a+b
		 *  
		 *  람다식을 쓰면 코드가 간결해지므로 좋다!
		 */
		
		LambdaTestInterface2 lam3 = (int z) -> {
	         int result = z + 100;
	         System.out.println("result : " + result);
	      };
	      lam3.test(30);

	      LambdaTestInterface2 lam4 = (int z) -> {
	         int result = z + 300;
	         System.out.println("result : " + result);
	      };
	      lam3.test(60);

	      LambdaTestInterface2 lam5 = z -> System.out.println("result : " + (z + 500));
	      lam5.test(90);
	      System.out.println("==========================================================================");

	      LambdaTestInterface3 lam6 = (int x, int y) -> {
	         int r = x + y;
	         return r;
	      };
	      
	      int k = lam6.test(20, 50);
	      LambdaTestInterface3 lam7 = (x, y) -> {
	         return x + y;
	      };
	      
	      k = lam7.test(80, 50);
	      System.out.println("k : " + k);
	      
	      LambdaTestInterface3 lam8 = (x, y) -> x + y;
	      k = lam8.test(100, 100);
	      System.out.println("k : " + k);
	      
	      LambdaTestInterface3 lam9 = (x, y) -> {
	         return x > y ? x : y;
	      };
	      k = lam9.test(100, 200);
	      System.out.println("k : " + k);
	   }
	}
public class T03_LambdaTest {
	static int stVar = 9;
	private String name = "홍길동";
	
	public void testMethod(final int temp) {
		final int localVar = 50;
		int kor = 100;
		
		/**
		 * 람다식 내부에서 사용되는 지역변수는 모두 final이어야 한다.
		 * 보통은 final을 붙이지 않으면 컴파일러가 자동으로 붙여준다.
		 * 단, 지역변수의 값을 변경하는 식이 있을 경우에는 자동으로 
		 * final을 붙여주지 않는다.
		 */
		
		// temp = 500;
		// localVar = 2000;
		// kor = 400;
		
		// 람다식에서 지역변수 사용하기
		LambdaTestInterface1 lt = 
			() -> {
				System.out.println("temp = " + temp);
				System.out.println("localVar = " + localVar);
				System.out.println("kor = " + kor);
				System.out.println("stVar = " + stVar);
				System.out.println("name = " + this.name);
			};
		lt.test(); // 실행
	}
	
	public static void main(String[] args) {
		new T03_LambdaTest().testMethod(200);
	}
}

<interface>

// 함수적 인터페이스 -> 추상 메서드가 1개만 선언된 인터페이스

@FunctionalInterface
public interface LambdaTestInterface1 {
	// 반환값이 없고 매개변수도 없는 추상메서드 선언
	public void test();
}

@FunctionalInterface
interface LambdaTestInterface2 {
	// 반환값이 없고 매개변수는 있는 추상메서드 선언
	public void test(int a);
}

@FunctionalInterface
interface LambdaTestInterface3 {
	// 반환값이 있고 매개변수도 있는 추상메서드 선언
	public int test(int a, int b);
}
Comments