티스토리 뷰

Goal 

 - 람다식의 정의와 함수형 프로그래밍에 대해 간단히 알아본다

 - 람다식 사용방법에 대해 알아본다

 - 기존방식과 람다식을 비교해본다

 - 함수를 변수처럼 사용하는 람다식의 특징에 대해 알아본다

 

1. 람다식이란?

 - 자바에서 함수형 프로그래밍(functional programming)을 구현하는 방식

 - 클래스를 생성하지 않고 함수의 호출만으로 기능을 수행

 - 함수형 인터페이스를 선언한뒤, 인터페이스의 메서드를 구현할 클래스에서 함수를 호출하여 사용한다.

 - 자바 8부터 지원되는 기능 

 

1-1 함수형 프로그래밍

 - 순수함수(pure function)를 구현하고 호출하는 프로그래밍 

 * 순수함수 : 매개 변수만을 사용하도록 만든 함수로 외부 자료에 부수적인 영향(side effect)이 발생하지 않도록 함.

 - 입력 받은 자료를 기반으로 수행되고 외부에 영향을 미치지 않으므로 병렬처리 가능, 안정적인 확장성 있는 프로그래밍 방식 

 

2. 람다식 사용방법

 1) 함수형 인터페이스 선언

package lambda;

@FunctionalInterface //메서드를 1개만 선언하도록 에너테이션 지정
public interface MyMaxNumber {
    int getMaxNumber(int x, int y); //1)구현할 메서드 선언
    
    // 함수형 인터페이스에는 메서드를 2개 이상선언할 수 없음.
    /* 익명 함수를 사용하는 함수형 인터페이스의 특성상
     * 매개변수의 숫자가 같을 경우, 어떤 함수를 처리해야 할 지 모르는 상황이 있기 때문에
     * @FunctionalInterface를 사용하여 메서드를 1개만 선언하도록함.
     */

}

 2) 인터페이스의 메서드 구현 및 호출

package lambda;

public class TestMyNumber {
    
    public static void main(String[] args) {
        
        //2)메서드 구현 및 호출
        MyMaxNumber max = (x, y) -> (x >= y) ? x : y;
        System.out.println(max.getMaxNumber(10, 20));

    }

}

 

3. 기존방식과 람다식 비교

 - 문자열을 연결하는 메서드를 만들어 사용하는 것을 일반적인 방식과 람다식을 통해 비교해본다.

 

3-1 일반적인 방식

 - 인터페이스를 선언한 뒤, 인터페이스의 내용을 구현한 클래스를 만들고, 그 클래스를 사용할 메인 클래스가 필요하다.

 

 1) 인터페이스에 선언

package lambda;

public interface StringConcat {
    
    public void makeString(String s1, String s2);

}

 2) 인터페이스를 implements하는 클래스 생성

package lambda;

public class StringConImpl implements StringConcat {

    @Override
    public void makeString(String s1, String s2) {
        System.out.println(s1 + "," + s2);
        
    }

}

 3) 구현된 메서드를 사용하기 위한 메인 클래스

package lambda;

public class TestStringConcat {
    
    public static void main(String[] args) {
        
        //객체지향에서 메서드 사용방식
        StringConImpl impl = new StringConImpl(); 
        impl.makeString("hello", "world");
        
}

3-2 람다식 

 

 1) 함수형 인터페이스 선언

package lambda;

@FunctionalInterface
public interface StringConcat {
    
    public void makeString(String s1, String s2);

}

 

 2) 메인 클래스에서 함수를 호출하여 사용

package lambda;

public class TestStringConcat {
    
    public static void main(String[] args) {
   
        //람다를 이용한 메서드 사용
        StringConcat concat = (s, v) -> System.out.println(s + "," + v);
        concat.makeString("hello", "world");
        
        //람다식 구현 원리 
        //내부적으로 익명 내부 클래스를 구현함 
        StringConcat concat2 = new StringConcat() {
            
            @Override
            public void makeString(String s1, String s2) {
                System.out.println(s1 + "," + s2);
                
            }
        };
        
        concat2.makeString("hello", "world");
    }
    


}

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

 - 프로그램에서 변수는 다음과 같이 선언하여 사용한다.

int number = 10; // 자료형에 기반하여 선언하고
int numberGet(int n1, int n2); // 매개변수로 전달하고
return number; // 메서드의 반환 값으로 사용

 - 람다식도 프로그램내에서 변수처럼 선언하며, 매개변수나, 메서드의 반환 값으로 사용가능하다.

 

 4-1 변수에 대입

 - 람다식의 문법을 살펴보면, 메서드의 선언 내용이 변수에 대입되는 것을 알 수 있다.

package lambda;

//함수형 인터페이스 선언
@FunctionalInterface
interface PrintString {
    void showString(String str);
    
}

public class TestLambda {

    public static void main(String[] args) {
        
        //함수의 구현부가 lambdaStr라는 변수에 대입됨.
        PrintString lambdaStr = s -> System.out.println(s);
        lambdaStr.showString("Test"); //변수를 통해 구현한 메서드 실행
        
    }
}

4-2 매개변수로 사용

 - 사용변수의 이름이 매개변수로 넘어갈 수 있음

package lambda;

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

public class TestLambda {

    public static void main(String[] args) {
        
        PrintString lambdaStr = s -> System.out.println(s);
        lambdaStr.showString("Test");
        
        showMyString(lambdaStr); //변수처럼 람다식 대입
        

    }
    
    
    //함수의 구현부를 매개변수로 사용.
    public static void showMyString(PrintString p) {
        p.showString("Test2");
        
    }
    
}

 

4-3 반환값으로 사용

package lambda;

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

public class TestLambda {

    public static void main(String[] args) {
        
        PrintString lambdaStr = s -> System.out.println(s);
        lambdaStr.showString("Test");
        
        //returnString() 메서드를 활용하여 람다식구현
        PrintString test = returnString();
        test.showString("Test3");

    }
       
    //함수의 구현부가 변수처럼 return됨.
    public static PrintString returnString() {
        return s -> System.out.println(s + "!!!");
    }

}

 

'Java > Java 올인원 패키지' 카테고리의 다른 글

30. 예외 처리 (Java)  (0) 2020.03.24
29. 스트림 (Java)  (0) 2020.03.23
27. 내부 클래스 (Java)  (0) 2020.03.21
25. Set 인터페이스 (Java)  (0) 2020.03.19
24. List 인터페이스 (Java)  (0) 2020.03.19
댓글