mm Home

Java 8 - 동작 파라미터화 본문

개발/Java

Java 8 - 동작 파라미터화

jess_m 2017. 8. 10. 14:41

소비자의 요구사항은 항상 바뀐다. 기능은 쉽게 구현할 수 있어야 한다.

동작 파라미터화란 아직은 어떻게 실행할 것인지 결정하지 않은 코드 블록을 의미한다. 동작(함수)를 파라미터화 한 것.


동작 파라미터화의 과정은 이보다 훨씬 길지만.. 간략히 적어보면!

 

 

사과의 종류에 따른 분류를 하려고 한다면??

매번 분류하는 작업마다 코드를 추가하는건 쉬운 방법이지만 코드의 중복 + 복잡.

 

동작 파라미터화를 사용하면,,

filter를 하는 동작과 실제 분별하는 동작을 구분하여, 인자로 받게 된다.

실제 filter를 하는 시점에 분별하는 동작을 수행하게 되므로 다양한 분별 작업만 정의해서 건네주면 된다.

 

 

아래와 같은 코드로 표현할 수 있다.  (ApplePredicate라는 test메소드가 있는 인터페이스. 인터페이스를 구현한 구현체를 넘겨주면 된다. Predicate는 함수형 인터페이스이다. 다음장에서 설명하겠다)

 


위의 코드는 다른 모델클래스에 대해서 또 반복적인 코드를 유발한다. Generic을 이용해 공통화 하자.



아래와 같이 사용할 수 있다. 




위의 내용은 익명클래스로 위와 비슷하게 구현할 수 있을 것이다. 하지만 사용에 차이가 있다.

간단히 익명클래스 vs 람다 ?


익명클래스

    • Class loading
    • 자바는 동적으로 클래스를 읽어 온다. 런타임시에 모든 코드가 JVM에 링크된다. 
    • JVM이 시작되면 bootstrap ClassLoader를 생성하고, 가장 첫번째 클래스 Object를 읽어 온다. (클래스를 언제 JVM에 로딩하고 언로딩하는지에 대해서는 특정한 규칙을 가지고 있다.)
    • 런타임에 동적으로 클래스를 로딩한다는 것은, JVM이 클래스에 대한 정보를 갖고 있지 않다는 것을 의미한다. (한마디로 JVM은 클래스의 메소드, 필드, 상속관계 등에 대한 정보를 알지 못함. → 그래서~ Reflection !! ) 
    • Instantiation
      • In object-oriented programming (OOP), a class of object may be defined.
    • 람다보다 성능이 떨어짐.
      • Class loading이 필요하기 때문에 메모리 할당, 객체 생성이 필요하다. 반면 람다는 런타임시에 특별한 작업이 없다. (invokedynamic은 부하가 없단다...?)
    • 단순히 클래스의 이름이 필요 없고, short body, 1개의 객체만 필요, 선언하자마자 사용할때 등등의 이유로는 익명클래스를 사용한다.

람다
    • InvokeDynamic
    • capture
    • 이외에도 상속, this, scope, variable binding 등 차이점은 많다. 
    • 다음장에서 보다 자세히 설명...


뭐 여러가지 이유가 있지만, 그냥 한마디로  '익명클래스로 동일한 동작을 구현할 수 있지만, 코드가 깔끔하지 않다' 



이번 장의 내용은, 동작을 파라미터화하여 비슷하고 반복적인 작업에 대한 고도화를 이룰수 있다는 정도로 이해하고 다음 챕터에서 자세히 살펴보자.

'개발 > Java' 카테고리의 다른 글

Java - static  (0) 2017.09.06
Java 8 - Stream  (0) 2017.08.11
Java 8 - Lambda Translation  (0) 2017.08.10
Java 8 - 람다 표현식  (2) 2017.08.10
Java 8  (0) 2017.08.10
Comments