SlideShare a Scribd company logo
1 of 51
Download to read offline
Java.next()
AmbEr와 vAlhAllA 프로젝트를 중심으로...
박성철
자기 소개
* 우아한 형제들(배달의 민족) 인프라 서비스실 담당
* 한국스프링사용자모임(KSUG) 고문(이라 쓰고 홍보 담당이라 읽음)
* 페이스북 자바워키(Javawocky) 그룹 운영
https://www.facebook.com/groups/javawocky/
* 자바를 주로 사용하였었고 스칼라를 좋아만함
* 좋은 개발 문화와 개발 기법에 관심이 많음 (애자일, DevOps 관련)
* 연락처
페이스북: https://www.facebook.com/fupfin.geek
이메일: gyumee@gmail.com
jAvA
jAvA
Java = 언어 + VM + 라이브러리
자바백서: “The Java Language Environment”
언어 관점에서 OpenJDK의 진행중인 프로젝트 살펴 보기
jAvA
Java, 개방형 혁신(Open Innovation)
업계
오픈 소스
커뮤니티
Java
jAvA - 노동자의 언어
“해롭지 말자”
“Java presents a new viewpoint in the evolution of programming languages--
creation of a small and simple language that's still sufficiently comprehensive to
address a wide variety of software application development.”
Java is a blue collar language. It’s not PhD thesis material but a language for a
job. Java feels very familiar to many different programmers because we preferred
tried-and-tested things - James Gosling, “The Feel of Java"
설계목표 == 단순 & 친숙
OpEnJDK
OpEnJDK::소개
# 설립
*2006/5, 썬이 자바원에서 자바를 오픈소스로 전환한다고 공표
*2006/11/13, JVM(HotSpot)과 컴파일러를 먼저 GPL 라이선스로 공개
*2007/5/8, 자바 클래스 라이브러리 GPL로 공개, 첫 OpenJDK 출시
*2007/6, 레드햇 아이스드티(IcedTea) 프로젝트 시작
*2007/11/5, 레드햇 OpenJDK 참여
*2011/7/28, OpenJDK에서 개발한 첫 자바 버전 OpenJDK 7 발표
*2014/3/18, OpenJDK 8 발표, JDK 8의 기반으로 쓰임
#정의
*오픈소스 자바 SE와 관련 프로젝트를 중심으로 한 커뮤니티
*JCP의 자바 규격 요청서(Java Specification Requests;JSR)와 별도로 JDK
개선 제안(JDK Enhancement-Proposal; JEP) 프로세스 운영
*JCP보다 훨씬 다양한 시도를 폭넓고 빠르게 시도
jAvA - 혁신
5
6
78
β
1995
2000
2006
1996 1997 1998
20022004
2011
10 9
201420172018
6 7 8β 1 5
OpenJDK,IBM합류,JDK7출시
ASFvotedNo!
자바라이브러리오픈소스화
레드햇100%오픈소스자바공개TDK통과
더그리교수,OpenJDK운영위원당선
JCP설립
Jakarta시작
JCP2.0개정ASF,JCP합류
MS.NetFramework출시
JBossJCP합류Jboss인증획득,스프링공개
JBoss4.0(최초EJB3),스프링1.0출시
Jakarta해체시작
자바오픈소스화발표
오라클,썬인수자바100%오픈소스화,ASFJCP탈퇴
OpenJDKJDK8출시
JCP,JDK개선
JCP.Next제안
JUGJCP합류
JCP
이해관계자

중심

개방형혁신
오픈소스

