Java

Java, 함수형 프로그래밍 / 람다식

greenyellow-s 2024. 8. 5. 22:49
함수형 프로그래밍이란?

 

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


람다식

 

자바는 함수형 프로그래밍을 위해 Java 8부터 람다식을 지원한다.
데이터 처리부는 람다식을 받아 매개변수에 데이터를 대입하고 중괄호를 실행시킨다.
자바는 람다식을 익명 구현 객체로 변환한다.

인터페이스의 익명 구현 객체를 람다식으로 표현하려면 반드시 하나의 추상메소드만 가져야 한다.

인터페이스가 단 하나의 추상메소드를 가질 때, 이를 함수형 인터페이스 라고 한다.
인터페이스가 함수형 인터페이스임을 보장하기 위해서는 @FunctionalInterface 어노테이션을 붙이면 된다. 

 

컴파일 시 추상메소드가 하나인지 검색하기 때문에 정확한 함수형 인터페이스를 작성할 수 있다.



[형식]
(매개변수, ...) -> { 처리내용 }

[예]
public interface Runnable {
   void run();
}
람다식 => ( ) -> {  }

@FunctionalInterface
public interface Calculable {
   void calculate(int x, int y);
}
람다식 => (x, y) -> {  } 


메소드 참조


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

큰수를 리턴하는 람다식
(left, right) -> Math.max(left, right);

위에서 단순히 left, right 값을 매개값으로 전달하는 역활만 하기 때문에 메소드 참조를 이용하면 깔끔하게 처리된다.
Math :: max;

[형식]
① 정적 메소드
클래스 :: 메소드

② 인스턴스 메소드
참조변수 :: 메소드

 

생성자 참조

 

생성자를 참조한다는 것은 객체를 생성하는 것을 의미한다. ==> new
생성자 Overload 되어 여러 개가 있을 경우, 함수형 인터페이스의 추상메소드와 동일한 매개변수 타입과 개수를 가진 생성자를 찾아 실행한다.

 

1. 생성자 참조
(a, b) -> {
   return new 클래스(a, b);
}

 

2. 메소드 참조

생성자 참조  클래스 :: new

@FunctionalInterface
interface Create01 {
	public Person create(String name);
}
class Person{
	private String name;
	private int age;
	
	public Person(String name) {
		this.name = name;
		System.out.println("Person(String name) 생성자");
	}

	public Person(String name, int age) {
		this.name = name;
		this.age = age;
		System.out.println("Person(String name, int name) 생성자");
	}

	public String getName() {
		return name;
	}

	public int getAge() {
		return age;
	}
}
class PersonTest{
	public Person getPerson01(Create01 create01) {
		String name = "none";
		Person person = new Person(name);
		return person;
	}
}
PersonTest personTest = new PersonTest();

Person one = personTest.getPerson01(Person :: new);
System.out.println("이름 : "+ one.getName() + "\t나이 : "+ one.getAge());

 

 

 

'Java' 카테고리의 다른 글

Java, 채팅하기(Chat)  (0) 2024.08.16
Java, Iterator (ioStream)  (0) 2024.08.12
Java, 스레드, 동기화처리, 싱글톤  (0) 2024.08.05
Java, io Stream(InputStream, OutputStream)  (0) 2024.08.05
Java, 정렬(CompareTo, Compartor)  (0) 2024.08.02