0706 Lambda

  • 우리가 구현할 람다식의 타겟타입
@FunctionalInterface
public interface MyFunctionalInterface {
	//람다식의 구현대상 
	public abstract void method();
}//end interface
  • 람다식은 하나의 메소드를 정의하기 때문에 두 개 이상의 추상 메소드가 선언된 인터페이스는 람다식을 이용해 객체를 생성할 수 없다.
    • 따라서 하나의 추상메소드가 선언된 인터페이스만 람다식의 타겟타입이 될 수 있다.
    • 추상메소드가 두 개 이상 선언되었을 때, @FunctionalInterface 어노테이션을 붙이면 컴파일 오류가 발생한다.
  • @FunctionalInterface 어노테이션
    FunctionalInterface는 오직 하나의 메소드 선언을 갖는 인터페이스를 말한다.

중첩클래스

  • 중첩클래스는 현업에서 잘 쓰이지도 않을 뿐더러 가독성이 떨어지는 문제로 잘 사용되지 않는다.
class OutterClass {
	int outterField = 10;

	class InnerClass{
		int innerField = 20;
	}
}

중첩클래스 사용문법

  • 바깥쪽클래스의 필드 및 메소드를 호출할때...

    바깥쪽클래스.this.outterField
    바깥쪽클래스.this.메소드()

  • 안쪽클래스의 필드 및 메소드를 호출할때...

    this.innerField
    this.메소드()

  • 안쪽 클래스의 인스턴스(객체) 생성
    - 안쪽 클래스로부터 객체를 생성하려면,
    • 바깥쪽 객체 없이는, 안쪽 객체가 존재할 수 없기 때문에,
    • 먼저, 위의 1과 같이, 바깥쪽 객체를 먼저 생성하고,
    • 그 객체의 주소를 들고있는 참조변수명.new 연산자로 안쪽의 중첩된 클래스의 객체를 생성한다.

클로저(Closure)

  • 생명주기가 짧은 지역변수를 생명주기가 긴 익명구현객체 내부에서 사용할 때 발생하는 현상
  • 람다식 블록에서, 블록 바깥의 지역변수를 사용하게 되면 클로저(Closure) 문제가 발생한다.

  • 따라서 람다식에서 블록 바깥의 지역변수를 사용하게 되면
    내부에서 필요로하는 정보를 넘길때 값이 변경되면 의도하지 않은 결과가 나올 수 있기 때문에, 컴파일러가 생명주기가 짧은 지역변수를 final 상수로 처리해서 값을 계속사용가능하게 만들어준다.
    --- 하지만 final로 처리되었기 때문에 값의 수정이 불가능하다.


var 타입

  • var 타입은 대입되는 값의 유형(형태)에 따라 타입이 결정된다
var value1 = 10;  // 이때 var의 타입은 'int'타입으로 결정
var value2 = "hello"; // 이때 var의 타입은 'String'타입으로 결정
  • 아래 코드에서는 오류가 발생한다.
//value에 정수 40이 들어오기 때문에 var 타입은 '정수'타입으로 결정
var value = 40;
//이 후, 변수 value에 문자열을 대입해보면 이미 '정수'타입으로 결정이 되었기 때문에
//정수 타입 변수 value에 문자열이 대입될 수 없다.
value = "hello";

람다식의 함수적 인터페이스

  • java.util.function 패키지에 있는, functional interface를 사용하기로 했다면, 무조건 람다식으로 구현할것을 생각하라 !!
  • 객체 T를 받아 소비
Consumer<String> consumer = t -> log.info(t + "8");
consumer.accept("java");
  • 객체 T와 U를 받아 소비
BiConsumer<String, String> bigConsumer = (t, u) -> log.info(t + u);
bigConsumer.accept("java", "8");
  • double 값을 받아 소비
DoubleConsumer doubleConsumer = d -> log.info("java" + d);
doubleConsumer.accept(8.0);
  • 객체 T와 int 값을 받아 소비
ObjIntConsumer<String> objIntConsumer = (t, i) -> log.info(t + i);
objIntConsumer.accept("JAVA", 8);

0개의 댓글