개방형혁신
OpEnJDK::개선흐름
# 언어의 현대화
* 표현 간소화 & 함수형 특성 도입
* 다중 코어 시대 대응
* System 자바
# 클라우드
* 시스템 통합;
* 성능 향상, 경량화;
* GC 개선, 관측성 개선
# 다언어용 범용 VM
* 강한 추상화와 시스템 통합을 양 방향으로 동시에 진행
* Macro-instructions (indy), simplified data model (value types)
* Java-on-Java (JSR 292 v2, Panama, Graal , Metropolis)
OpEnJDK::개선흐름
http://2012.33degree.org/pdf/JamesLewisMicroServices.pdf
OpEnJDK::프로젝트
# OpenJDK 프로젝트
* Amber: 언어 문법 간소화
* Valhalla: 값 타입 & 특화 제네릭
* Loom: Continuations & Fibers
* Metropolis: Java-on-Java VM
* Panama: Foreign-Function Interface & Data Layout
* Shenandoah: 극저중단 GC
* ZGC: 확장 가능한 저 응답시간 GC
AmbEr(앰버)
https://en.wikipedia.org/wiki/Amber:_Journeys_Beyond
AmbEr::소개
JEPs = {
JEP 286 지역변수 타입 추론,
JEP 301 열거형 개선,
JEP 302 람다식 잔반 처리,
JEP 305 패턴 매칭,
JEP 325 switch 식,
JEP 326 미가공_문자열
}
AmbEr::지역변수_타입_추론(JEP-286)
# 지속적으로 확대된 타입 추론
* 자바 5: 제네릭 메서드 타입 추론
List<User> empty = Collections.<User>emptyList();
* 자바 7: 다이아몬드 연산자(<>)
List<User> users = new ArrayList<Users>();
* 자바 8: 람다식
users.stream.filter((User user) -> user.getSurName().equals(“park”)) ……
# 자바 10: 지역변수 타입 추론
var users = VisitorRegister.getVisitors();
AmbEr::지역변수_타입_추론(JEP-286)
# 사용법
Collector<UserProfile, ?,
Map<Integer, Map<String, List<UserProfile>>>> groupingCollector =
Collectors.groupingBy(UserProfile::getAge,
Collectors.groupingBy(UserProfile::getCity));
var groupingCollector =
Collectors.groupingBy(UserProfile::getAge,
Collectors.groupingBy(UserProfile::getCity));
# 람다식(JEP 323)
BinaryOperator<Processor, String> op = (var x, var y) -> x.process(y);
BinaryOperator<Processor, String> op =
(@Nonnull var x, @Nullable var y) -> x.process(y)
AmbEr::지역변수_타입_추론(JEP-286)
# 제약
// 필드와 메서드의 반환 타입
class MyClass {
var field = 0;
……
public var getAttribute() { …… };
}
// null 값 지정
var model;
model = “Gundam MkII”;
// 두 변수 이상 선언
var i = 0, j = 0;
// 중복 타입 추론
var dict = new HashMap<>();
AmbEr::지역변수_타입_추론(JEP-286)
var? val? let?
23.65%
48.14%
14.04%
https://ko.surveymonkey.com/results/SM-FLWGS5PW/
AmbEr::미가공_문자열(JEP-326)
JEPs = {
JEP 286 지역변수 타입 추론,
JEP 301 열거형 개선,
JEP 302 람다식 잔반 처리,
JEP 305 패턴 매칭,
JEP 325 switch 식,
JEP 326 미가공_문자열
}
AmbEr::미가공_문자열(JEP-326)
//특수기호 후처리 없는 문자열
// 불필요한 후처리(escaping) 제거
out.println(“this".matches("wwww"));
out.println("this".matches(`wwww`));
// 자바 코드에 타 언어 소스나 틀을 맞춘 문서를 그대로 삽입
String script = "function hello() {n" +
" print('"Hello World"');n" +
"}n" +
"n" +
"hello();n";
String script = `
function hello() {
print('"Hello World"');
}
hello();
`
AmbEr::미가공_문자열(JEP-326)
# 특징
- 짝맞춤을 통해 미처리 문자열 내 “`” 문자 허용,
- 개행문자를 제외한 모든 문자를 처리 없이 그대로 사용,
- 후처리를 위한 String 클래스에 escape() 메서드 추가,
- 아직 JEP 처리 상태는 Candidate라 향후 변경 가능성이 큼
# 다양한 사용 예
`"` // a string containing " alone
``can`t`` // a string containing 'c', 'a', 'n', '`' and 't'
`This is a string` // a string containing 16 characters
`n` // a string containing '' and 'n'
`u2022` // a string containing '', 'u', '2', '0', '2' and '2'
`This is a
two-line string` // a single string constant
AmbEr::Switch식(JEP-325)
JEPs = {
JEP 286 지역변수 타입 추론,
JEP 301 열거형 개선,
JEP 302 람다식 잔반 처리,
JEP 305 패턴 매칭,
JEP 325 switch 식,
JEP 326 미가공_문자열
}
AmbEr::Switch식(JEP-325)
# Switch 문? Switch 식?
* 식 == 연산 후 값 반환
* if 문
if(조건식) { … } else { … }
var result = if(조건식) { … } else { … } //(x)
* 삼항연산자를 사용한 식
var result = 조건식 ? 값1 : 값2; //(0)
* 지금까지 자바에서 swtich는 문이었으나 식으로도 사용 가능
AmbEr::Switch식(JEP-325)
//switch 문
int numDays = 0;
switch (month) {
case 1: case 3: case 5:
case 7: case 8: case 10:
case 12:
numDays = 31;
break;
case 4: case 6:
case 9: case 11:
numDays = 30;
break;
case 2:
if (((year % 4 == 0) &&
!(year % 100 == 0))
|| (year % 400 == 0))
numDays = 29;
else
numDays = 28;
break;
}
//switch 식
int numDays = switch (month) {
case 1, 3, 5, 7, 8, 10, 12 -> 31;
case 4, 6, 9, 11 -> 30
case 2 ->
(((year % 4 == 0) &&
!(year % 100 == 0))
|| (year % 400 == 0)) ?
29 : 28;
}
간략해진 코드
AmbEr::패턴 매칭
JEPs = {
JEP 286 지역변수 타입 추론,
JEP 301 열거형 개선,
JEP 302 람다식 잔반 처리,
JEP 305 패턴 매칭,
JEP 325 switch 식,
JEP 326 미가공_문자열
}
AmbEr::패턴 매칭::데이터_클래스
# 자바 객체의 다양한 용도
* “구조체”, // C, 파스칼
* “값”, // Integer, Long, Boolean, Double
* “데이터 전달 객체(DTO)”,
* “객체”, // OOP의 최소 단위, 데이터보다는 행위 기준
* “컴포넌트”
# 구조체/데이터 전달 객체로서의 일반적인 자바 객체
public class Coordinate {
private double lat;
private double lon;
public Coordinate(double lat, double lon) {
this.lat = lat;
this.lon = lon;
}
// Getters/Setters, toString(), equals(), hashCode(), etc. 필요
}
AmbEr::패턴 매칭::데이터_클래스
대수적 자료형(algebraic data types)
//스칼라 케이스 클래스
case class Coordinate (lat: Double, lon : Double)
//코틀린 데이터 클래스
data class Coordinate(val lat: Double, val lon: Double)
//자바 데이터 클래스 (안)
record Coordinate(double lat, double lon) {}
//사용 예: 산술식
interface Exp { }
abstract record BinOpExp(Exp left, Exp right) implements Exp {};
abstract record UnOpExp(Exp exp) implements Exp {};
record PlusExp(Exp left, Exp right) extends BinOpExp(left, right) {};
record SubExp(Exp left, Exp right) extends BinOpExp(left, right) {};
record MulExp(Exp left, Exp right) extends BinOpExp(left, right) {};
record DivExp(Exp left, Exp right) extends BinOpExp(left, right) {};
record NegExp(int constant) implements Exp {};
record IntExp(int constant) implements Exp {};
AmbEr::패턴매칭
# 패턴매칭 == Switch식 + 타입 비교
interface Shape {};
record Point(int x, int y) implements Shape;
record Circle(Point center, int radius) implements Shape;
……
Canvas newCanvas;
// 기존 if를 사용한 타입 확인 방식
if(shape instanceOf Point) {
Point pt = (Point) shape;
newCanvas = canvas.drawPoint(pt.x, pt.y);
}
else if (shape instanceOf Circle) {
Circle cir = (Circle) shape;
newCanvas = canvas.drawCircle(cir.center.x, cir.center.y, cir.radius);
}
else if (shape instanceOf Rectangle) {
……
}
else if (shape ……
AmbEr::패턴매칭
# 패턴매칭 == Switch식 + 타입 비교
// Switch 식을 이용한 타입 확인 방식
Canvas newCanvas =
switch(shape) {
case Point pt -> canvas.drawPoint(pt.x, pt.y);
case Circle cir -> canvas.drawCircle(cir.center.x, cir.center.y,
cir.radius);
case Rectangle rct -> ……
……
default -> canvas;
}
AmbEr::패턴매칭
# 패턴매칭 == Switch식 + 타입 비교 + 객체 분해
객체를 분해해서 생성자 인자값을 다시 꺼내서 변수에 할당
interface Exp { }
abstract record BinOpExp(Exp left, Exp right) implements Exp;
record PlusExp(Exp left, Exp right) extends BinOpExp(left, right);
record SubExp(Exp left, Exp right) extends BinOpExp(left, right);
record IntExp(int constant) implements Exp;
……
int eval(Exp e) {
return switch(e) {
case IntExp(var i) -> i;
case PlusExp(var l, var r) -> eval(l) + eval(r);
case SubExp(var l, var r) -> eval(l) - eval(r);
……
}
AmbEr::패턴매칭
# 비지터 패턴이었다면...
interface Exp { accept(ExpVisitor visitor); }
record IntExp(int constant) implements Exp { … }
record PlusExp(Exp left, Exp right) implements Exp {
public int accept(ExpVisitor visitor) { return visit(this); }
}
record SubExp(Exp left, Exp right) implements Exp { … }
……
class ExpVisitor {
public int visit(IntExp e) {
return e.constant;
}
public int visit(PlusExp e) {
return e.left.accept(this) + e.right.accept(this);
}
public int visit(SubExp e) { … }
……
}
AmbEr::패턴매칭
# 패턴매칭 == Switch식 + 타입 비교 + 객체 분해 + 값 비교
객체를 분해해 얻는 생성자 인자값과 패턴에 주어진 값을 비교
#유클리드 호제법 예제
2개의 자연수(또는 정식) a, b에 대해서 a를 b로 나눈 나머지를 r이라 하면(단, a>b), a와 b의
최대공약수는 b와 r의 최대공약수와 같다.
gcd(a, 0) = a
gcd(a, b) = gcd(b, a mod b)
int gcd(Pair pair) {
return switch(pair) {
case Pair(var a, 0) -> a;
case Pair(var a, var b) -> gcd(Pair.of(b, a % b));
}
AmbEr::패턴매칭
# 패턴매칭 == Switch식 + 타입 비교 + 객체 분해 + 값 비교
패턴을 중첩해서 적용할 수 있음
Exp simplify(Exp exp) {
return switch(exp) {
case IntExp -> exp;
case NegExp(var e) -> new NegExp(simplify(e));
case NegExp(NegExp(var e)) -> simplify(e);
case PlusExp(IntExp(0), var e),
PlusExp(var e, IntExp(0)),
SubExp(IntExp(0), var e),
SubExp(var e, IntExp(0)) -> simplify(e);
case PlusExp(var l, var r) -> new PlusExp(simplify(l), simplify(r));
case SubExp(var l, IntExp(0)) -> simplify(l);
case SubExp(var l, var r) -> new SubExp(simplify(l), simplify(r));
};
}
vAhAllA(발할라)
vAhAllA::소개
JEPs = {
JEP 169: 값 객체
JEP 218: 원시타입 제네릭(제네릭 특화)
JEP 193: 변수 핸들
}
자바 제네릭의 한계를 극복하고 참조 타입 때문에 발생하는 자바 성능을 개선
vAhAllA::기존자바타입
자바의 타입 = {원시 타입, 참조 타입}
원시 타입 = {boolean, byte, char, short, int, long, float, double}
참조 타입 = {모든 객체, 배열}
* 비효율적인 참조 타입에 의존
* 힙 메모리 정리(GC)가 복잡해짐
* 원시 타입을 대응하는 객체로 변환(boxing)/복원(unboxing)하는 비용 발생
변수
데이터
데이터
변수
변수
참조
참조
참조
vAhAllA::값타입
Rational[] rationals = …
객체 참조
객체 참조
객체 참조
분모
분자
분모
분자
분모
분자
배열
객체
객체
객체
분모
분자
분모
분자
분모
분자
배열
vAhAllA::값타입
“코드는 클래스 같지만 동작은 값처럼”
* 데이터의 일렬, 밀집 배열
* 원시타입과 참조타입의 간극 채움
* 기존 참조타입(L-타입)에 새로운 값 타입(Q-타입)을 JVM에 추가
문법
value class Rational {
final int numer; // 분자
final int denom; // 분모
}
* 작은 구조체에 적합: 복소수, 좌표, 도형, 튜플
* 불변(Immutable)
* 동시성 환경에 유리
* GC에 유리
* 자바 원시 타입 외 시스템 고유의 자료 타입 표현 가능(ex, int128)
vAhAllA::자바_제네릭
#참조 타입만 허용하는 자바 제네릭
List<int> primeNums = new ArrayList<>(); // compile error
#타입 소거
* 자바 제네릭은 컴파일러 기술
* 타입 매개변수 값은 소거되어 VM은 정보를 알지 못함 (하위호환성)
ArrayList<String>();
ArrayList<Integer>();
ArrayList<User>();
ArrayList<Point>();
ArrayList.class
ArrayList.class
ArrayList.class
ArrayList.class
소스코드 JVM
컴파일
vAhAllA::제네릭_특화
# 값타입에 맞게 동적으로 클래스 변조
ArrayList<int>();
ArrayList<Rational>();
ArrayList<Complex>();
ArrayList${T=int}.class
ArrayList${T=Rational}.class
ArrayList${T=Complex}.class
소스코드 JVM
컴파일
# C++ 템플릿 비교
* C++ 템플릿은 제네릭 특화처럼 매 적용마다 별도 코드를 생성
* 자바 제네릭 특화는 런타임에 동작, C++ 컴파일 시점에 동작
* 자바 제네릭은 타입 매개변수에만 적용
* 참조 타입에는 기존처럼 타입 소거 적용
# 포인터 다형성 vs 표상(representation) 다형성
vAhAllA::값_기반_클래스
# 값 기반 클래스(Value Based Class)
* 자바 8에 도입된 클래스 규격
*final이고 값이 변해서는 안됨
*값 변경 가능 객체를 참조할 수는 있음
*equals, hashCode, toString은 상태로만 계산해야 하며 식별자를 써서는 안됨
*equals()로만 동치성을 비교해야 하며 동일성(==)은 보장 안함
*팩토리 메서드를 사용해서만 객체를 생성해야 함
*동치인 두 객체에는 행동이 언제나 동일해야 함
*식별자 기반 작업은 예측할 수 없는 결과 발생 가능 (동기화, 직렬화 등)
//java.util
Optional, OptionalDouble, OptionalLong, OptionalInt
//java.time
Duration, Instant, LocalDate, LocalDateTime, LocalTime, MonthDay, OffsetDateTime, OffsetTime,
Period, Year, YearMonth, ZonedDateTime, ZoneId, ZoneOffset
//java.time.chrono
HijrahDate, JapaneseDate, MinguaDate, ThaiBuddhistDate
vAhAllA::최소_값_타입(Minimal Value Type)
# 최소 값 타입
* 발할라(Vahalla) 프로젝트의 첫 가시적 결과, 부분 집합
* indy와 같이 “VM 먼저, 언어는 나중” 접근 방식(언어와 VM의 분리)
* 자바 문법 변화 없음
* 값 가능 클래스: @jdk.incubator.mvt.ValueCapableClass
* JVM 내부적으로만 값 타입 동작 (선택가능)
* 값 기반 클래스를 JVM의 1등급 구성체로 취급
* java -Xverify:none -XX:+EnableMVT <Test>
vAhAllA::VCC_&_DVC
# 값 가능 클래스
* 클래스는 final로 상속 불가
* 인터페이스가 아닌 일반 클래스
* Object를 직접 상속해야 함
* 멤버 필드는 모두 final로 변경 불가
* equals, hashCode, toString을 재정의(Override)
* clone과 finalize는 재정의하지 말아야 함
#파생 값 타입
* 값 타입으로 표시됨
* 값 가능 클래스에서 유도된 새 이름이 주어짐
* VCC의 상속 타입은 제거됨
* VCC의 모든 메서드와 생성자는 제거됨
* 멤버필드는 변경 없이 유지
VCC소스코드
VCC클래스파일
DVC메모리의 클래스 VCC메모리의 클래스
컴파일
클래스로더
VCC 값 가능 클래스
DVC 파생 값 클래스
vAhAllA::최소_값_타입_성능
# valuetypifier
* 자바 8 코드를 값 타입 관련 opcode로 변경하는 도구
* https://github.com/forax/valuetypify
// 코드
ColorList list = new ColorList();
for(int i = 0; i < 1_000_000; i++) {
list.add(new Color(i, i, i));
}
// 결과 (참조 타입)
Color(2.2517998E7, 2.2517998E7, 2.2517998E7)
creation time 2886.933223 ms
average time 606.217409 ms
// 결과 (값 타입)
Color(2.2517998E7, 2.2517998E7, 2.2517998E7)
creation time 1039.692931 ms
average time 70.152561 ms
lOOm (룸)
https://en.wikipedia.org/wiki/Loom_(video_game)
lOOm::화이버
#컨티뉴에이션(Continuation; 지속, 연속)
* 작업 단위
* 중단 후 재실행 가능
# 화이버(Fiber)
* 자바가 관리하는 경량 쓰레드 (쓰레드는 OS가 관리)
* 쓰레드처럼 동작하지만 쓰레드보다 훨씬 가볍게 동작
* 컨티뉴에이션을 관리
* 서버는 대부분 시간을 IO 응답을 기다리지만 쓰레드는 너무 무거움
* 쓰레드를 추상화해 사용하는 비동기 모델은 복잡함 (액터, 반응형 프로그래
밍 등)
* 동기 방식과 유사하게 확장 가능한 프로그래밍 작성 가능
* 기존 코드를 훨씬 가볍게 돌릴 수 있는 파이버가 필요
정리
lOOm::화이버
# Java & OpenJDK
# Amber
*지역변수_타입_추론(JEP-286)
*미가공_문자열(JEP-326)
*데이터 클래스
*패턴 매칭
# Vahalla
*값 타입
*제네릭 특화
*최소 값 타입
# Loom
*화이버
자바 9.0
https://recruit.woowahan.com/

More Related Content

What's hot

자바8 람다 나머지 공개
자바8 람다 나머지 공개자바8 람다 나머지 공개
자바8 람다 나머지 공개Sungchul Park
 
프론트엔드스터디 E05 js closure oop
프론트엔드스터디 E05 js closure oop프론트엔드스터디 E05 js closure oop
프론트엔드스터디 E05 js closure oopYoung-Beom Rhee
 
java 8 람다식 소개와 의미 고찰
java 8 람다식 소개와 의미 고찰java 8 람다식 소개와 의미 고찰
java 8 람다식 소개와 의미 고찰Sungchul Park
 
[D2 COMMUNITY] ECMAScript 2015 S67 seminar - 1. primitive
[D2 COMMUNITY] ECMAScript 2015 S67 seminar - 1. primitive[D2 COMMUNITY] ECMAScript 2015 S67 seminar - 1. primitive
[D2 COMMUNITY] ECMAScript 2015 S67 seminar - 1. primitiveNAVER D2
 
자바8 람다식 소개
자바8 람다식 소개자바8 람다식 소개
자바8 람다식 소개beom kyun choi
 
Java 변수자료형
Java 변수자료형Java 변수자료형
Java 변수자료형Hyosang Hong
 
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍Young-Beom Rhee
 
Javascript 교육자료 pdf
Javascript 교육자료 pdfJavascript 교육자료 pdf
Javascript 교육자료 pdfHyosang Hong
 
자바8 스트림 API 소개
자바8 스트림 API 소개자바8 스트림 API 소개
자바8 스트림 API 소개beom kyun choi
 
헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리은숙 이
 
0.javascript기본(~3일차내)
0.javascript기본(~3일차내)0.javascript기본(~3일차내)
0.javascript기본(~3일차내)Sung-hoon Ma
 
Javascript 완벽 가이드 정리
Javascript 완벽 가이드 정리Javascript 완벽 가이드 정리
Javascript 완벽 가이드 정리ETRIBE_STG
 
Lambda 란 무엇인가
Lambda 란 무엇인가Lambda 란 무엇인가
Lambda 란 무엇인가Vong Sik Kong
 
파이썬+함수이해하기 20160229
파이썬+함수이해하기 20160229파이썬+함수이해하기 20160229
파이썬+함수이해하기 20160229Yong Joon Moon
 
Java8 & Lambda
Java8 & LambdaJava8 & Lambda
Java8 & Lambda기현 황
 

What's hot (20)

자바8 람다 나머지 공개
자바8 람다 나머지 공개자바8 람다 나머지 공개
자바8 람다 나머지 공개
 
프론트엔드스터디 E05 js closure oop
프론트엔드스터디 E05 js closure oop프론트엔드스터디 E05 js closure oop
프론트엔드스터디 E05 js closure oop
 
java 8 람다식 소개와 의미 고찰
java 8 람다식 소개와 의미 고찰java 8 람다식 소개와 의미 고찰
java 8 람다식 소개와 의미 고찰
 
[D2 COMMUNITY] ECMAScript 2015 S67 seminar - 1. primitive
[D2 COMMUNITY] ECMAScript 2015 S67 seminar - 1. primitive[D2 COMMUNITY] ECMAScript 2015 S67 seminar - 1. primitive
[D2 COMMUNITY] ECMAScript 2015 S67 seminar - 1. primitive
 
자바8 람다식 소개
자바8 람다식 소개자바8 람다식 소개
자바8 람다식 소개
 
MVP 패턴 소개
MVP 패턴 소개MVP 패턴 소개
MVP 패턴 소개
 
iOS 메모리관리
iOS 메모리관리iOS 메모리관리
iOS 메모리관리
 
Java 변수자료형
Java 변수자료형Java 변수자료형
Java 변수자료형
 
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍
 
Javascript 교육자료 pdf
Javascript 교육자료 pdfJavascript 교육자료 pdf
Javascript 교육자료 pdf
 
자바8 스트림 API 소개
자바8 스트림 API 소개자바8 스트림 API 소개
자바8 스트림 API 소개
 
헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리
 
자바 8 학습
자바 8 학습자바 8 학습
자바 8 학습
 
0.javascript기본(~3일차내)
0.javascript기본(~3일차내)0.javascript기본(~3일차내)
0.javascript기본(~3일차내)
 
Java lambda
Java lambdaJava lambda
Java lambda
 
Java class
Java classJava class
Java class
 
Javascript 완벽 가이드 정리
Javascript 완벽 가이드 정리Javascript 완벽 가이드 정리
Javascript 완벽 가이드 정리
 
Lambda 란 무엇인가
Lambda 란 무엇인가Lambda 란 무엇인가
Lambda 란 무엇인가
 
파이썬+함수이해하기 20160229
파이썬+함수이해하기 20160229파이썬+함수이해하기 20160229
파이썬+함수이해하기 20160229
 
Java8 & Lambda
Java8 & LambdaJava8 & Lambda
Java8 & Lambda
 

Similar to Java.next

EcmaScript6(2015) Overview
EcmaScript6(2015) OverviewEcmaScript6(2015) Overview
EcmaScript6(2015) Overviewyongwoo Jeon
 
C Language I
C Language IC Language I
C Language ISuho Kwon
 
Scala, Scalability
Scala, ScalabilityScala, Scalability
Scala, ScalabilityDongwook Lee
 
Angular2 가기전 Type script소개
 Angular2 가기전 Type script소개 Angular2 가기전 Type script소개
Angular2 가기전 Type script소개Dong Jun Kwon
 
Es2015 Simple Overview
Es2015 Simple OverviewEs2015 Simple Overview
Es2015 Simple OverviewKim Hunmin
 
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)Circulus
 
파이썬 스터디 2주차
파이썬 스터디 2주차파이썬 스터디 2주차
파이썬 스터디 2주차Han Sung Kim
 
스칼라와 스파크 영혼의 듀오
스칼라와 스파크 영혼의 듀오스칼라와 스파크 영혼의 듀오
스칼라와 스파크 영혼의 듀오Taeoh Kim
 
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기Chris Ohk
 
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)Sang Don Kim
 
Mean 스택을 사용한 IoT 개발
Mean 스택을 사용한 IoT 개발Mean 스택을 사용한 IoT 개발
Mean 스택을 사용한 IoT 개발Jay Park
 
ECMAScript 6의 새로운 것들!
ECMAScript 6의 새로운 것들!ECMAScript 6의 새로운 것들!
ECMAScript 6의 새로운 것들!WooYoung Cho
 
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)JiandSon
 
정규표현식 Regular expression (regex)
정규표현식 Regular expression (regex)정규표현식 Regular expression (regex)
정규표현식 Regular expression (regex)Sunyoung Kim
 

Similar to Java.next (20)

EcmaScript6(2015) Overview
EcmaScript6(2015) OverviewEcmaScript6(2015) Overview
EcmaScript6(2015) Overview
 
ES6 for Node.js Study 2주차
ES6 for Node.js Study 2주차ES6 for Node.js Study 2주차
ES6 for Node.js Study 2주차
 
C Language I
C Language IC Language I
C Language I
 
Scala, Scalability
Scala, ScalabilityScala, Scalability
Scala, Scalability
 
Scalability
ScalabilityScalability
Scalability
 
Angular2 가기전 Type script소개
 Angular2 가기전 Type script소개 Angular2 가기전 Type script소개
Angular2 가기전 Type script소개
 
Regex
RegexRegex
Regex
 
Es2015 Simple Overview
Es2015 Simple OverviewEs2015 Simple Overview
Es2015 Simple Overview
 
Java8 람다
Java8 람다Java8 람다
Java8 람다
 
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
 
파이썬 스터디 2주차
파이썬 스터디 2주차파이썬 스터디 2주차
파이썬 스터디 2주차
 
스칼라와 스파크 영혼의 듀오
스칼라와 스파크 영혼의 듀오스칼라와 스파크 영혼의 듀오
스칼라와 스파크 영혼의 듀오
 
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
 
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
 
Mean 스택을 사용한 IoT 개발
Mean 스택을 사용한 IoT 개발Mean 스택을 사용한 IoT 개발
Mean 스택을 사용한 IoT 개발
 
ECMAScript 6의 새로운 것들!
ECMAScript 6의 새로운 것들!ECMAScript 6의 새로운 것들!
ECMAScript 6의 새로운 것들!
 
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)
 
