자바8 나머지 공개
description
Transcript of 자바8 나머지 공개
![Page 1: 자바8 나머지 공개](https://reader034.fdocument.pub/reader034/viewer/2022050801/547da911b4af9f8c358b45e3/html5/thumbnails/1.jpg)
박성철
나머지자바 8
람다
이야기
SK Planet, 한국 스프링 사용자 모임(KSUG)
를 제외한
![Page 2: 자바8 나머지 공개](https://reader034.fdocument.pub/reader034/viewer/2022050801/547da911b4af9f8c358b45e3/html5/thumbnails/2.jpg)
박성철(fupfin)
노땅 개발자(라고 착각하는 관리자)
엄청 망해봤어요
산만해요
![Page 3: 자바8 나머지 공개](https://reader034.fdocument.pub/reader034/viewer/2022050801/547da911b4af9f8c358b45e3/html5/thumbnails/3.jpg)
새 날짜 APIDate API
![Page 4: 자바8 나머지 공개](https://reader034.fdocument.pub/reader034/viewer/2022050801/547da911b4af9f8c358b45e3/html5/thumbnails/4.jpg)
기존 날짜와 시간 API
쓰레드에서 안전하지 않음사용하기 불편, Date? Calendar?일관성이 떨어짐어정쩡한 Unixtime의 추상화불규칙한 성능헬로월드 “Java의 날짜와 시간 API” 참고 http://helloworld.naver.com/helloworld/645609
오픈소스 joda-time이 사실상 표준으로 사용
![Page 5: 자바8 나머지 공개](https://reader034.fdocument.pub/reader034/viewer/2022050801/547da911b4af9f8c358b45e3/html5/thumbnails/5.jpg)
새 API의 목표
일관된 API쓰레드에서 안전, 불변값직관적이고 사용하기 편한 APILocalDate.now().with(TemporalAdjusters.lastDayOfMonth()).minusDays(2)관련 표준 준수: ISO-8601, CLDR(Unicode Common Locale Data Repository), TZDB( Time-Zone Database)UTC와 연계된 명시적 시간 척도joda-time 참조도메인 객체, 타입 안전:DayOfWeek,����������� ������������������ HijrahDate,����������� ������������������ HijrahEra,����������� ������������������ Instant,����������� ������������������ IsoEra,����������� ������������������ JapaneseDate,����������� ������������������ JapaneseEra,����������� ������������������ LocalDate,����������� ������������������ LocalDateTime,����������� ������������������ LocalTime,����������� ������������������ MinguoDate,����������� ������������������ MinguoEra,����������� ������������������ Month,����������� ������������������ MonthDay,����������� ������������������ OffsetDateTime,����������� ������������������ OffsetTime,����������� ������������������ ThaiBuddhistDate,����������� ������������������ ThaiBuddhistEra,����������� ������������������ Year,����������� ������������������ YearMonth,����������� ������������������ ZonedDateTime,����������� ������������������ ZoneOffset
![Page 6: 자바8 나머지 공개](https://reader034.fdocument.pub/reader034/viewer/2022050801/547da911b4af9f8c358b45e3/html5/thumbnails/6.jpg)
LocalDate, LocalTime
LocalDate: 특정 지역의 날짜, 시간대 정보 제외LocalTime: 특정일의 시간, 시, 분, 초, 나노(10-9)초 LocalDateTime으로 날짜와 시간 결합 가능다양한 날짜 연산 메서드 제공
생성
현재:LocalDateTime.now()����������� ������������������ 특정일:LocalDate.of(2014,����������� ������������������ Month.JULY,����������� ������������������ 26)unix 시간: LocalDate.ofEpochDay(1406321656)����������� ������������������ 시간:����������� ������������������ LocalTime.of(10,����������� ������������������ 30,����������� ������������������ 50);
![Page 7: 자바8 나머지 공개](https://reader034.fdocument.pub/reader034/viewer/2022050801/547da911b4af9f8c358b45e3/html5/thumbnails/7.jpg)
LocalDate, LocalTime
날짜 연산
with____: 특정 날짜 요소만 변경LocalDateTime.now().withYear(1980)
plus____/minus____: 상대적인 날짜/시간 계산 LocalDateTime.now().plusDays(-10)기간을 나타내는 도메인 객체:����������� ������������������ Duration,����������� ������������������ Period
until____: 기간 계산 start.until(LocalDateTime.now());기간을 나타내는 도메인 객체:����������� ������������������ Duration,����������� ������������������ Period
![Page 8: 자바8 나머지 공개](https://reader034.fdocument.pub/reader034/viewer/2022050801/547da911b4af9f8c358b45e3/html5/thumbnails/8.jpg)
시간대
ZoneId/ZoneOffsetZoneID: 지역 기반 시간대 표시ZoneId.of(“Asia/Seoul”)
LocalDateTime + 시간대LocalDateTime.now().atZone(ZoneId.of(“Asia/Seoul”))
ZoneOffset: 고정 상대값ZoneOffset.of("+9:00")
ZonedDateTime
LocalDateTime/LocalTime + 시간대 시차LocalDateTime.now().atOffset(ZoneOffset.of("+9:00"))
OffsetDateTime/OffsetTime
![Page 9: 자바8 나머지 공개](https://reader034.fdocument.pub/reader034/viewer/2022050801/547da911b4af9f8c358b45e3/html5/thumbnails/9.jpg)
JDBC 날짜/시간 개선
SQL Java 8
날짜 DATE LocalDate
시간 TIME LocalTime
일시 TIMESTAMP LocalDateTime
시간 + 시간대 TIME WITH TIMEZONE OffsetTime
일시 + 시간대 TIMESTAMP WITH TIMEZONE OffsetDateTime
![Page 10: 자바8 나머지 공개](https://reader034.fdocument.pub/reader034/viewer/2022050801/547da911b4af9f8c358b45e3/html5/thumbnails/10.jpg)
동시성 개선concurrency
![Page 11: 자바8 나머지 공개](https://reader034.fdocument.pub/reader034/viewer/2022050801/547da911b4af9f8c358b45e3/html5/thumbnails/11.jpg)
ConcurrentHashMap
computeIfAbsent/computeIfPresent값의 존재 유무에 따라 람다 표현 수행다양한 forEach() 변종 메서드forEach,����������� ������������������ forEachKey,����������� ������������������ forEachValue,����������� ������������������ forEachEntry탐색 메서드search,����������� ������������������ searchKeys,����������� ������������������ searchValues,����������� ������������������ searchEntries환산(Reduction) 메서드용reduce,����������� ������������������ reduceToDouble,����������� ������������������ reduceToLong
람다 관련 편의 메서드 추가
mappingCount(): long 버전의 size()newKeySet(): concurrentHashMap 기반의 Set 생성
기타
![Page 12: 자바8 나머지 공개](https://reader034.fdocument.pub/reader034/viewer/2022050801/547da911b4af9f8c358b45e3/html5/thumbnails/12.jpg)
java.util.concurrent.atomic
AtomicBoolean,����������� ������������������ AtomicInteger,����������� ������������������ AtomicLong,����������� ������������������ AtomicReference 등
동시성 환경에서 원자적으로 처리되는 값 표현 객체
누산기: DoubleAccumulator,����������� ������������������ LongAccumulator계수기: DoubleAdder,����������� ������������������ LongAdder
기존 원자적으로 갱신되는 값 객체
새로 추가된 고성능 누산/계수기
- Java 8 Performance Improvements: LongAdder vs AtomicLong: http://skpla.net/fQAB- Java 8 Concurrency: LongAdder: http://skpla.net/dZfC
LongAdder의 성능 밴치 마크
![Page 13: 자바8 나머지 공개](https://reader034.fdocument.pub/reader034/viewer/2022050801/547da911b4af9f8c358b45e3/html5/thumbnails/13.jpg)
ForkJoinPool
Java 7에 추가된 ExecutorService 구현체범용 최적화 공용 풀 추가: ForkJoinPool.commonPool()성능 개선병렬처리스트림(Parallel Stream) 구현에 사용Arrays.parallelSort(…)에 사용
Is Java 8 the fastest JVM ever? Performance benchmarking of Fork-Join: http://skpla.net/cZSO
성능 밴치 마크
![Page 14: 자바8 나머지 공개](https://reader034.fdocument.pub/reader034/viewer/2022050801/547da911b4af9f8c358b45e3/html5/thumbnails/14.jpg)
StampedLockjava.util.concurrent.locks.StampedLock기존 읽기/쓰기 동시성을 향상을 위해 개발된 ReadWriteLock의 성능 문제 개선읽기, 쓰기 외 낙관적 락(Optimistic Lock) 추가낙관적 락은 쓰기보다 읽기가 많을 때 ReadWriteLock보다 100여배까지 빠름
long����������� ������������������ stamp����������� ������������������ =����������� ������������������ lock.tryOptimisticRead();����������� ������������������ !read();����������� ������������������ ����������� ������������������ ����������� ������������������ if(!lock.validate(stamp)){����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ long����������� ������������������ stamp����������� ������������������ =����������� ������������������ lock.readLock();����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ try����������� ������������������ {����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ read();����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ }����������� ������������������ finally����������� ������������������ {����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ lock.unlock(stamp);����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ }����������� ������������������ }
![Page 15: 자바8 나머지 공개](https://reader034.fdocument.pub/reader034/viewer/2022050801/547da911b4af9f8c358b45e3/html5/thumbnails/15.jpg)
메타 프로그래밍 지원 개선meta programming
![Page 16: 자바8 나머지 공개](https://reader034.fdocument.pub/reader034/viewer/2022050801/547da911b4af9f8c358b45e3/html5/thumbnails/16.jpg)
어노테이션 중복 지정 가능
자바5에서 자바 7까지 어노테이션 중복 지정 불가
자바 8에서는 중복 지정 가능, 암시적 컨테이너 어노테이션 적용@ContainedBy,����������� ������������������ @ContainerFor
@Foo(1)����������� ������������������ @Foo(2)����������� ������������������ //����������� ������������������ error:����������� ������������������ Duplicate����������� ������������������ annotation����������� ������������������ class����������� ������������������ SomeClass{}����������� ������������������ !@Foos({@Foo(1),����������� ������������������ @Foo(2)})����������� ������������������ class����������� ������������������ SomeClass{}
컨테이너 어노테이션을 사용해서 제약 우회
@Foo(1),����������� ������������������ @Foo(2)����������� ������������������ class����������� ������������������ SomeClass{}
@ContainedBy(Foos.class)����������� ������������������ @interface����������� ������������������ Foo����������� ������������������ {����������� ������������������ int����������� ������������������ value();����������� ������������������ }����������� ������������������ !@ContainerFor(Foo.class)����������� ������������������ @interface����������� ������������������ Foos����������� ������������������ {����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ Foo[]����������� ������������������ value();����������� ������������������ }
@interface����������� ������������������ Foo����������� ������������������ {����������� ������������������ int����������� ������������������ value();����������� ������������������ }����������� ������������������ !@interface����������� ������������������ Foos����������� ������������������ {����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ Foo[]����������� ������������������ value();����������� ������������������ }
![Page 17: 자바8 나머지 공개](https://reader034.fdocument.pub/reader034/viewer/2022050801/547da911b4af9f8c358b45e3/html5/thumbnails/17.jpg)
매개변수 메타데이터 리플랙션 지원
자바7까지, 생성자와 메서드의 매개변수 정보를 바이트 코드에서 삭제매개변수 타입 정보 외에는 리플랙션을 통해서 얻을 수 없었음자바 8에 java.lang.reflect.Executable.getParameters() 추가 Executable은 Method와 Constructor의 부모-parameters 컴파일러 옵션으로 활성화매개변수 메타 데이터: Parameter 어노테이션 정보, 수정자, 이름, 타입, 가변인자 여부
![Page 18: 자바8 나머지 공개](https://reader034.fdocument.pub/reader034/viewer/2022050801/547da911b4af9f8c358b45e3/html5/thumbnails/18.jpg)
자바 타입 어노테이션
JSR308자바8부터 타입에도 어노테이션 지정 가능 클래스 인스턴스 생성, 타입 캐스팅, 인터페이스 구현 등에서 사용컴파일러에 타입 확인 프로세서를 추가해서 처리Checker Framework: http://types.cs.washington.edu/checker-framework/자바의 타입 시스템보다 강화된 타입 확인 가능
@NotNull����������� ������������������ String����������� ������������������ notNullString����������� ������������������ =����������� ������������������ ...����������� ������������������ @Email����������� ������������������ String����������� ������������������ email����������� ������������������ =����������� ������������������ ...����������� ������������������ @NotNull����������� ������������������ @NotBlank����������� ������������������ String����������� ������������������ notEmptyString����������� ������������������ =����������� ������������������ ...
new����������� ������������������ @Interned����������� ������������������ MyObject()����������� ������������������ new����������� ������������������ @NonEmpty����������� ������������������ @Readonly����������� ������������������ List<String>(myNonEmptyStringSet)
myString����������� ������������������ =����������� ������������������ (@NonNull����������� ������������������ String)����������� ������������������ myObject;����������� ������������������ query����������� ������������������ =����������� ������������������ (@Untainted����������� ������������������ String)����������� ������������������ str;
변수 선언
객체 생성
타입 캐스팅
![Page 19: 자바8 나머지 공개](https://reader034.fdocument.pub/reader034/viewer/2022050801/547da911b4af9f8c358b45e3/html5/thumbnails/19.jpg)
기타Etc.
![Page 20: 자바8 나머지 공개](https://reader034.fdocument.pub/reader034/viewer/2022050801/547da911b4af9f8c358b45e3/html5/thumbnails/20.jpg)
나즈혼(Nashorn)자바스크립트 엔진
구형 리노(Rhino)를 대체하는 기본 자바스크립트 엔진자바 객체 호출 가능자바 7의 invokedynamic 활용, 성능 향상
$����������� ������������������ $JAVA_HOME/bin/jjs����������� ������������������ jjs>����������� ������������������ print('Hello����������� ������������������ World');
ScriptEngine����������� ������������������ engine����������� ������������������ =����������� ������������������ new����������� ������������������ ScriptEngineManager().getEngineByName("nashorn");����������� ������������������ engine.eval("print('Hello����������� ������������������ World!');");
자바의 스크립트 엔진 매니저를 사용해 실행
터미널에서 jjs 명령을 사용해 실행
Nashorn: The New Rhino on the Block: http://skpla.net/ggNQPerformance: Nashorn vs. Node : http://skpla.net/e9f4
성능 밴치마크
![Page 21: 자바8 나머지 공개](https://reader034.fdocument.pub/reader034/viewer/2022050801/547da911b4af9f8c358b45e3/html5/thumbnails/21.jpg)
java.nio.file.Files
Files.lines(“/to/my/text/file.txt”).filter(s����������� ������������������ ->����������� ������������������ s.length()����������� ������������������ >����������� ������������������ 255).count();
!Files.lines(Path, Charset): 파일을 한 줄씩 읽어 Stream으로 반환Files.lines(Path): lines(Path, Charset)과 동일, UTF-8 사용각종 편의 메서드:Files.readAllLines(Path), Files.newBufferedReader(Path), Files.newBufferedWriter(Path,OpenOption...), Files.write(Path,Iterable,OpenOption...)
![Page 22: 자바8 나머지 공개](https://reader034.fdocument.pub/reader034/viewer/2022050801/547da911b4af9f8c358b45e3/html5/thumbnails/22.jpg)
Base64
String����������� ������������������ asB64����������� ������������������ =����������� ������������������ Base64.getEncoder()����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ .encodeToString(“some����������� ������������������ string".getBytes("utf-8"));����������� ������������������ System.out.println(asB64);����������� ������������������ //����������� ������������������ “c29tZSBzdHJpbmc=“����������� ������������������ !byte[]����������� ������������������ asBytes����������� ������������������ =����������� ������������������ Base64.getDecoder().decode("c29tZSBzdHJpbmc=");����������� ������������������ System.out.println(new����������� ������������������ String(asBytes,����������� ������������������ "utf-8"));����������� ������������������ //����������� ������������������ “some����������� ������������������ string”
기본 Base64 인코딩/디코딩 지원
String����������� ������������������ urlEncoded����������� ������������������ =����������� ������������������ Base64.getUrlEncoder()����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ .encodeToString("subjects?abcd".getBytes("utf-8"));����������� ������������������ System.out.println("Using����������� ������������������ URL����������� ������������������ Alphabet:����������� ������������������ "����������� ������������������ +����������� ������������������ urlEncoded);����������� ������������������ //c3ViamVjdHM_YWJjZA==
URL 인코딩/디코딩, ‘+‘ -> ‘-’, ‘/‘ -> ‘_’
MIME 인코딩/디코딩 지원, 76자 단위로 개행
byte[]����������� ������������������ toEncode����������� ������������������ =����������� ������������������ …⋯����������� ������������������ //매우����������� ������������������ 긴����������� ������������������ 문자열����������� ������������������ String����������� ������������������ mimeEncoded����������� ������������������ =����������� ������������������ Base64.getMimeEncoder().encodeToString(toEncode);����������� ������������������ System.out.println(mimeEncoded);����������� ������������������ !NDU5ZTFkNDEtMDVlNy00MDFiLTk3YjgtMWRlMmRkMWEzMzc5YTJkZmEzY2YtM2Y2My00Y2Q4LTk5����������� ������������������ ZmYtMTU1NzY0MWM5Zjk4ODA5ZjVjOGUtOGMxNi00ZmVjLTgyZjctNmVjYTU5MTAxZWUyNjQ1MjJj����������� ������������������ NDMtYzA0MC00MjExLTk0NWMtYmFiZGRlNDk5OTZhMDMxZGE5ZTYtZWVhYS00OGFmLTlhMjgtMDM1
![Page 23: 자바8 나머지 공개](https://reader034.fdocument.pub/reader034/viewer/2022050801/547da911b4af9f8c358b45e3/html5/thumbnails/23.jpg)
END_OF_FOURTH_WAVE
![Page 24: 자바8 나머지 공개](https://reader034.fdocument.pub/reader034/viewer/2022050801/547da911b4af9f8c358b45e3/html5/thumbnails/24.jpg)
잘못했어요.
용서해 주세요.