112. public class AsyncHelloWorld {
public static void main(String[] args) {
new Thread(() - {
System.out.println(Hello World!);
}).start();
}
}
자바 8 쓰레드 생성
람다식
375. 요약
• 함수형 인터페이스
• 람다식 (인자 목록) - { 구문 블럭 } 또는 (인자 목록) - 식
• 람다식 = 익명 메서드
• 대상 타입
• 매개변수 타입 추론
• 다양한 축약형 람다식
376. 람다식은 뭐에 써 먹는 놈이냐?
https://www.flickr.com/photos/rofi/2097239111/
377. 제어 흐름 중복
assert numbers.length 0;!
!
int max = numbers[0];!
for(int i=1;!
i numbers.length;!
i++)!
if(Math.abs(max) !
Math.abs(numbers[i])!
max = numbers[i];!
return max;!
assert numbers.length 0;!
!
int max = numbers[0];!
for(int i=1; !
i numbers.length; !
i++)!
if(max numbers[i])!
max = numbers[i];!
return max;
378. 템플릿 메소드 패턴
AbstractMaxFinder
public findMax(list)
abstract boolean isLesser(a, b)
NaturalMaxFinder
boolean isLesser(a, b)
AbsNumberMaxFinder
boolean isLesser(a, b)
안 변하는 것
변하는 것
379. 전략 패턴
interface
Camparator
abstract boolean isLesser(a, b)
NaturalNumberComparator
boolean isLesser(a, b)
AbsNumberCamparator
boolean isLesser(a, b)
MaxFinder
public findMax(list)
안 변하는 것
변하는 것
380. • 제어 흐름 재사용
• 코드 중복 제거
• 유연성 향상
• 코드 변경 주기 기준 분리
제어 흐름 추상화
OOP의 제어 흐름 추상화 기법
• 상속을 통한 제어 흐름 추상화: 템플릿 메서드 패턴
• 위임을 통한 제어 흐름 추상화: 전략 패턴
383. •메서드 호출시 값을 인자로 전달하듯 행위를 전달
•런타임에 행위를 전달받아서 미리 정해진 제어 흐름에 따라 수행
•객체가 아닌 메서드(또는 함수) 수준의 제어 흐름 추상화
•객체를 사용하는 방법보다 경량
•함수형의 고차함수(Higher Order Function)
행위 매개변수
(Paramterized Behaviors)
function
452. c)
•모든 코드는 Class 안에 정의되어야 함(함수만 인자로 사용 불가).
•모든 자바 소스 파일에 공개 클래스(public class)나 인터페이스 하나 - 자바 코드 관례
•클래스 이름 작명 필요
•각종 상용구(boilerplate code)
•캡슐화, 간접 접근
자바 객체 사용 비용
494.
});
익명 클래스를 사용한 행위 인자
• 가장 비용이 적게 드는 클래스
• 클래스 정의와 인스턴스 생성이 동시
• 클래스 이름 작명 불필요런
• 클래스 생성자 작성 불필요
• 1 회용 클래스: 클래스 하나에 인스턴스 하나
495. 변수 포획
(Captured Variable)
Button b = new Button(누르시오”);
final TextField text = new TextField(20);
final Counter counter = new Counter();
!
b.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
counter.inc();
text.setText(“버튼 클릭: + counter.count() + 회);
}
});
• 내부 객체는 외부객체의 멤버와 외곽 범주(scope)의 변수 값에 접근 가능
• 내부 객체가 접근할 변수는 final 수정 기호로 고정되어야 함
익명 클래스( + 변수 포획) = 자바식 클로저(Closure)
497. 행위 매개변수의 보급
• 다양한 언어에서 고차함수 지원
• 함수형 프로그래밍 대중화
• 스프링 xxxTemplate
• C# 3.0 람다식 지원 .Net 프레임워크(LINQ) (2007)
• 자바의 수다스러운 구문에 대한 반발: Guava, LambdaJ, Op4j
ListActor
692. 요약
• 제어 흐름의 중복과 추상화
• OOP 방식: OOP is not a one-size-fits-all solution.
• 행위 매개변수를 사용한 제어 흐름 추상화
• 가장 비용이 적게 드는 익명 클래스
• 변수 포획
• 행위 매개변수의 대중화
• 자바, 람다식 지원
705. …⋯)
Collection Stream
외부 반복
External Iteration
내부 반복
Internal Iteration
• 명시적 외부 반복
• 제어 흐름 중복 발생
• 효율적이고 직접적인 요소 처리
• 지저분한 코드
• 유한 데이터 구조 API
• 반복 구조 캡슐화
• 제어 흐름 추상화
• 파이프-필터 기반 API
• 최적화와 알고리듬 분리
• 함축적인 표현
• 무한 연속 데이터 흐름 API
• 데이터 외 I/O, 값 생성 등 적용
762. 중개 연산자 관련 함수형 인터페이스
java.util.function.*
!•!PredicateT T 타입의 인자를 검증해서 boolean 값 반환
boolean test(T t)
!•!ConsumerT T 타입의 인자를 처리
void accept(T t)
!•!FunctionT,R T 타입의 인자를 받아 R 타입의 값으로 변환
R apply(T t)
!•!SupplierT T 타입의 값을 생성해서 반환
T get()
!•!UnaryOperatorT T 타입의 값을 받아 T 타입의 값을 반환
T apply(T t)
!•!BinaryOperatorT T 타입의 두 값을 받아 T타입의 값을 반환
T apply(T t, T u)
824. 지연 연산과 병렬 처리
• 스트림을 반환하는 필터와 맵 연산은 기본적으로 지연(lazy) 연산
• 지연 연산을 통한 성능 최적화 (무상태 중개 연산)
• 종단 연산 시 모든 연산 수행 (반복 작업 최소화)
지연 연산
• 동일한 코드로 순차 연산과 병렬 연산 모두 지원, 선택 가능
• 순차 연산에서 parallel() 메서도로 병렬 연산으로 전환 가능
• Collection.parallelStream()으로 병렬 처리 스트림 생성 가능
• 경고: 스트림 처리 중에는 스트림 요소를 변경하지 마시오!
• 쓰레드 안전하지 않은 컬렉션에서도 병렬처리 수행
병렬 처리
Stream
872. 요약
• 스트림: 컬랙션(Collection) 프레임워크보다 한 단계 더 높은 추상화 제공
• 내부 반복
• 중개 연산: 파이프와 필터, 맵(Map)
• 종단 연산: 결과 생산(Reduce)
• 지연 연산을 통한 최적화
• 병렬 처리 추상화
• 컬랙션 외 다양한 연속적 데이터에 적용
874. 인터페이스 하위 호환성 문제
• 경직된 자바 인터페이스, 메서드 추가 후 하위 호환성 상실
• 인터페이스에 메서드 추가 후 모든 클래스를 다시 컴파일 해야 함
• 공개된 API는 불가능
• 다양한 우회 기법 활용
• 애플리케이션: 하위 호환성 포기(1)
• 자바 SDK: 무수정, 도움 객체 사용(Collections)
• Eclipse: 확장 인터페이스 추가(ISomeRole - ISomeRoleExtension)
• 중도: 기본 추상 클래스를 통한 확장(ISomeRole - AbstractSomeRole)
• 람다식과 함께 대규모로 자바 SDK를 수정하려고 하면서 문제 발생
(1)
876. 기본 메서드(Default Method)
• 인터페이스에 기본 구현 포함 가능, 추가된 인터페이스의 하위 호환성 보장
• default 키워드 사용
• 함수형 인터페이스 조건에서 제외
• 인터페이스 확장시 재구현 또는 추상(abstract)으로 재지정 가능
• 가상 확장 메서드(virtual extension methods) 또는 방어 메서드(defender
methods)라는 이름도 사용
public
957. 기본 메서드와 상속
• 클래스의 구현이 인터페이스의 기본 구현보다 우선
• 가장 구체적인 구현(most specific implementation)에 우선권 부여
• 다이아몬드 문제 발생 가능
• 컴파일 오류 발생(T inherits unrelated defaults for x())
• 명시적인 오버라이드 필요
• 충돌하는 둘 이상의 수퍼타입 중 선호하는 수퍼타입을 선택할 수 있음
• 타입 다중 상속, 행위 다중 상속은 지원하지만 상태 다중 상속은 미지원
interface
1116. 요약
• 인터페이스에 메서드 구현 허용: 기본 메서드, 정적 메서드
• 기본 메서드: 인터페이스 메서드 추가로 인한 하위 호환성 문제 해결
• 정적 메서드: 별도 헬퍼 클래스 불필요
• 자바 5의 정적 메서드 임포트, 정적 메서드, 람다식의 혼용으로 전역 함수
활용 활성화 예상