JAVA/Modern JAVA 11

[ModernJAVA] Stream이 필요한 이유

컬렉션(Collection)은 데이터를 그룹화시켜 처리할 수 있도록 도와주는 자료구조이다. JAVA는 자료구조에 저장된 데이터를 조작할 수 있도록 Collection 인터페이스를 제공한다. 그러나 문제가 있다. 멀티코어 환경이 대중화 되면서 병렬 프로세스가 중요해졌다. 컬렉션에 저장된 데이터를 여러 스레드에 분산처리하면 높은 성능을 낼 수 있기 때문이다. 그러나 그 과정을 코드로 구현하기란 여간 복잡한 것이 아니다. JAVA는 명령형 프로그래밍이기에, 과정을 하나하나 코드로 구현해야만 한다. 음식 컬렉션을 세 가지 과정을 거쳐 조작해보자. 1) 400 칼로리 이하인 음식으로 필터링 한다. 2) 칼로리가 낮은 순으로 정렬한다. 3) 음식의 이름만 추출한다. 세 가지 과정을 명령형 프로그래밍으로 개발하면 아..

JAVA/Modern JAVA 2024.03.05

[Modern JAVA] 클로저(Closure)란?

JAVA에서 클로저(Closure)란? 클로저(Closure)란, 외부 스코프에 선언된 변수를 다른 스코프 영역에서 참조하는 기술이다. 사실, JAVA에서 클로저는 없는 개념이다. 익명함수 클래스나 람다로 인스턴스를 생성할 때, 외부 스코프 변수를 캡처하여 인스턴스 내부에 저장하는 '캡처링' 기술을 두고, 단순히 클로저라 부르는 것이다. 외부에 선언된 변수를 내부에서 사용하니, 마치 클로저 같은 기능을 하기에 붙여진 이름이다. 외부 변수를 캡처하여 인스턴스에 저장하면, 외부에 있는 데이터와 인스턴스에 저장된 데이터는 서로 동일해야 한다. 만약 둘 중 하나가 변경되면 데이터 멱등성이 훼손되기 때문이다. 그래서 JAVA8 이전에는 캡처링 기술이 적용될 변수는 변경되지 못하도록 final 선언을 강제했다. J..

JAVA/Modern JAVA 2024.01.31

[MODERN JAVA] 람다 깔끔하게 사용하기 ( 메서드 참조 )

람다는 메서드 참조로 깔끔하게 표현될 수 있다. 리스트를 정렬하는 코드를 람다로 표현하면 아래와 같다. 람다표현식 List str = Arrays.asList("a","b","A","B"); str.sort((s1,s2)-> s1.compareToIgnoreCase(s2)); List 인터페이스의 sort 메소드는 Comparator 함수형 인터페이스를 인수로 갖는다. 그럼 람다는 Compartor의 유일한 메서드인 compare()를 람다표현식으로 표현해야 한다. (s1,s2)-> s1.compareToIgnoreCase(s2) 컴파일러는 함수형인터페이스의 함수디스크립터와 람다표현식이 호환되는지 검사한다. 메서드 참조 List str = Arrays.asList("a","b","A","B"); str...

JAVA/Modern JAVA 2023.06.30

[MODERN JAVA] 람다 캡처링 ( Lambda Capturing )

람다 캡처링( Lambda Capturing )을 알아보기 전에, 간단히 JVM의 메모리 구성을 알아보자. JVM은 STACK, HEAP, METHOD 영역으로 메모리 영역이 나뉜다. HEAP 영역은 동적으로 생성된 객체가 저장된다. STACK 영역은 실행된 스레드가 스택 구조로 쌓인다. 이때 스레드는 Heap 영역의 객체에 접근하여 메소드 영역에 저장된 메소드를 실행하는데, 실행된 메소드는 '프레임' 단위로 다시 STACK 영역에 쌓인다. 그럼 위 개념을 숙지하고 람다 캡처링에 대해서 하나씩 알아보자. 이해하기 쉽도록 예를 들어보겠다. 농부가 있다. 농부는 과수원을 운영하는데, 수확한 사과 중 상품성있는 사과를 분류하려고 한다. 농부는 사과분류머신을 사용하였고 사과분류머신은 '무게'로 상품성있는 사과를..

JAVA/Modern JAVA 2023.06.02

[MODERN JAVA] 컴파일러가 보는 람다(Lambda)

람다는 파라미터로 코드를 넘기는 기술이다. 사과를 분류하는 메소드가 있다. 메소드는 사과를 분류하는 로직을 갖는데, 로직은 정부정책에 따라 매번 바뀐다고 가정하자. 매번 바뀌는 로직 때문에 메소드를 매번 수정하기는 번거로우니 분류 로직만 변경하고 싶다. 이때, 로직을 간편하게 넘길 수 있는 기술이 '람다'이다. 파라미터로 '로직'만 넘겨받으면 메소드는 어떤 수정도 할 필요가 없다. 정책에 따라 파라미터로 넘겨받는 로직만 달리하면 되기 때문이다. 그러나 파라미터도 일종의 '변수'로 원시타입이나 참조타입만 들어갈 수 있다. '코드'가 들어갈 수 없다. 그래서 JAVA는 함수형 인터페이스를 사용한다. 함수형 인터페이스란, 메소드가 하나밖에 없는 인터페이스이다. 하나밖에 없는 메소드는 '함수'이다. 람다는 함수..

