JAV)0614 람다식 / 함수형 인터페이스

조한미르·2024년 6월 14일
0
  • 람다식

    람다식은 함수에 이름이 없는 익명 함수(anonymous function)를 만들기 위한 표현식입니다.

-> 자바는 객체를 기반으로 프로그램을 구현하는 객체 지향 프로그램입니다. 따라서 클래스를 먼저 생성하고, 클래스 안에 메서드와 객체를 만들어 사용해야합니다.

EX) 다음과 같은 메서드가 있습니다.

int add(int x, int y) {
	return x + y;
}

위 메서드는 단순히 더하기 기능을 지녔습니다. 우리가 익숙한 자바 문법이죠. 이코드를 람다식 문법으로 표현해 보겠습니다.

(x, y) -> {return x + y;}
  • 소괄호 생략하기
    - 람다식 문법에서는 매게면수 자료형을 생략할 수 있으며, 매개 변수가 한 개인 경우에는 소괄호도 생략할 수 있습니다. 그러나 매개변수가 두 개 이상일 경우에는 생략 할 수 없습니다.

    			(str) -> {System.out.print(str);} (매개변수가 하나 일 떄) -> str -> {System.out.println(str);} // 소괄호 생략 가능
          
          (x, y) -> {return x + y;} (매개변수가 두개 이상일 때) ->
          x, y -> {return x + y;} // 오류! 소괄호 생략 불가
         
  • 정리

     	매개변수가 1개인 경우, 매서드 파라메터 부분의 소괄호 생략가능
        매개변수가 1개 보다 많은경우는 생략 불가    
          
          
  • 중괄호 생략하기
    - 함수의 구현 내용이 한 문장이거나 return이 없다면, 즉 함수의 return타입이 void라면 구현부에 있는 중괄호도 생략할 수 있습니다. 만약 함수의 내용이 두 문장 이상이거나, return 타입이 있는 경우에는 생략 할 수 없습니다.

    (x, y) -> {System.out.println(x + y);} (return 값이 없는경우) -> (x, y) -> System.out.println(x + y); // 중괄호 생략 가능
    
     

    (x, y) -> {return x > y ? 1 : 0;} (return 값이 있는경우) -> (x, y) -> return x > y ? 1 : 0; // 오류! 중괄호 생략 불가능

     
  • 정리

     2. 메서드의 리턴타입이 void인 경우에, 구현코드가 한 줄인경우, 구현부의 {}중괄호를 생략가능
    
        메서드의 리턴타입이 void 이외는 생략 불가(but void 타입이 아니더라도 return문만 문장에 있는 경우, return을 생략하면 중괄호도 생략 가능하다.)
  • return 생략하기
    - 중괄호 안의 구현코드가 return문만 존재할 때는 중괄호의 return을 모두 생략할 수 있습니다.
    	(x, y) -> {return x > y ?1 : 0;} (return문만 있는 경우) -> (x, y) -> x > y ?1 : 0; // 중괄호와 return구문 생략
      
      
  • 함수형 인터페이스 선언
    - 함수형 인터페이스는 자바와 인터페이스를 이용해 선언합니다. 다만, 익명 함수로 구현하기 때문에 하나와 메서드만을 지나도록 선언합니다. ex)
      public interface CompareNumber {
          	int compareTo(int num01, int num02);
          }
public class CompareMaxMain02 {
	public static void main(String[] args){
    
    	int num01 = 40;
        int num02 = 30;
        
        //익명클래스 만들기
        CompareMax compareMax = (x, y) -> {return x > y ? 1: x < y ? -1 : 0;};
        
        int result = compareMax.max(num01, num02);
        
        if(result == 1){
        	System.out.println(num01 + "이" + num02 + "보다 크다");
        }else if(result == -1){
        	System.out.println(num01 + "이" + num02 + "보다 작다");
        }else {
        	System.out.println(num01 + "이" + num02 + "는 같다");
        }
    }
}
profile
꼭 해내는 사람

0개의 댓글