함수형 인터페이스 정리 - 1

Bruce Han·2022년 11월 15일
1

Java8-정리

목록 보기
1/20
post-thumbnail
post-custom-banner

이 포스팅의 코드 및 정보들은 강의를 들으며 정리한 내용을 토대로 작성한 것입니다.

함수형 인터페이스의 특징

1.함수형 인터페이스에는 추상 메서드가 한 개는 존재해야 함

위 사진처럼 abstract가 생략가능한 것을 알 수 있다.

2.바디가 있는 static 메서드 정의 가능

인터페이스 내부임에도 불구하고 static 메서드는 바디가 존재한 채로 정의할 수 있다.

3.default 접근제어자인 메서드로 바디가 있는 채 정의 가능

4.함수형 인터페이스 내에 추상 메서드는 꼭 하나만!

즉, 위의 static이나 default는 같이 있어도 된다. 그리고 인터페이스 위에는 @FunctionalInterface를 붙인다. (스탠다드 라이브러리에 들어있음)

@FunctionalInterface
public interface RunAnything {
	void runIt();
    
    static void printName() {
    	System.out.println("bruce");
    }
    
    default void printAge() {
    	System.out.println("26");
    }
}


java.lang에 있는 @FunctionalInterface를 붙이면 함수형 인터페이스라는 걸 명시하는 것이고, 이는 추상메서드 개수에 대해 실수하지 않을 수 있다.

4-a.인터페이스를 구현하려면?

자바 8 이전

자바 8 이후 (lambda 사용)

4줄 차지하던 코드를 1줄로 표현할 수 있다.

구현한 내부 코드가 2줄 이상이면

public class RunAnythingImpl {
    public static void main(String[] args) {
        RunAnything runAnything = new RunAnything() {
            @Override
            public void runIt() {
                System.out.println("코드 2줄부터는");
                System.out.println("아까처럼 1줄로 못 줄입니다");
            }
        }
    }
}
public class RunAnythingImpl {
	public static void main(String[] args) {
    	RunAnything runAnything = () -> {
            System.out.println("코드 2줄부터는");
            System.out.println("이렇게 줄일 수 있습니다.");
        }
    };
}

5.입력받은 값이 동일한 경우 결과 값도 동일해야 함

이런 인터페이스가 있고, 이를 구현했다고 하자.

생성한 Object에 매개변수로 1을 넣으면 아래 사진처럼 11이 나와야 한다.

아래 사진처럼 이를 보장해주지 못하는 상황이 발생하거나 그럴 가능성이 있으면 함수형 프로그래밍이라고 보기 어렵다.

자바는 객체지향 언어이기 때문에 runAnything을 메서드의 파라미터로 전달하거나 return 타입으로 반환하거나, 혹은 변수로 만들어서 사용할 수도 있다.
이런 형태는

일급객체(First class object)

로 사용할 수 있다.
다시 말해서, 자바에서 함수는 특수한 Object이다. Object를 리턴 타입으로 쓰거나 파라미터로 쓰는 게 당연하기 때문에 고차함수도 역시 일급객체가 된다면 가능하다.

고차함수는
함수가 함수를 매개변수로 받을 수 있고, 함수를 반환할 수도 있다.

순수함수 : 같은 값을 넣었으면 같은 값이 나와야 함 (feat. 불변성)

순수함수란
1.사이드 이펙트, 함수 밖에 있는 값을 변경하지 않고
2.상태가 없다, 함수 밖에 있는 값을 사용하지 않는다.

어떤 상태값에 의존하거나 그 값을 가지고 있을 때, 아래 사진과 같으면 순수함수라고 보기 어렵다.

순수 함수에서는 익명 내부 클래스 밖의 변수를 변경할 수 없다.

익명 내부 클래스 안에다가 변수 생성 후에는 변경할 수 있지만, 이것도 순수 함수의 의미가 사라지게 된다.

익명 내부 클래스 밖의 변수는 변경할 수 없다. 마찬가지로 컴파일 오류가 발생한다.

그냥 참조만 해야 하기에, 익명 내부 클래스 밖에 있는 local 변수를 쓰려면 이 변수는 final과 같아야 한다.

정리

함수형 인터페이스 (Functional Interface)

  • 추상 메서드를 딱 하나만 가지고 있는 인터페이스, Single abstract Method
  • @FunctionalInterface 어노테이션을 가지고 있는 인터페이스

람다 표현식 (Lambda Expressions)

  • 함수형 인터페이스의 인스턴스를 만드는 방법으로 쓰일 수 있다.
  • 코드를 줄일 수 있다.
  • 메서드 매개변수, 리턴 타입, 변수로 만들어서 사용할 수 있다.

여기까지는 함수형 프로그래밍을 하지 않더라도 쓸 수 있는 개념이며, 문법적으로 허용됨

함수형 프로그래밍을 한다면

  • 함수를 일급 객체(First class object)로 사용할 수 있어야 한다.
  • 순수 함수를 적용해야 한다.
    • 함수 밖에 있는 값을 참조하거나 변경할 수 없다.
    • 함수 내부에서 쓰는 값, 함수가 전달받은 파라미터만 가지고 놀 수 있다.
  • 고차함수도 적용해야 한다.
    • 함수가 함수를 매개변수로 받을 수 있고, 함수를 리턴할 수도 있다.
  • 불변성이 있어야 한다.

Reference

더 자바, Java 8 - 백기선 강사님 강의를 토대로 정리했습니다.

profile
만 가지 발차기를 한 번씩 연습하는 사람은 두렵지 않다. 내가 두려워 하는 사람은 한 가지 발차기를 만 번씩 연습하는 사람이다. - Bruce Lee
post-custom-banner

0개의 댓글