JAVA/Modern JAVA 2023.06.01

[MODERN JAVA] 람다(Lambda)의 활용 - Predicate, Consumer, Function

[MODERN JAVA] 람다(Lambda)의 활용 - 실행 어라운드 패턴 [MODERN JAVA] 람다(Lambda)란? 파라미터로 값이 아닌 '코드'를 넘겨야 하는 순간이 있다. 이때 사용하는 기술이 '동적 파라미터화'이다. '람다'가 등장하기 전에는 동적 파라미터화는 무겁게 구현되었 lordofkangs.tistory.com 지난 포스팅에서는 람다가 사용되는 패턴을 알아보았다. 이번 포스팅에서는 자바API의 함수형 인터페이스 몇 가지를 알아보겠다. 함수형 인터페이스는 동적파라미터를 구현하기 위한 그릇이다. 동적 파라미터란, 파라미터 인수로 '코드(Code)'를 넘기는 기술로 일회적이거나 로직이 계속 변경되는 경우에 사용된다. Predicate Predicate는 참,거짓을 Return하는 함수형 인..

JAVA/Modern JAVA 2023.03.15

[MODERN JAVA] 람다(Lambda)의 활용 - 실행 어라운드 패턴

[MODERN JAVA] 람다(Lambda)란? 파라미터로 값이 아닌 '코드'를 넘겨야 하는 순간이 있다. 이때 사용하는 기술이 '동적 파라미터화'이다. '람다'가 등장하기 전에는 동적 파라미터화는 무겁게 구현되었다. 1) 구현객체 넘기기 Lis lordofkangs.tistory.com 지난 포스팅에서는 람다의 개념을 알아보았다. 이번 포스팅에서는 람다가 활용되는 예를 알아보겠다. 람다가 활용되는 대표적인 예는 '실행 어라운드 패턴'이다. 실행어라운드패턴 파일처리는 자원을 열고(OPEN) 자원을 처리하고(PROCESS) 자원을 닫는 과정(CLOSE)을 반복한다. 이를 순환패턴이라 한다. 그렇다면 파일을 처리하는 코드는 자원을 설정(SetUp)하고 자원을 처리(Process)하고 자원을 정리(CleanU..

JAVA/Modern JAVA 2023.03.08

[MODERN JAVA] 람다(Lambda)란?

파라미터로 값이 아닌 '코드'를 넘겨야 하는 순간이 있다. 이때 사용하는 기술이 '동적 파라미터화'이다. '람다'가 등장하기 전에는 동적 파라미터화는 무겁게 구현되었다. 1) 구현객체 넘기기 List result1 = getFilteredApples(apples,new ColorPredicate()); // new ColorPredicate() 구현객체 넘기기 List result2 = getFilteredApples(apples,new ColorPredicate()); // new ColorPredicate() 구현객체 넘기기 위와 같이, '코드'를 포함한 구현객체를 파라미터로 넣는 방법이 있고 2) 익명클래스 사용 //Runnable 익명클래스 넘기기 Thread t = new Thread(new R..

JAVA/Modern JAVA 2023.02.14

[MODERN JAVA] 동작 파라미터화 - Comparator,Runnable,Callable

[MODERN JAVA] 동작 파라미터화 - 익명 클래스(Anonymous Class) [MODERN JAVA] 동작 파라미터화 - 전략 디자인 패턴 ( Strategy Pattern ) 변화에 대처 가능한 코드를 짜려면 어떻게 해야할까? 컴파일에 결정되는 코드가 아닌 런타임에 결정되는 코드를 짜야 한다. 대표 lordofkangs.tistory.com 지난 포스팅에서 동적파라미터화를 구현하기 위해 익명클래스를 이용해보았다. 이번 포스팅에서는 익명클래스를 사용하여 동적파라미터화를 구현한 대표적인 예시들을 알아보겠다. Comparator List 클래스는 sort 메소드를 갖는다. List 자료구조 안 객체를 정렬하는 메소드인데, 정렬 기준이 되는 '소스'를 파라미터로 넘기는 동적 파라미터화가 구현되어 있..

JAVA/Modern JAVA 2023.01.25

[MODERN JAVA] 동작 파라미터화 - 익명 클래스(Anonymous Class)

[MODERN JAVA] 동작 파라미터화 - 전략 디자인 패턴 ( Strategy Pattern ) 변화에 대처 가능한 코드를 짜려면 어떻게 해야할까? 컴파일에 결정되는 코드가 아닌 런타임에 결정되는 코드를 짜야 한다. 대표적으로 동작 파라미터화(behavior parameterization)이 있다. 많은 데이 lordofkangs.tistory.com 지난 포스팅에 이어 동작 파라미터화에 대해서 알아보겠다. '동작 파라미터화'란 메소드의 파라미터로 값이 아닌 '코드(Code)'를 넘기는 기술이다. 이전 포스팅에서는 인터페이스를 만들고 구현클래스를 생성하여 동작 파라미터화를 구현했다. 하지만 매번 구현클래스를 생성하는 것도 낭비이다. 단 한 번 파라미터로 코드를 넘기기 위해, 클래스를 생성하는 것은 메..

JAVA/Modern JAVA 2023.01.16