C16

0

이것이 자바다

목록 보기
14/18
post-thumbnail

람다식이란?

함수형 프로그래밍이란 함수를 정의하고 이 함수를 데이터 처리부로 보내 데이터를 처리하는 기법을 말한다. 데이터 처리부는 데이터만 가지고 있을 뿐, 처리 방법이 정해져 있지 않아 외부에서 제공된 함수에 의존한다.

 람다식:  (매개변수, ...) -> { 처리 내용 }

자바는 람다식을 익명 구현 객체로 변환하며. 인터페이스의 익명 구현 객체를 람다식으로 표현하려면 인터페이스가 단 하나의 추상 메소드만 가져야한다.

매개변수가 없는 람다식

두 개 이상일 경우에는 중괄호를 생략할 수 없고, 하나일 경우에만 생략할 수 있다.

@FunctionalInterface
public interface Calculable {
	//추상 메소드
	void calculate(int x, int y);
}
public class LambdaExample {
	public static void main(String[] args) {
		action((x, y) -> {
			int result = x + y;
			System.out.println("result: " + result);
		});

		action((x, y) -> {
			int result = x - y;
			System.out.println("result: " + result);
		});
	}

	public static void action(Calculable calculable) {
		//데이터
		int x = 10;
		int y = 4;
		//데이터 처리
		calculable.calculate(x, y);
	}
}
	result: 14
    result: 6

매개변수가 있는 람다식

함수형 인터페이스의 추상 메소드에 매개변수가 있을 경우 람다식은 다음과 같이 작성할 수 있다. 매개변수를 선언할 때 타입은 생략할 수 있고, 구체적인 타입 대신에 var를 사용할 수도 있다. 하지만 타입을 생략하고 작성하는 것이 일반적이다.

매개변수가 하나일 경우에는 괄호를 생략할 수도 있으며 이때는 타입 또는 var을 붙일 수 없다.

리턴값이 있는 람다식

함수형 인터페이스의 추상 메소드에 리턴값이 있을 경우 람다식은 아래와 같이 작성 가능하다.

	(매개변수, ... ) -> {
    실행문;
    return;
    } //return문 하나만 있을 경우에는 중괄호와 함께 return 생략 가능

Calcuable 인터페이스에 리턴 값이 있는 calc() 추상메소드 작성

@FunctionalInterface
public interface Calcuable {
	double calc(double x, double y);
}

person 클래스에 Workable을 매개변수로 갖는 action1() 메소드와 Speakable을 매개변수로 갖는 action2() 메소드 작성

public class Person {
	public void action(Calcuable calcuable) {
		double result = calcuable.calc(10, 4);
		System.out.println("결과: " + result);
	}
}
public class LambdaExample {
	public static void main(String[] args) {
		Person person = new Person();

		//실행문이 두 개 이상일 경우
		person.action((x, y) -> {
			double result = x + y;
			return result;
		});

		//리턴문이 하나만 있을 경우(연산식)
		//person.action((x, y) -> {
		// return (x + y);
		//});
		person.action((x, y) -> (x + y));

		//리턴문이 하나만 있을 경우(메소드 호출)
		//person.action((x, y) -> {
		// return sum(x, y);
		//});
		person.action((x, y) -> sum(x, y));
		}
	
	public static double sum(double x, double y) {
		return (x + y);
	}
}
결과 : 14.0
결과 : 14.0
결과 : 14.0

메소드 참조

말 그대로 메소드를 참조해서 매개변수의 정보 및 리턴 타입을 알아내 람다식에서 불필요한 매개변수를 제거하는 것을 목적으로 한다.

정적 메소드와 인스턴스 메소드 참조

정적 메소드를 참조할 경우에는 클래스 이름뒤에 :: 기호를 붙이고 정적 메소드 이름을 기술한다.

	클래스 :: 메소드

인스턴스 메소드일 경우에는 먼저 객체를 생성한 다음 참조 변수 뒤에 :: 기호를 붙이고 인스턴스 메소드 이름을 기술한다.

	참조변수 : 메소드

매개변수의 메소드 참조

	(a, b) -> { a.instanceMethod(b); }
    // 람다식에서 제공되는 a 매개변수의 메소드를 호출해서
    // b 매개변수를 매개값으로 사용하는 경우
	클래스 :: instancMethod
    //위 를 메소드 참조로 표현한 것 
@FunctionalInterface
public interface Comparable {
	int compare(String a, String b);
}

Person 클래스에 Comparable을 매개변수로 갖는 ordering() 메소드 작성

public class Person {
	public void ordering(Comparable comparable) {
		String a = "홍길동";
		String b = "김길동";

		int result = comparable.compare(a, b);

		if(result < 0) {
			System.out.println(a + "은 " + b + "보다 앞에 옵니다.");
		} else if(result == 0) {
			System.out.println(a + "은 " + b + "과 같습니다.");
		} else {
			System.out.println(a + "은 " + b + "보다 뒤에 옵니다.");
		}
	}
}
public class MethodReferenceExample {
	public static void main(String[] args) {
		Person person = new Person();
		person.ordering(String :: compareToIgnoreCase);
	}
}
	홍길동은 김길동보다 뒤에 옵니다.

생성자 참조

생성자를 참조한다는 것은 객체를 생성하는 것을 의미한다. 람다식이 단순히 객체를 생성하고 리턴하도록 구성된다면 람다식을 생성자로 참조로 대치할 수 있다.

	(a, b) -> { return new 클래스(a, b); }
    //코드를 보면 람다식은 단순히 객체를 생성 후 리턴한다.
	클래스 :: new
    //생성자 참조로 표현한 것.

확인문제

1. 4번

2. 4번

3. 2번

4.

public class Example {
    public static void main(String[] args) {
        Thread thread = new Thread(() -> {
                    for(int i=0; i<3; i++) {
                        System.out.println("작업 스레드가 실행됩니다."); }
                }
        );
        thread.start();
    }
}

5.

 (() -> {System.out.println("Ok 버툰을 클릭했습니다.");})
 (() -> {System.out.println("Cancel 버튼을 클릭했습니다.");})

6.

    @FunctionalInterface
    public interface Function {
        public double apply(double x, double y);
    }

7.

    public static void main(String[] args) {
        int max = maxOrMin(Math::max

        );
        System.out.println("최댓값 : " + max);

        int min = maxOrMin(Math::min

        );
        System.out.println("최솟값 : " + min);
    }
}

8.

    public static double avg(Function<Student> function) {
        int sum = 0;
        for (Student student : students) {
            sum += function.apply(student);
        }
        double avg = (double) sum / students.length;
        return avg;
    }

9.

 Student :: getEnglishScore 
 Student :: getMathScore

0개의 댓글

관련 채용 정보