06장 함수
06장 함수06장 함수
06장 함수
 
Java tutorial
Java tutorialJava tutorial
Java tutorial
 
정규표현식 Regular expression (regex)
정규표현식 Regular expression (regex)정규표현식 Regular expression (regex)
정규표현식 Regular expression (regex)
 

More from Sungchul Park

애자일 안한 이야기
애자일 안한 이야기애자일 안한 이야기
애자일 안한 이야기Sungchul Park
 
Java null survival guide
Java null survival guideJava null survival guide
Java null survival guideSungchul Park
 
변경에 강한 애플리케이션, 유기적 애플리케이션
변경에 강한 애플리케이션, 유기적 애플리케이션변경에 강한 애플리케이션, 유기적 애플리케이션
변경에 강한 애플리케이션, 유기적 애플리케이션Sungchul Park
 
자바 서버 애플리케이션 아키텍처 안티 패턴
자바 서버 애플리케이션 아키텍처 안티 패턴자바 서버 애플리케이션 아키텍처 안티 패턴
자바 서버 애플리케이션 아키텍처 안티 패턴Sungchul Park
 
스프링보다 중요한 스프링 이야기
스프링보다 중요한 스프링 이야기스프링보다 중요한 스프링 이야기
스프링보다 중요한 스프링 이야기Sungchul Park
 
