JAVA 기초 (40) 람다식

코린이서현이·2023년 9월 6일
0

Java

목록 보기
42/46

🤔들어가면서🤔

자바는 객체를 기반으로 프로그램을 만들기 때문에 어떤 기능이 필요하다면, 
클래스를 만들고 그 클래스 내부에 기능을 구현한 메서드를 만들어서 사용해야한다.

그러나 자바에서도 "함수형 프로그래밍"을 "람다식"을 통해서 지원한다.

📕 람다식

객체 지향 프로그래밍 언어인 자바에서 함수형 프로그래밍을 구현한 것이다.
람다식의 문법은 다음과 같다.

(매개변수) -> {실행문;}

🤔 자바에서는 참조 변수 없이 메서드를 호출 할 수 없다.
👉 함수형 인터페이스의 참조 변수를 사용해서 람다식을 구현하고, 참조변수를 통해서 호출한다.

📒 함수형 문법 살펴보기

  • 매개변수의 괄호
    1. 매개변수가 하나인 경우에는 괄호를 생략할 수 있다.
  • 실행문의 괄호
    1. 실행문이 return문이 아니며, 한 문장일 경우에는 괄호를 생략할 수 있다.
    그외의 경우는 중괄호를 생략할 수 없다.
    2. retrun문 하나라면 return문과 중괄호를 모두 생략할 수 있다.

➡️ 함다식은 되도록이면 생략할 수 있는 부분을 생략하여 간단하게 구현해야한다.

📖 람다식 사용하기

  • 앞에서 람다식을 사용하기 위해서는 함수형 인터페이스를 만들고, 인터페이스 참조 변수에 람다식을 구현해 사용해야함을 배웠다.

1. 함수형 인터페이스 구현

람다식으로 구현할 메서드를 선언한다.
⚠️ 함수형 인터페이스는 메서드를 하나만 포함하고 있어야한다. 따라서 오류를 방지하기위해 @FunctionalInterface 애노테이션을 사용해야한다.

@FunctionalInterface
interface AddCalculation {
  int add (int num1, int num2);
}

2. 인터페이스 참조 변수에 람다식 구현

인터페이스형 변수를 선언하고 변수에 람다식을 대입한다.

AddCalculation addCalculation = (num1, num2) -> num1 + num2 ;

3. 참조 변수.메소드명으로 함수 호출

인터페이스형 변수의 자료형은 인터페이스형이므로 해당 메서드를 호출 할 수 있다.

System.out.println(addCalculation.add(3,4));

✍️ 전체 코드

@FunctionalInterface
interface AddCalculation {
  int add (int num1, int num2);
}

public class LambdeTest {
  public static void main(String[] args) {
    AddCalculation addCalculation = (num1, num2) -> num1 + num2 ;

    System.out.println(addCalculation.add(3,4));
  }
}

📖 람다식의 익명 객체 생성과 지역변수 변경 불가능

사실 인터페이스 참조변수에 람다식을 대입하는 과정중에 람다식을 기반으로 메서드 오버라이딩을 한 익명 클래스가 생성된다. 이를 통해 객체가 생성되는 것이다.

람다식도 익명 내부 클래스의 일종으로 람다식 내부에서는 외부의 지역변수가 상수로 취급된다. 따라서 외부의 지역 변수를 변경할 수 없고, 변경하려고 하면 오류가 발생한다.

✍️ 예시코드

@FunctionalInterface
interface AddCalculation {
  int add (int num1, int num2);
}

public class LambdeTest {
  public static void main(String[] args) {
    int i = 10;

    AddCalculation addCalculation = (num1, num2) -> {
      //i = 4; 람다식 내부에서 변경하면 오류발생
      return num1 + num2; // 람다식 내부
    }; 
	//화살표 함수는 세미콜론
    
    System.out.println(addCalculation.add(3,4));
  }
}

📖 함수를 변수처럼 사용하는 람다식

람다식은 구현된 함수를 변수처럼 사용한다.

✅ 변수의 용도
1. 특정 자료형으로 변수선언 후 값 대입하여 사용하기
2. 매개변수로 전달하기
3. 메서드의 반환값으로 반환하기
👉 람다식으로 구현된 함수도 변수처럼 사용할 수 있다.

1. 인터페이스형 변수에 람다식 대입하기

2. 매개변수로 전달하는 람다식

람다식을 변수에 대입하면 이를 자료형이 인터페이스형인 매개변수로 전달할 수 있다.

@FunctionalInterface
interface PrintString {
  void showString(String str);
}

public class LambdeTest {
  public static void main(String[] args) {
	//람다식 구현
    PrintString lambdaStr = s-> System.out.println(s);
    lambdaStr.showString("안녕");
    
    //람다식을 매개변수로 전달
    showMyString(lambdaStr);
  }
  
  public static void showMyString(PrintString p) { //매개변수의 자료형은 인터페이스형
    p.showString("Hi");
  }
}

👉 실행화면

안녕 
Hi

3. 반환값으로 쓰이는 람다식

메서드의 반환형을 람다식의 인터페이스 형으로 선언하면 구현한 람다식을 반환한다.

package Do_It_Java.Do_It_Java_13;

@FunctionalInterface
interface PrintStirg {
  void showString(String str);
}

public class LambdeTest {
  public static void main(String[] args) {
    //람다식을 변수로 반환받기
    PrintStirg reStr = returnString();
    reStr.showString("세상은 ");
  }
  public static PrintStirg returnString() {
    return s -> System.out.println(s + "world");
  	//인터페이스형을 생햑해도 된다.
  }
}

👉 실행화면

세상은 world

🤓마무리하면서🤓

개강을 앞두고 잠시 공부를 쉬었는데 다시 파이팅해야겠다!!!
profile
24년도까지 프로젝트 두개를 마치고 25년에는 개발 팀장을 할 수 있는 실력이 되자!

0개의 댓글