Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Project Valhalla, Value Class (김희망)
Search
hope
July 02, 2024
0
130
Project Valhalla, Value Class (김희망)
KotlinConf'24 Global in South Korea Presentation.
hope
July 02, 2024
Tweet
Share
Featured
See All Featured
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
232
17k
Into the Great Unknown - MozCon
thekraken
33
1.5k
Raft: Consensus for Rubyists
vanstee
136
6.7k
Teambox: Starting and Learning
jrom
133
8.8k
Fantastic passwords and where to find them - at NoRuKo
philnash
50
2.9k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
111
49k
BBQ
matthewcrist
85
9.3k
Why You Should Never Use an ORM
jnunemaker
PRO
54
9.1k
StorybookのUI Testing Handbookを読んだ
zakiyama
27
5.3k
Designing for humans not robots
tammielis
250
25k
Six Lessons from altMBA
skipperchong
27
3.5k
Building Flexible Design Systems
yeseniaperezcruz
327
38k
Transcript
Project Valhalla, Value Class Kim Huemang @esperar KotlinConf’24 in South
Korea
About K-hope 2006. 02. 06 (18 yo) Email:
[email protected]
School:
Gwangju Software Meister Highschool Major: Server Developer
None
None
None
Project Valhalla, Value Class Kim Huemang
Primitive Type, Reference Type
Primitive Type int, long, float, double, boolean, byte, short, char
(8가지) stack memory에 저장되는 데이터들
Primitive Type int, long, float, double, boolean, byte, short, char
(8가지) stack memory에 저장되는 데이터들 실제 데이터 값을 저장하는 타입(정수, 실수, 문자, 논리 리터럴 등)
None
None
Reference Type 원시타입을 제외한 상위 타입들 Java에서 최상위 클래스인 java.lang.Object
클래스를 상속하는 모든 클래스
Reference Type 원시타입을 제외한 상위 타입들 Java에서 최상위 클래스인 java.lang.Object
클래스를 상속하는 모든 클래스 String, Array, Enum, Class, Interface … 실제 객체들은 Heap 메모리에 저장, 참조 타입 변수는 Stack 메모리에 실제 객체 주소를 저장하여, 참조 변수에 저장된 객체의 주소를 불러와 사용하는 방식
None
None
None
Garbage Collector
Primitive Type vs Reference Type
Primitive Type vs Reference Type 성능 유연성
JVM Type System, Problem
JVM Type System
JVM Type System 1. Primitive Type 2. Object 3. Array
Object
Object Heap Object Object
Object Heap Object Object header
None
None
None
JVM Type System Problem !!!!
90년대 초
90년대 초 산술연산 == 메모리 접근
현재 산술연산 < 메모리 접근
현재 산술연산 < 메모리 접근 메모리에서 데이터를 가져오게 되면 그
시간동안 cpu는 연산을 수천만번 정도 낭비
Project Valhalla’s Goal
Project Valhalla’s Goal 평평하고(간접참조가 x) header가 없다.
But How???
Object Oriented Programming
Object Oriented Programming
Object Oriented Programming ?!
Object Oriented Programming Object vs Primitive
Primitive > Object Performance
객체지향의 일관성이 깨질 수 있다고!! Object Oriented Programming Primitive
Generic
Generic 제네릭은 데이터 타입을 일반화함 클래스나 메서드에서 사용할 내부 데이터
타입을 컴파일시에 미리 지정하는 방법
primitive
Wrapper Class
Wrapper Class (Integer, Long, …. )
None
None
Lambda
Lambda 제네릭 기반 구현
java.util.function
IntPredicate, IntToLongFunction ….
Stream도 마찬가지다..! IntStream, LongStream, DoubleStream
IntStream, LongStream, DoubleStream IntPredicate, IntToLongFunction …. 성능 최적화를 위한 노력…
라이브러리 개발자
라이브러리 개발자 IntToLongFunction, PrimitiveIterator.OfInt() 이런거 더 만들어야함 가면 갈수록 더
많아지는..
성능 vs 추상화
성능 vs 추상화 인지 부하
제네릭의 주요 목표
제네릭의 주요 목표 타입 표현 방식 추상화
기본타입 vs 참조타입
기본타입 vs 참조타입 크나큰 벽이 되어가고 있다..
이러한 문제의 원인은?
None
동일성
동일성을 가진다는 뜻
동일성을 가진다는 뜻 객체가 변할 수 있다
객체의 필드가 수정되어도 어떤 객체에 접근할 지 명확히 식별할 수
있어야함.
Object equality Synchronization System::identityHashCode Weak Reference
Project Valhalla Goal
Project Valhalla Goal Flat한 Data Type을 만들자!
Project Valhalla Goal Flat한 Data Type을 만들자!
Project Valhalla Goal Flat한 Data Type을 만들자! How?
클래스가 동일성을 포기!
Value Class!
Value Class! Object header X
Value Class! Object header X 참조를 통한 접근 X
Value Class! 메서드, 생성자, 필드, 캡슐화, 인터페이스, 제네릭, 어노테이션 O
Value Class! Wrapper Class 대체
Primitive Type Field 하나만 가진 Value Class
Primitive Type Field 하나만 가진 Value Class Primitve 표현, 객체
호환성 유지, 래퍼 클래스의 오버헤드 해결
PRIMITIVE CLASS!
클래스의 표현력 + 기본 타입의 빠른 동작
Code like a class, works like an int
None
Kotlin
Kotlin 1.5
None
“모든 원시 값과 문자열 값을 포장해라”
“모든 원시 값과 문자열 값을 포장해라”
“모든 원시 값과 문자열 값을 포장해라” 1. 타입 안정성 2.
코드 가독성 3. 캡슐화
1. 타입 안정성
1. 타입 안정성
1. 타입 안정성
1. 타입 안정성
1. 타입 안정성
1. 타입 안정성 컴파일 타임에서 오류 캐치 가능
2. 코드 가독성
2. 코드 가독성 어떤 타입의 id가 들어가야하는거지?
2. 코드 가독성
2. 코드 가독성 가독성 + 타입 안정성
3. 캡슐화
3. 캡슐화
3. 캡슐화
Kotlin Value Class
Kotlin Value Class 일반 클래스와 달리 캡슐화 관련 오버헤드가 X
None
None
None
None
Kotlin을 디컴파일해서 확인해본 자바 코드
Kotlin을 디컴파일해서 확인해본 자바 코드 Length 객체를 생성하지 않고 있으며,
double 타입으로 totalLength 저장
Kotlin Value Class의 특징
Kotlin Value Class의 특징 1. @JvmInline 어노테이션과 함께 사용해야 한다.
2. 자동 생성 메서드는 equals(), toString(), hashCode()만 있다. 3. 불변 프로퍼티 1개만 가질 수 있다. 4. 컴파일 타임 === 비교를 허용하지 않는다.
1. @JvmInline 어노테이션과 함께 사용해야 한다.
1. @JvmInline 어노테이션과 함께 사용해야 한다.
1. @JvmInline 어노테이션과 함께 사용해야 한다. 어노테이션을 붙여줘야 컴파일 과정에서
컴파일러가 해당 어노테이션을 보고 value class의 인스턴스가 런타임에 원시값 혹은 문자열로 저장되어야함을 알 수가 있다.
2. 자동 생성 메서드는 equals(), toString(), hashCode()만 있다.
2. 자동 생성 메서드는 equals(), toString(), hashCode()만 있다. Kotlin Data
Class
2. 자동 생성 메서드는 equals(), toString(), hashCode()만 있다. Kotlin Data
Class equals, toString, hashCode + copy, componentN
2. 자동 생성 메서드는 equals(), toString(), hashCode()만 있다. Kotlin Value
Class
2. 자동 생성 메서드는 equals(), toString(), hashCode()만 있다. Kotlin Value
Class equals, toString, hashCode + copy, componentN
2. 자동 생성 메서드는 equals(), toString(), hashCode()만 있다.
2. 자동 생성 메서드는 equals(), toString(), hashCode()만 있다.
2. 자동 생성 메서드는 equals(), toString(), hashCode()만 있다.
2. 자동 생성 메서드는 equals(), toString(), hashCode()만 있다.
2. 자동 생성 메서드는 equals(), toString(), hashCode()만 있다.
None
None
컴파일 이후 value class 값과 메서드가 벗겨지면서 상위 클래스로 스며들어야
한다. 그때 그 메서드가 중복되는 문제가 발생할 수 있어 난수를 붙여 문제를 해결한다.
None
None
None
Mangling
Mangling 메서드 명 뒤에 /-[a-zA-Z_]{7}/
3. 불변(val) 프로퍼티만 가질 수 있다.
3. 불변(val) 프로퍼티만 가질 수 있다. Val은 본질적으로 Value의 약자입니다.
객체가 아닌 “값”으로 나타내기 위해 하나의 프로퍼티만 존재해야 하며 최적화를 위해서 불변한 값이여야 합니다.
4. 컴파일 타임에 ‘===‘ 비교를 허용하지 않는다
4. 컴파일 타임에 ‘===‘ 비교를 허용하지 않는다 ===은 레퍼런스 비교다.
4. 컴파일 타임에 ‘===‘ 비교를 허용하지 않는다 ===은 레퍼런스 비교다.
Value class는 컴파일 타임에 원시 값이 된다.
4. 컴파일 타임에 ‘===‘ 비교를 허용하지 않는다 ===은 레퍼런스 비교다.
Value class는 컴파일 타임에 원시 값이 된다.
성능 테스트 1. 객체 생성 속도 테스트 2. 값 참조
및 연산 속도 테스트 3. 힙 메모리 테스트
1. 객체 생성 속도 테스트
1. 객체 생성 속도 테스트 JMH(Java Microbenchmark Harness)
1. 객체 생성 속도 테스트 JMH(Java Microbenchmark Harness)
None
None
None
객체 생성 속도 테스트 – 유의미한 차이가 없다
2. 값 참조 및 연산 속도 테스트
2. 값 참조 및 연산 속도 테스트
2. 값 참조 및 연산 속도 테스트
2. 값 참조 및 연산 속도 테스트
2. 값 참조 및 연산 속도 테스트 값 참조 및
연산 속도 테스트 – 유의미한 차이가 없다
3. Heap 메모리 테스트 JMX(Java Management eXtensions) 활용
3. Heap 메모리 테스트 JMX(Java Management eXtensions) 활용
3. Heap 메모리 테스트
3. Heap 메모리 테스트
3. Heap 메모리 테스트
3. Heap 메모리 테스트
3. Heap 메모리 테스트
3. Heap 메모리 테스트
3. Heap 메모리 테스트
3. Heap 메모리 테스트
3. Heap 메모리 테스트 왜 차이가 없지?
3. Heap 메모리 테스트
3. Heap 메모리 테스트
3. Heap 메모리 테스트 List에는 Primitive Type을 저장할 수 없음.
(Auto Boxing이 발생함.)
3. Heap 메모리 테스트 List에는 Primitive Type을 저장할 수 없음.
(Auto Boxing이 발생함.) 따라서 객체 생성이 되고 결국 메모리 또한 큰 차이가 없음.
3. Heap 메모리 테스트 따라서 무작정 생성으로 테스트를 진행해보겠다.
3. Heap 메모리 테스트 따라서 무작정 생성으로 테스트를 진행해보겠다.
3. Heap 메모리 테스트 따라서 무작정 생성으로 테스트를 진행해보겠다. Regular
Class
3. Heap 메모리 테스트 Regular Class Value Class 따라서 무작정
생성으로 테스트를 진행해보겠다.
3. Heap 메모리 테스트 Regular보다 약 50퍼센트의 공간만 차지함 Regular
Class Value Class
3. Heap 메모리 테스트 Regular Class Value Class bytes
3. Heap 메모리 테스트 Regular Class Value Class bytes 50%
절약
3. Heap 메모리 테스트 Array vs List
3. Heap 메모리 테스트 Array만 사용하면 되나?
3. Heap 메모리 테스트 Array만 사용하면 되나? 객체 메서드(X)
Spring에서 value class 활용하기
Spring에서 value class 활용하기
Spring에서 value class 활용하기
Spring에서 value class 활용하기
Spring에서 value class 활용하기
결론
결론 성능
결론 성능 추상화
GitHub Code: https://github.com/esperar/KotlinConf2024
Thank you KotlinConf’24 in South Korea