Beyond Java: 자바 8을 중심으로 본 자바의 혁신
Beyond Java: 자바 8을 중심으로 본 자바의 혁신Beyond Java: 자바 8을 중심으로 본 자바의 혁신
Beyond Java: 자바 8을 중심으로 본 자바의 혁신Sungchul Park
 
스프링 코어 강의 3부 - 웹 애플리케이션 아키텍처
스프링 코어 강의 3부 - 웹 애플리케이션 아키텍처 스프링 코어 강의 3부 - 웹 애플리케이션 아키텍처
스프링 코어 강의 3부 - 웹 애플리케이션 아키텍처 Sungchul Park
 
스프링 코어 강의 2부 - Java 구성을 활용한 스프링 코어 사용
스프링 코어 강의 2부 - Java 구성을 활용한 스프링 코어 사용스프링 코어 강의 2부 - Java 구성을 활용한 스프링 코어 사용
스프링 코어 강의 2부 - Java 구성을 활용한 스프링 코어 사용Sungchul Park
 
스프링 코어 강의 1부 - 봄 맞이 준비 운동
스프링 코어 강의 1부 - 봄 맞이 준비 운동스프링 코어 강의 1부 - 봄 맞이 준비 운동
스프링 코어 강의 1부 - 봄 맞이 준비 운동Sungchul Park
 
