자바8을 사용해야하는 이유
- 자연어에 가까운 간단한 방식으로 코드 구현 가능
- 병렬 실행 환경의 새롭고 단순한 방식을 지원
예1. 스트림 처리
리눅스 or 유닉스의 경우
cat file1 fil2 | tr "A-Z" "a-z" |sort| tail -2
- sort는 여러행의 스트림을 입력받아 병렬로 처리한다. (->여러행의 스트림을 출력)
- cat, tr, sort, tail은 모두 병렬로서 처리된다.
이처럼 자바8의 스트림 API는 한번에 처리하던 기존방식을 탈히여 병렬로 처리하게끔 도와준다.(스레드 사용X)
예2. 메세지에 코드 전달하기
sort를 처리하는 메서드를 통으로 파라미터로 전달하기
예3. 간결화된 코드(like ::)
/*예시코드(파일 경로 찾기)*/
File[] hiddenFiles = new File(".").listFiles(new FileFilter(){
public boolean accept(File file){
return file.isHidden();
}
});
위의 코드는 굳이 accept 메서드로 묶어서 isHidden()의 결과를 리턴한다.(자바 8이전에는 어쩔수 없음)
내부소스 파헤치기!
aceept로 감싸지 않고 직관적으로 표현하는 방법이 만들어짐.
File[] hiddenFiles = new File(".").listFiles(File::isHidden);
예4. 람다의 등장
난 잘 모르겠다. 위에 :: 처럼 클래스를 만들어서 쓰면 되는 것 아닌가?
하지만 이렇게 한번만 사용하고 쓸 메서드를 사용할때마다 정의하는 것이 비효율적이라고 판단.
(람다식은 위의 문제점을 개선 해줄 수 있음. - 아래코드 참조)
filterApples(inventory, (Appla a) -> "green".equals(a.getColor()));
filterApples(inventory, (Appla a) -> a.getWeight()>150);
filterApples(inventory, (Appla a) -> a.getWeight()>150 || "green".equals(a.getColor()));
- 익명의 클래스로 정의
but! 람다식의 코드가 길어 진다면 이전의 방법으로 "::" 를 써서 사용하자!
예5. 스트림의 등장
[자바 8 이전의 멀티스레드의 문제점]
기존 자바의 문제점 두가지
- 컬렉션을 처리하면서 발생하는 반복적, 모호한 코드 발생
- 멀티코어 활용의 어려움
해당 문제를 [1. 필터링 2.추출 3. 그룹화] 로 해결가능
컬렉션과 스트림의 차이
컬렉션 : 데이터를 어떻게 저장하고 접근할지에 집중
스트림 : 데이터를 어떻게 계산할지에 집중
멀티코어 활용의 어려움의 문제를 스트림이 해결가능 하다.
why?
스트림내의 요소들이 병렬로 쉽게 처리하게금 도와주기 떄문
그럼 스트림은 어떻게 사용하는가?
주요 흐름
컬렉션 -> 스트림(병렬처리) -> 다시 컬렉션변환
예6. 디폴트 메서드
위의 코드는 자바8 이전에는 컴파일 불가 : 리스트가 stream(), parrellelStream()을 지원x
굳이 구현을 해야한다면?
- Collection interface에 stream(), parrellelStream()을 추가
- ArrayList에서 구현
이 방법은 새로운 메서드가 interface에 추가될때마다
해당 interface를 상속받는 모든 class는 추가된 method를 구현해야한다는 단점이 있다.
-> 클래스의 구현이 아닌 interface의 일부로 보는 Defaultmethod 탄생
List<Apple> heavyApples1 =
inventory.stream().filter((Apple a)->a.getWeight()>150)
.collect(toList());
List<Apple> heavyApples2 =
inventory.parallelstream().filter((Apple a)->a.getWeight()>150)
.collect(toList());
동적 파라미터화 (유지보수에 용이)
- 아직 어떻게 실행될지 모르는 코드 실행 block
- 나중에 프로그램에서 호출(like callback?)
자바8 이전의 방식의 한계(예시)
1. 특정 색깔의 사과 필터링
2. 파라미터로 색깔을 받아서 필터링
3. boolean 값을 이용한 필터링
문제점 해결을 위한 도구 : 전략디자인패턴
전략디자인 패턴이란?
캡슐화하는 알고리즘 패밀리를 정의하고 다음 런타임에 알고리즘을 선택
개선사항 : Applepredicate가 다양한 동작을 수행하도록 하기 위해
filterApples 메서드가 Applepredicate를 받도록 설계
결론 : Applepredicate를 상속받는 특정 객체를 filterApples 에 전달하면서
해당메서드의 실행결과를 결정짓는다.
간단하게.. 동작 파라미터화는 메서드를 파라미터로 넘기는 작업이라 할 수 있음.
[익명 클래스로 좀더 가독성 높은 코드를 구현해보자]
나의생각: 익명클래스느 한번쓰고 버릴 코드라 재사용이 힘든데 다형성 문제는 어떻게 해결할 것인가?
- 현재 코드를 1)익명클래스 2) 람다식 으로 바꾸어가는 과정
리스트 형식으로 추상화 : : 현재 code는 Apple만이 동작하도록 한정되어있음.
References
|
'Java > Java8' 카테고리의 다른 글
(JAVA8) 스트림의 활용 (2) (0) | 2020.01.19 |
---|---|
(JAVA8) 람다식 (2) (0) | 2020.01.19 |
(JAVA8) 람다식으로 향하는 과정 (0) | 2020.01.16 |
(JAVA8) 스트림의 개요 (1) (0) | 2020.01.03 |
(JAVA8) 람다식 (1) (0) | 2020.01.03 |