Study_The JAVA 8_1

dragon9265·2022년 1월 23일
0

스터디

목록 보기
11/23

자바 기초 스터디_22.01.23(일)


함수형 인터페이스와 람다 표현식 소개

함수형 인터페이스

1. 함수형 인터페이스 정의


public interface RunSomething {

	void doIt(); // interface는 void 앞에 abstract는 생략할 수 있다.
    
}
  • 인터페이스안에 추상메서드가 1개만 있으면, 함수형 인터페이스다.

public interface RunSomething {

	void doIt(); // interface는 void 앞에 abstract는 생략할 수 있다.
    
   	 static void printName() { // static 앞에 public도 생략 가능.
    		System.out.println("Vans")
   	 }
    
    	default void printAge() { 
   	 	System.out.println("3")
   	 }
    
}
  • 다른형태의 메서드가 함께 있더라도, 추상메서드가 1개 이므로 함수형 인터페이스다.

@FunctionalInterface
public interface RunSomething {

	void doIt(); 
    
}
  • 함수형 인터페이스 사용할때는 애노테이션을 추가해서 인터페이스를 좀 더 견고하게 관리할수 있으므로 가능하면 추가하는게 좋다.

2. 함수형 인터페이스 활용방법


@FunctionalInterface
public interface RunSomething {

	void doIt(); 
    
}

public class Foo {

	public static void main(String[] args) {
    
    	RunSomething runSomething = new RunSomething(){ 
        // 익명 내부 클래스 *anonymous inner class 라고 부른다.
            @Override
            public void doIt() {
            	System.out.println("Vans");
            }
        }
    }
}
  • 자바 8이전엔 위처럼 함수형 인터페이스의 구현체(익명 클래스 Anonymous Inner Class)를 만들어 쓸 수 있었다.

Anonymous inner Class 란?
이름이 없는 클래스로, 단 하나의 객체를 위한 클래스이다.
앞에 있는 생성자의 클래스를 상속받고 있는 이름없는 자식 클래스이다.
생성자를 선언할 수 없고, 오로지 단 하나의 클래스나 단 하나의 인터페이스를 상속받거나 구현할 수 있다.


람다 표현식


@FunctionalInterface
public interface RunSomething {

	void doIt(); 
    
}

public class Foo {

	public static void main(String[] args) {
    		RunSomething runSomething = () -> System.out.println("Vans");
       		runSomething.doIt();
     	
        }
    
}

// 예시 2. 위 코드를 밑에 코드처럼 바꿀 수도 있다.
// public class Foo {

//	public static void main(String[] args) {

//    		RunSomething runSomething = () -> {
//			System.out.println("Vans");
//			System.out.println("Lamda");
//    		};
     
//       }
    
//}
  • 인터페이스가 하나일 경우, 자바8 이후부터 줄여서 쓸 수 있는 람다 표현식(Lambda Expressions)이 생겼다. 하는일이 한줄이 아니다면, 예시2 코드처럼 써도된다.

  • 람다 표현식을 쓰면 다른 언어처럼 보이지만, 자바에서는 실질적으로 특수한 형태의 Object라고 볼 수 있다.(함수형 인터페이스를 인라인으로 구현한 Object)

네모친 부분을 람다표현식을 통해 변수에 할당하거나, 메소드에 파라미터로 전달하거나, 자체를 리턴하는것도 가능하므로 일급객체(First Class Object)로 사용할 수 있다.

순수함수(Pure Function)

  • 순수함수는 인자로 입력받은 값이 동일할 경우 결과값이 같아야 한다

  • 위 처럼 외부(baseNumber)에 상태값이 의존하고 있는 경우 동일한 인자값을 받아도 결과값이 다를 수 있는 여지가 있으므로 순수하지 않은 함수라 볼 수 있다.

결론, 자바8 이상부터 위의 기능들이 사용가능해졌다고 해서 무조건 함수형 프로그래밍을 하는것이 아니라, 필요에 의해서 선택적으로 활용하는것을 권장한다.


ref.

https://dilee.tistory.com/53
https://codedragon.tistory.com/4410
https://pridiot.tistory.com/52

profile
코딩도 점진적 과부화

0개의 댓글