자바8 나머지 공개
자바8 나머지 공개자바8 나머지 공개
자바8 나머지 공개Sungchul Park
 
Open Source가 바꾼 자바
Open Source가 바꾼 자바Open Source가 바꾼 자바
Open Source가 바꾼 자바Sungchul Park
 

More from Sungchul Park (16)

애자일 안한 이야기
애자일 안한 이야기애자일 안한 이야기
애자일 안한 이야기
 
Java null survival guide
Java null survival guideJava null survival guide
Java null survival guide
 
변경에 강한 애플리케이션, 유기적 애플리케이션
변경에 강한 애플리케이션, 유기적 애플리케이션변경에 강한 애플리케이션, 유기적 애플리케이션
변경에 강한 애플리케이션, 유기적 애플리케이션
 
자바 서버 애플리케이션 아키텍처 안티 패턴
자바 서버 애플리케이션 아키텍처 안티 패턴자바 서버 애플리케이션 아키텍처 안티 패턴
자바 서버 애플리케이션 아키텍처 안티 패턴
 
스프링보다 중요한 스프링 이야기
스프링보다 중요한 스프링 이야기스프링보다 중요한 스프링 이야기
스프링보다 중요한 스프링 이야기
 
Geeks at SK Planet
Geeks at SK PlanetGeeks at SK Planet
Geeks at SK Planet
 
Beyond Java: 자바 8을 중심으로 본 자바의 혁신
Beyond Java: 자바 8을 중심으로 본 자바의 혁신Beyond Java: 자바 8을 중심으로 본 자바의 혁신
Beyond Java: 자바 8을 중심으로 본 자바의 혁신
 
Java the good parts
Java the good partsJava the good parts
Java the good parts
 
스프링 코어 강의 3부 - 웹 애플리케이션 아키텍처
스프링 코어 강의 3부 - 웹 애플리케이션 아키텍처 스프링 코어 강의 3부 - 웹 애플리케이션 아키텍처
스프링 코어 강의 3부 - 웹 애플리케이션 아키텍처
 
스프링 코어 강의 2부 - Java 구성을 활용한 스프링 코어 사용
스프링 코어 강의 2부 - Java 구성을 활용한 스프링 코어 사용스프링 코어 강의 2부 - Java 구성을 활용한 스프링 코어 사용
스프링 코어 강의 2부 - Java 구성을 활용한 스프링 코어 사용
 
스프링 코어 강의 1부 - 봄 맞이 준비 운동
스프링 코어 강의 1부 - 봄 맞이 준비 운동스프링 코어 강의 1부 - 봄 맞이 준비 운동
스프링 코어 강의 1부 - 봄 맞이 준비 운동
 
자바8 나머지 공개
자바8 나머지 공개자바8 나머지 공개
자바8 나머지 공개
 
팀장 잔소리
팀장 잔소리팀장 잔소리
팀장 잔소리
 
Open Source가 바꾼 자바
Open Source가 바꾼 자바Open Source가 바꾼 자바
Open Source가 바꾼 자바
 
