똑같은 삽질은 2번 하지 말자

Java 8 @FunctionalInterface(함수형 인터페이스), 람다 표현식 본문

Java

Java 8 @FunctionalInterface(함수형 인터페이스), 람다 표현식

곽빵 2020. 10. 18. 13:18

@FunctionalInterface (함수형 인터페이스)

  • 추상 메소드 한개만을 가지고 있는 인터페이스

  • SAM (Single Abstract Method) 인터페이스

  • @FuncationInterface 애노테이션을 가지고 있는 인터페이스

 

람다 표현식 (Lambda Expressions)

  • 함수형 인터페이스의 인스턴스를 만드는 방법으로 쓰일 수 있다.

  • 코드를 줄일 수 있다.

  • 메소드 매개변수, 리턴 타입, 변수로 만들어 사용가능

@FunctionalInterface // 자바(standard)가 지원해주는 어노테이션
public interface RunSomething {

	/* 추상 메소드가 하나만 있으면 함수형 인터페이스 
	 abstract는 생략 가능 (@FunctionalInterface가 있으면) */
	abstract void doIt();
}

 

이렇게 사용하거나

public class Suo {
	public static void main(String[] args) {
		
		// 익명 내부스 클래스 anonymous inner class
		RunSomething runSomething = new RunSomething() {
			@Override
			public void doIt() {
				System.out.println("Hello");
				System.out.println("EveryOne");
			}
		};
 }

 

람다표현식을 사용

public class Suo {
	public static void main(String[] args) {
		
		RunSomething runSomething = () -> {
			System.out.println("hello");
			System.out.println("hi");
		};
}

javascript를 다루면서 함수형 프로그래밍을 학습중인데, 개념이 똑같아서 이해하기 어렵지 않았다.

역시 여기서도 나오는 말이 함수형 프로그래밍의 특징인 부분인데

자바에서 함수형 프로그래밍

  • 함수를 First class object로 사용할 수 있다.

  • 순수 함수 (Pure function)

  • 고차 함수 (Higher-Order Function) 

  • 불변성

순수 함수란? 

  부수효과가 없는 함수 즉, 어떤 함수에 동일한 인자를 주었을 때 항상 같은 값을 리턴하는 함수

  + 외부의 상태를 변경하지 않는 함수

 

고차 함수란?

  함수가 함수를 매개변수로 받을 수 있고 함수를 리턴할 수도 있다.

 

객체지향프로그래밍의 좀더 진화한 형태가 함수형 프로그래밍이라고 너튜브에서 본적이 있다.

개인적으로 최근 프로젝트를 하면서 느끼는 거지만, 재사용성이 높은 모듈들을

외부의 상태를 변경하지 안하고 영향을 안받게 잘 짜면 어느 곳에서나 갖다 쓸수 있고,

그러면 그만큼 개발시간이 줄어들기 때문에 이렇게 프로그애밍 패러다임이 점점 발전한다고 느낀다.

 

그리고 자바에서 기본적으로 제공하는 함수형 인터페이스들이 있는데, 아래 링크를 참조

docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html

 

java.util.function (Java Platform SE 8 )

Interface Summary  Interface Description BiConsumer Represents an operation that accepts two input arguments and returns no result. BiFunction Represents a function that accepts two arguments and produces a result. BinaryOperator Represents an operation u

docs.oracle.com

 

 

'Java' 카테고리의 다른 글

Java 8 Stream  (0) 2020.10.25
Java 8 인터페이스의 변화  (0) 2020.10.25
Java Reflection API(리플렉션)  (0) 2020.09.21
JIT 컴파일러 이해 (Just-In-Time 컴파일러)  (0) 2020.08.25
Java jacoco(코드 커버리지 측정) 사용방법  (0) 2020.08.23
Comments