Work With Engineer
Work With EngineerWork With Engineer
Work With Engineer
 
DDD 산책
DDD 산책DDD 산책
DDD 산책
 

Java.next

  • 2. 자기 소개 * 우아한 형제들(배달의 민족) 인프라 서비스실 담당 * 한국스프링사용자모임(KSUG) 고문(이라 쓰고 홍보 담당이라 읽음) * 페이스북 자바워키(Javawocky) 그룹 운영 https://www.facebook.com/groups/javawocky/ * 자바를 주로 사용하였었고 스칼라를 좋아만함 * 좋은 개발 문화와 개발 기법에 관심이 많음 (애자일, DevOps 관련) * 연락처 페이스북: https://www.facebook.com/fupfin.geek 이메일: gyumee@gmail.com
  • 4. jAvA Java = 언어 + VM + 라이브러리 자바백서: “The Java Language Environment” 언어 관점에서 OpenJDK의 진행중인 프로젝트 살펴 보기
  • 5. jAvA Java, 개방형 혁신(Open Innovation) 업계 오픈 소스 커뮤니티 Java
  • 6. jAvA - 노동자의 언어 “해롭지 말자” “Java presents a new viewpoint in the evolution of programming languages-- creation of a small and simple language that's still sufficiently comprehensive to address a wide variety of software application development.” Java is a blue collar language. It’s not PhD thesis material but a language for a job. Java feels very familiar to many different programmers because we preferred tried-and-tested things - James Gosling, “The Feel of Java" 설계목표 == 단순 & 친숙
  • 8. OpEnJDK::소개 # 설립 *2006/5, 썬이 자바원에서 자바를 오픈소스로 전환한다고 공표 *2006/11/13, JVM(HotSpot)과 컴파일러를 먼저 GPL 라이선스로 공개 *2007/5/8, 자바 클래스 라이브러리 GPL로 공개, 첫 OpenJDK 출시 *2007/6, 레드햇 아이스드티(IcedTea) 프로젝트 시작 *2007/11/5, 레드햇 OpenJDK 참여 *2011/7/28, OpenJDK에서 개발한 첫 자바 버전 OpenJDK 7 발표 *2014/3/18, OpenJDK 8 발표, JDK 8의 기반으로 쓰임 #정의 *오픈소스 자바 SE와 관련 프로젝트를 중심으로 한 커뮤니티 *JCP의 자바 규격 요청서(Java Specification Requests;JSR)와 별도로 JDK 개선 제안(JDK Enhancement-Proposal; JEP) 프로세스 운영 *JCP보다 훨씬 다양한 시도를 폭넓고 빠르게 시도
  • 9. jAvA - 혁신 5 6 78 β 1995 2000 2006 1996 1997 1998 20022004 2011 10 9 201420172018
  • 10. 6 7 8β 1 5 OpenJDK,IBM합류,JDK7출시 ASFvotedNo! 자바라이브러리오픈소스화 레드햇100%오픈소스자바공개TDK통과 더그리교수,OpenJDK운영위원당선 JCP설립 Jakarta시작 JCP2.0개정ASF,JCP합류 MS.NetFramework출시 JBossJCP합류Jboss인증획득,스프링공개 JBoss4.0(최초EJB3),스프링1.0출시 Jakarta해체시작 자바오픈소스화발표 오라클,썬인수자바100%오픈소스화,ASFJCP탈퇴 OpenJDKJDK8출시 JCP,JDK개선 JCP.Next제안 JUGJCP합류 JCP 이해관계자
 중심
 개방형혁신 오픈소스
 개방형혁신
  • 11. OpEnJDK::개선흐름 # 언어의 현대화 * 표현 간소화 & 함수형 특성 도입 * 다중 코어 시대 대응 * System 자바 # 클라우드 * 시스템 통합; * 성능 향상, 경량화; * GC 개선, 관측성 개선 # 다언어용 범용 VM * 강한 추상화와 시스템 통합을 양 방향으로 동시에 진행 * Macro-instructions (indy), simplified data model (value types) * Java-on-Java (JSR 292 v2, Panama, Graal , Metropolis)
  • 13. OpEnJDK::프로젝트 # OpenJDK 프로젝트 * Amber: 언어 문법 간소화 * Valhalla: 값 타입 & 특화 제네릭 * Loom: Continuations & Fibers * Metropolis: Java-on-Java VM * Panama: Foreign-Function Interface & Data Layout * Shenandoah: 극저중단 GC * ZGC: 확장 가능한 저 응답시간 GC
  • 15. AmbEr::소개 JEPs = { JEP 286 지역변수 타입 추론, JEP 301 열거형 개선, JEP 302 람다식 잔반 처리, JEP 305 패턴 매칭, JEP 325 switch 식, JEP 326 미가공_문자열 }
  • 16. AmbEr::지역변수_타입_추론(JEP-286) # 지속적으로 확대된 타입 추론 * 자바 5: 제네릭 메서드 타입 추론 List<User> empty = Collections.<User>emptyList(); * 자바 7: 다이아몬드 연산자(<>) List<User> users = new ArrayList<Users>(); * 자바 8: 람다식 users.stream.filter((User user) -> user.getSurName().equals(“park”)) …… # 자바 10: 지역변수 타입 추론 var users = VisitorRegister.getVisitors();
  • 17. AmbEr::지역변수_타입_추론(JEP-286) # 사용법 Collector<UserProfile, ?, Map<Integer, Map<String, List<UserProfile>>>> groupingCollector = Collectors.groupingBy(UserProfile::getAge, Collectors.groupingBy(UserProfile::getCity)); var groupingCollector = Collectors.groupingBy(UserProfile::getAge, Collectors.groupingBy(UserProfile::getCity)); # 람다식(JEP 323) BinaryOperator<Processor, String> op = (var x, var y) -> x.process(y); BinaryOperator<Processor, String> op = (@Nonnull var x, @Nullable var y) -> x.process(y)
  • 18. AmbEr::지역변수_타입_추론(JEP-286) # 제약 // 필드와 메서드의 반환 타입 class MyClass { var field = 0; …… public var getAttribute() { …… }; } // null 값 지정 var model; model = “Gundam MkII”; // 두 변수 이상 선언 var i = 0, j = 0; // 중복 타입 추론 var dict = new HashMap<>();
  • 20. AmbEr::미가공_문자열(JEP-326) JEPs = { JEP 286 지역변수 타입 추론, JEP 301 열거형 개선, JEP 302 람다식 잔반 처리, JEP 305 패턴 매칭, JEP 325 switch 식, JEP 326 미가공_문자열 }
  • 21. AmbEr::미가공_문자열(JEP-326) //특수기호 후처리 없는 문자열 // 불필요한 후처리(escaping) 제거 out.println(“this".matches("wwww")); out.println("this".matches(`wwww`)); // 자바 코드에 타 언어 소스나 틀을 맞춘 문서를 그대로 삽입 String script = "function hello() {n" + " print('"Hello World"');n" + "}n" + "n" + "hello();n"; String script = ` function hello() { print('"Hello World"'); } hello(); `
  • 22. AmbEr::미가공_문자열(JEP-326) # 특징 - 짝맞춤을 통해 미처리 문자열 내 “`” 문자 허용, - 개행문자를 제외한 모든 문자를 처리 없이 그대로 사용, - 후처리를 위한 String 클래스에 escape() 메서드 추가, - 아직 JEP 처리 상태는 Candidate라 향후 변경 가능성이 큼 # 다양한 사용 예 `"` // a string containing " alone ``can`t`` // a string containing 'c', 'a', 'n', '`' and 't' `This is a string` // a string containing 16 characters `n` // a string containing '' and 'n' `u2022` // a string containing '', 'u', '2', '0', '2' and '2' `This is a two-line string` // a single string constant
  • 23. AmbEr::Switch식(JEP-325) JEPs = { JEP 286 지역변수 타입 추론, JEP 301 열거형 개선, JEP 302 람다식 잔반 처리, JEP 305 패턴 매칭, JEP 325 switch 식, JEP 326 미가공_문자열 }
  • 24. AmbEr::Switch식(JEP-325) # Switch 문? Switch 식? * 식 == 연산 후 값 반환 * if 문 if(조건식) { … } else { … } var result = if(조건식) { … } else { … } //(x) * 삼항연산자를 사용한 식 var result = 조건식 ? 값1 : 값2; //(0) * 지금까지 자바에서 swtich는 문이었으나 식으로도 사용 가능
  • 25. AmbEr::Switch식(JEP-325) //switch 문 int numDays = 0; switch (month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: numDays = 31; break; case 4: case 6: case 9: case 11: numDays = 30; break; case 2: if (((year % 4 == 0) && !(year % 100 == 0)) || (year % 400 == 0)) numDays = 29; else numDays = 28; break; } //switch 식 int numDays = switch (month) { case 1, 3, 5, 7, 8, 10, 12 -> 31; case 4, 6, 9, 11 -> 30 case 2 -> (((year % 4 == 0) && !(year % 100 == 0)) || (year % 400 == 0)) ? 29 : 28; } 간략해진 코드
  • 26. AmbEr::패턴 매칭 JEPs = { JEP 286 지역변수 타입 추론, JEP 301 열거형 개선, JEP 302 람다식 잔반 처리, JEP 305 패턴 매칭, JEP 325 switch 식, JEP 326 미가공_문자열 }
  • 27. AmbEr::패턴 매칭::데이터_클래스 # 자바 객체의 다양한 용도 * “구조체”, // C, 파스칼 * “값”, // Integer, Long, Boolean, Double * “데이터 전달 객체(DTO)”, * “객체”, // OOP의 최소 단위, 데이터보다는 행위 기준 * “컴포넌트” # 구조체/데이터 전달 객체로서의 일반적인 자바 객체 public class Coordinate { private double lat; private double lon; public Coordinate(double lat, double lon) { this.lat = lat; this.lon = lon; } // Getters/Setters, toString(), equals(), hashCode(), etc. 필요 }
  • 28. AmbEr::패턴 매칭::데이터_클래스 대수적 자료형(algebraic data types) //스칼라 케이스 클래스 case class Coordinate (lat: Double, lon : Double) //코틀린 데이터 클래스 data class Coordinate(val lat: Double, val lon: Double) //자바 데이터 클래스 (안) record Coordinate(double lat, double lon) {} //사용 예: 산술식 interface Exp { } abstract record BinOpExp(Exp left, Exp right) implements Exp {}; abstract record UnOpExp(Exp exp) implements Exp {}; record PlusExp(Exp left, Exp right) extends BinOpExp(left, right) {}; record SubExp(Exp left, Exp right) extends BinOpExp(left, right) {}; record MulExp(Exp left, Exp right) extends BinOpExp(left, right) {}; record DivExp(Exp left, Exp right) extends BinOpExp(left, right) {}; record NegExp(int constant) implements Exp {}; record IntExp(int constant) implements Exp {};
  • 29. AmbEr::패턴매칭 # 패턴매칭 == Switch식 + 타입 비교 interface Shape {}; record Point(int x, int y) implements Shape; record Circle(Point center, int radius) implements Shape; …… Canvas newCanvas; // 기존 if를 사용한 타입 확인 방식 if(shape instanceOf Point) { Point pt = (Point) shape; newCanvas = canvas.drawPoint(pt.x, pt.y); } else if (shape instanceOf Circle) { Circle cir = (Circle) shape; newCanvas = canvas.drawCircle(cir.center.x, cir.center.y, cir.radius); } else if (shape instanceOf Rectangle) { …… } else if (shape ……
  • 30. AmbEr::패턴매칭 # 패턴매칭 == Switch식 + 타입 비교 // Switch 식을 이용한 타입 확인 방식 Canvas newCanvas = switch(shape) { case Point pt -> canvas.drawPoint(pt.x, pt.y); case Circle cir -> canvas.drawCircle(cir.center.x, cir.center.y, cir.radius); case Rectangle rct -> …… …… default -> canvas; }
  • 31. AmbEr::패턴매칭 # 패턴매칭 == Switch식 + 타입 비교 + 객체 분해 객체를 분해해서 생성자 인자값을 다시 꺼내서 변수에 할당 interface Exp { } abstract record BinOpExp(Exp left, Exp right) implements Exp; record PlusExp(Exp left, Exp right) extends BinOpExp(left, right); record SubExp(Exp left, Exp right) extends BinOpExp(left, right); record IntExp(int constant) implements Exp; …… int eval(Exp e) { return switch(e) { case IntExp(var i) -> i; case PlusExp(var l, var r) -> eval(l) + eval(r); case SubExp(var l, var r) -> eval(l) - eval(r); …… }
  • 32. AmbEr::패턴매칭 # 비지터 패턴이었다면... interface Exp { accept(ExpVisitor visitor); } record IntExp(int constant) implements Exp { … } record PlusExp(Exp left, Exp right) implements Exp { public int accept(ExpVisitor visitor) { return visit(this); } } record SubExp(Exp left, Exp right) implements Exp { … } …… class ExpVisitor { public int visit(IntExp e) { return e.constant; } public int visit(PlusExp e) { return e.left.accept(this) + e.right.accept(this); } public int visit(SubExp e) { … } …… }
  • 33. AmbEr::패턴매칭 # 패턴매칭 == Switch식 + 타입 비교 + 객체 분해 + 값 비교 객체를 분해해 얻는 생성자 인자값과 패턴에 주어진 값을 비교 #유클리드 호제법 예제 2개의 자연수(또는 정식) a, b에 대해서 a를 b로 나눈 나머지를 r이라 하면(단, a>b), a와 b의 최대공약수는 b와 r의 최대공약수와 같다. gcd(a, 0) = a gcd(a, b) = gcd(b, a mod b) int gcd(Pair pair) { return switch(pair) { case Pair(var a, 0) -> a; case Pair(var a, var b) -> gcd(Pair.of(b, a % b)); }
  • 34. AmbEr::패턴매칭 # 패턴매칭 == Switch식 + 타입 비교 + 객체 분해 + 값 비교 패턴을 중첩해서 적용할 수 있음 Exp simplify(Exp exp) { return switch(exp) { case IntExp -> exp; case NegExp(var e) -> new NegExp(simplify(e)); case NegExp(NegExp(var e)) -> simplify(e); case PlusExp(IntExp(0), var e), PlusExp(var e, IntExp(0)), SubExp(IntExp(0), var e), SubExp(var e, IntExp(0)) -> simplify(e); case PlusExp(var l, var r) -> new PlusExp(simplify(l), simplify(r)); case SubExp(var l, IntExp(0)) -> simplify(l); case SubExp(var l, var r) -> new SubExp(simplify(l), simplify(r)); }; }
  • 36. vAhAllA::소개 JEPs = { JEP 169: 값 객체 JEP 218: 원시타입 제네릭(제네릭 특화) JEP 193: 변수 핸들 } 자바 제네릭의 한계를 극복하고 참조 타입 때문에 발생하는 자바 성능을 개선
  • 37. vAhAllA::기존자바타입 자바의 타입 = {원시 타입, 참조 타입} 원시 타입 = {boolean, byte, char, short, int, long, float, double} 참조 타입 = {모든 객체, 배열} * 비효율적인 참조 타입에 의존 * 힙 메모리 정리(GC)가 복잡해짐 * 원시 타입을 대응하는 객체로 변환(boxing)/복원(unboxing)하는 비용 발생 변수 데이터 데이터 변수 변수 참조 참조 참조
  • 38. vAhAllA::값타입 Rational[] rationals = … 객체 참조 객체 참조 객체 참조 분모 분자 분모 분자 분모 분자 배열 객체 객체 객체 분모 분자 분모 분자 분모 분자 배열
  • 39. vAhAllA::값타입 “코드는 클래스 같지만 동작은 값처럼” * 데이터의 일렬, 밀집 배열 * 원시타입과 참조타입의 간극 채움 * 기존 참조타입(L-타입)에 새로운 값 타입(Q-타입)을 JVM에 추가 문법 value class Rational { final int numer; // 분자 final int denom; // 분모 } * 작은 구조체에 적합: 복소수, 좌표, 도형, 튜플 * 불변(Immutable) * 동시성 환경에 유리 * GC에 유리 * 자바 원시 타입 외 시스템 고유의 자료 타입 표현 가능(ex, int128)
  • 40. vAhAllA::자바_제네릭 #참조 타입만 허용하는 자바 제네릭 List<int> primeNums = new ArrayList<>(); // compile error #타입 소거 * 자바 제네릭은 컴파일러 기술 * 타입 매개변수 값은 소거되어 VM은 정보를 알지 못함 (하위호환성) ArrayList<String>(); ArrayList<Integer>(); ArrayList<User>(); ArrayList<Point>(); ArrayList.class ArrayList.class ArrayList.class ArrayList.class 소스코드 JVM 컴파일
  • 41. vAhAllA::제네릭_특화 # 값타입에 맞게 동적으로 클래스 변조 ArrayList<int>(); ArrayList<Rational>(); ArrayList<Complex>(); ArrayList${T=int}.class ArrayList${T=Rational}.class ArrayList${T=Complex}.class 소스코드 JVM 컴파일 # C++ 템플릿 비교 * C++ 템플릿은 제네릭 특화처럼 매 적용마다 별도 코드를 생성 * 자바 제네릭 특화는 런타임에 동작, C++ 컴파일 시점에 동작 * 자바 제네릭은 타입 매개변수에만 적용 * 참조 타입에는 기존처럼 타입 소거 적용 # 포인터 다형성 vs 표상(representation) 다형성
  • 42. vAhAllA::값_기반_클래스 # 값 기반 클래스(Value Based Class) * 자바 8에 도입된 클래스 규격 *final이고 값이 변해서는 안됨 *값 변경 가능 객체를 참조할 수는 있음 *equals, hashCode, toString은 상태로만 계산해야 하며 식별자를 써서는 안됨 *equals()로만 동치성을 비교해야 하며 동일성(==)은 보장 안함 *팩토리 메서드를 사용해서만 객체를 생성해야 함 *동치인 두 객체에는 행동이 언제나 동일해야 함 *식별자 기반 작업은 예측할 수 없는 결과 발생 가능 (동기화, 직렬화 등) //java.util Optional, OptionalDouble, OptionalLong, OptionalInt //java.time Duration, Instant, LocalDate, LocalDateTime, LocalTime, MonthDay, OffsetDateTime, OffsetTime, Period, Year, YearMonth, ZonedDateTime, ZoneId, ZoneOffset //java.time.chrono HijrahDate, JapaneseDate, MinguaDate, ThaiBuddhistDate
  • 43. vAhAllA::최소_값_타입(Minimal Value Type) # 최소 값 타입 * 발할라(Vahalla) 프로젝트의 첫 가시적 결과, 부분 집합 * indy와 같이 “VM 먼저, 언어는 나중” 접근 방식(언어와 VM의 분리) * 자바 문법 변화 없음 * 값 가능 클래스: @jdk.incubator.mvt.ValueCapableClass * JVM 내부적으로만 값 타입 동작 (선택가능) * 값 기반 클래스를 JVM의 1등급 구성체로 취급 * java -Xverify:none -XX:+EnableMVT <Test>
  • 44. vAhAllA::VCC_&_DVC # 값 가능 클래스 * 클래스는 final로 상속 불가 * 인터페이스가 아닌 일반 클래스 * Object를 직접 상속해야 함 * 멤버 필드는 모두 final로 변경 불가 * equals, hashCode, toString을 재정의(Override) * clone과 finalize는 재정의하지 말아야 함 #파생 값 타입 * 값 타입으로 표시됨 * 값 가능 클래스에서 유도된 새 이름이 주어짐 * VCC의 상속 타입은 제거됨 * VCC의 모든 메서드와 생성자는 제거됨 * 멤버필드는 변경 없이 유지 VCC소스코드 VCC클래스파일 DVC메모리의 클래스 VCC메모리의 클래스 컴파일 클래스로더 VCC 값 가능 클래스 DVC 파생 값 클래스
  • 45. vAhAllA::최소_값_타입_성능 # valuetypifier * 자바 8 코드를 값 타입 관련 opcode로 변경하는 도구 * https://github.com/forax/valuetypify // 코드 ColorList list = new ColorList(); for(int i = 0; i < 1_000_000; i++) { list.add(new Color(i, i, i)); } // 결과 (참조 타입) Color(2.2517998E7, 2.2517998E7, 2.2517998E7) creation time 2886.933223 ms average time 606.217409 ms // 결과 (값 타입) Color(2.2517998E7, 2.2517998E7, 2.2517998E7) creation time 1039.692931 ms average time 70.152561 ms
  • 47. lOOm::화이버 #컨티뉴에이션(Continuation; 지속, 연속) * 작업 단위 * 중단 후 재실행 가능 # 화이버(Fiber) * 자바가 관리하는 경량 쓰레드 (쓰레드는 OS가 관리) * 쓰레드처럼 동작하지만 쓰레드보다 훨씬 가볍게 동작 * 컨티뉴에이션을 관리 * 서버는 대부분 시간을 IO 응답을 기다리지만 쓰레드는 너무 무거움 * 쓰레드를 추상화해 사용하는 비동기 모델은 복잡함 (액터, 반응형 프로그래 밍 등) * 동기 방식과 유사하게 확장 가능한 프로그래밍 작성 가능 * 기존 코드를 훨씬 가볍게 돌릴 수 있는 파이버가 필요
  • 49. lOOm::화이버 # Java & OpenJDK # Amber *지역변수_타입_추론(JEP-286) *미가공_문자열(JEP-326) *데이터 클래스 *패턴 매칭 # Vahalla *값 타입 *제네릭 특화 *최소 값 타입 # Loom *화이버