The Java
λ°±κΈ°μ λμ λ μλ°, Java 8, λ μλ°, μ½λλ₯Ό μ‘°μνλ λ€μν λ°©λ² κ°μλ₯Ό μμ½ν λ΄μ©μ λλ€.
Java 8
Java 8
LTS(Long-Term-Support) λ²μ
μΆμμΌ: 2014λ 3μ
μ£Όμ κΈ°λ₯
λλ€ ννμ, λ©μλ λ νΌλ°μ€, μ€νΈλ¦Ό API, Optional ...
Open JDK: Oracle, AdoptOpenJDK, Amazon Corretto, Azul Zulu
.
LTS(Long-Term-Support)
λΉ-LTS
λ°°ν¬ μ£ΌκΈ°:
6κ°μμ§μ κΈ°κ°: λ°°ν¬ μ΄ν
6κ°μ(λ€μ λ²μ μ΄ λμ€λ©΄ μ§μ μ’ λ£)
LTS
λ°°ν¬ μ£ΌκΈ°:
3λ (λ§€ 6λ²μ§Έ λ°°ν¬νμ΄ LTS)μ§μ κΈ°κ°:
5λ μ΄μ(JDK μ 곡 λ°΄λμ μ΄μ©νλ μλΉμ€μ λ°λΌ μ°¨μ΄)μ€μ μλΉμ€ μ΄μ νκ²½μμλ LTS λ²μ κΆμ₯
λ§€λ 3μκ³Ό 9μμ μ λ²μ λ°°ν¬
Functional Interface & Lambda
ν¨μν μΈν°νμ΄μ€(Functional Interface)
μΆμ λ©μλλ₯Ό λ± νλλ§ κ°μ§κ³ μλ μΈν°νμ΄μ€
SAM(Single Abstract Method) μΈν°νμ΄μ€
@FuncationInterface μ λ Έν μ΄μ μ κ°μ§κ³ μλ μΈν°νμ΄μ€
.
λλ€ ννμ(Lambda Expressions)
κ°κ²°ν μ½λ
ν¨μν μΈν°νμ΄μ€μ μΈμ€ν΄μ€λ₯Ό λ§λλ λ°©λ²μΌλ‘ μ¬μ© κ°λ₯
λ©μλ λ§€κ°λ³μ, λ¦¬ν΄ νμ , λ³μλ‘ λ§λ€μ΄ μ¬μ© κ°λ₯
.
μλ°μμ ν¨μν νλ‘κ·Έλλ°
ν¨μλ₯Ό First class objectλ‘ μ¬μ© κ°λ₯
μμ ν¨μ(Pure function)
μ¬μ΄λ μ΄ν©νΈ μμ(ν¨μ λ°μ μλ κ°μ λ³κ²½νμ§ μμ)
μνκ° μμ(ν¨μ λ°μ μλ κ°μ μ¬μ©νμ§ μμ)
κ³ μ°¨ ν¨μ(Higher-Order Function)
ν¨μκ° ν¨μλ₯Ό λ§€κ°λ³μλ‘ λ°μ μ μκ³ , ν¨μ λ¦¬ν΄ κ°λ₯
λΆλ³μ±
Functional Interface
Java κΈ°λ³Έ μ 곡 ν¨μν μΈν°νμ΄μ€
Function<T, R>
T νμ μ λ°μμ R νμ μ 리ν΄νλ ν¨μ μΈν°νμ΄μ€
BiFunction<T, U, R>
λ κ°μ κ°(T, U)λ₯Ό λ°μμ R νμ μ 리ν΄νλ ν¨μ μΈν°νμ΄μ€
R apply(T t, U u)
Consumer<T>
T νμ μ λ°μμ μ무κ°λ 리ν΄νμ§ μλ ν¨μ μΈν°νμ΄μ€
Supplier<T>
T νμ μ κ°μ μ 곡νλ ν¨μ μΈν°νμ΄μ€
Predicate<T>
T νμ μ λ°μμ booleanμ 리ν΄νλ ν¨μ μΈν°νμ΄μ€
ν¨μ μ‘°ν©μ© λ©μλ
UnaryOperator<T>
Function<T, R>μ νΉμν νν(Function μμ)
μ λ ₯κ° νλλ₯Ό λ°μμ λμΌν νμ μ 리ν΄νλ ν¨μ μΈν°νμ΄μ€
BinaryOperator<T>
BiFunction<T, U, R>μ νΉμν νν
λμΌν νμ μ μ λ ΅κ° λ κ°λ₯Ό λ°μ 리ν΄νλ ν¨μ μΈν°νμ΄μ€
Lambda
(μΈμ 리μ€νΈ) -> {λ°λ}
.
μΈμ 리μ€νΈ
μΈμ μμ: ()
μΈμκ° ν κ°: (one) λλ one
μΈμκ° μ¬λ¬ κ°: (one, two)
μΈμμ νμ μ μλ΅ κ°λ₯(μ»΄νμΌλ¬κ° μΆλ‘ νμ§λ§ λͺ μλ κ°λ₯)
.
λ°λ
νμ΄ν μ€λ₯Έμͺ½μ ν¨μ λ³Έλ¬Έ μ μ
μ¬λ¬ μ€μΈ κ²½μ° {} μ¬μ©
ν μ€μΈ κ²½μ° λ°λ, return μλ΅ κ°λ₯
.
λ³μ μΊ‘μ²(Variable Capture)
λ‘컬 λ³μ μΊ‘μ²
final, effective final μΈ κ²½μ°μλ§ μ°Έμ‘° κ°λ₯
κ·Έλ μ§ μμ κ²½μ°, concurrency λ¬Έμ κ° λ°μν μ μμ΄μ μ»΄νμΌλ¬κ° λ°©μ§
effective final
μλ° 8λΆν° μ§μνλ κΈ°λ₯
final ν€μλλ₯Ό μ¬μ©νμ§ μμ§λ§, λ³κ²½μ΄ μλ λ³μλ₯Ό μ΅λͺ ν΄λμ€ κ΅¬ν체, λλ€μμ μ°Έμ‘° κ°λ₯
λλ€λ μ΅λͺ ν΄λμ€ κ΅¬ν체μ λ¬λ¦¬ Shadowingνμ§ μμ
μ΅λͺ ν΄λμ€λ μλ‘μ΄ μ€μ½₯μ λ§λ€μ§λ§, λλ€λ λλ€λ₯Ό κ°μΈκ³ μλ μ€μ½₯κ³Ό κ°μ
λλ€λ₯Ό κ°μΌ μ€μ½₯μ μλ λμΌν μ΄λ¦μ λ³μ μ μ λΆκ°
Method Reference
Method References λ₯Ό μ¬μ©ν΄μ λ©μλ, μμ±μ νΈμΆλ₯Ό λ§€μ° κ°κ²°νκ² νν κ°λ₯
Interface
Collection interface
μΈν°νμ΄μ€μ λ©μλ μ μΈμ΄ μλλΌ κ΅¬ν체λ₯Ό μ 곡νλ λ°©λ²
ꡬν ν΄λμ€λ₯Ό κΉ¨λ¨λ¦¬μ§ μκ³ μ κΈ°λ₯ μΆκ° κ°λ₯
Default Methods λ ꡬν체 λͺ¨λ₯΄κ² μΆκ°λ κΈ°λ₯μΌλ‘ 리μ€ν¬ μ‘΄μ¬
μ»΄νμΌ μλ¬λ μλμ§λ§ ꡬν체μ λ°λΌ λ°νμ μλ¬(ex. NPE) λ°μ κ°λ₯
λ°λμ λ¬Έμν νμ(@implSpec μ¬μ©)
νμ μ ꡬνμ²΄κ° μ¬μ μ
Object κ° μ 곡νλ κΈ°λ₯(equals, hasCode)μ κΈ°λ³Έ λ©μλλ‘ μ 곡 λΆκ°
ꡬνμ²΄κ° μ¬μ μ
λ³ΈμΈμ΄ μμ ν μ μλ μΈν°νμ΄μ€μλ§ κΈ°λ³Έ λ©μλ μ 곡 κ°λ₯
μΈν°νμ΄μ€λ₯Ό μμλ°λ μΈν°νμ΄μ€μμ κΈ°λ³Έ λ©μλλ₯Ό λ€μ μΆμ λ©μλλ‘ λ³κ²½ κ°λ₯
κΈ°λ³Έ λ©μλκ° μΆ©λνλ κ²½μ° μ§μ μ€λ²λΌμ΄λ© νμ
.
Static Method
ν΄λΉ νμ κ΄λ ¨ ν¬νΌ, μ νΈλ¦¬ν° λ©μλ μ 곡 μ μ μ©
.
Java 8 Default Methods
Iterable κΈ°λ³Έ λ©μλ
Collection κΈ°λ³Έ λ©μλ
parallelStream(), spliterator()
Comparator κΈ°λ³Έ λ©μλ λ° μ€νν± λ©μλ
thenComparing()
static reverseOrder() / naturalOrder()
static nullsFirst() / nullsLast()
static comparing()
Spliterator κΈ°λ³Έ λ©μλ
forEachRemaining(Consumer)
getExactSizeIfKnown()
hasCharacteristics()
getComparator()
Stream
λ°μ΄ν°λ₯Ό λ΄κ³ μλ μ μ₯μ(컬λ μ )κ° μλλΌ, μ΄λ ν μ°μλ λ°μ΄ν°λ₯Ό μ²λ¦¬νλ
μ€νΌλ μ΄μ λ€μ λͺ¨μμ€νΈλ¦Ό μ²λ¦¬ μ λ°μ΄ν° μλ³Έμ λ³κ²½νμ§ μμ
μ€νΈλ¦ΌμΌλ‘ μ²λ¦¬νλ λ°μ΄ν°λ μ€μ§ ν λ²λ§ μ²λ¦¬
μ€μκ°μΌλ‘ μ€νΈλ¦Ό λ°μ΄ν°κ° λ€μ΄μ¬ κ²½μ° λ¬΄ν μ²λ¦¬(Short Circuit λ©μλλ₯Ό μ¬μ©ν΄μ μ ν κ°λ₯)
μ€κ° μ€νΌλ μ΄μ μ κ·Όλ³Έμ μΌλ‘ lazy νΉμ±μ κ°μ§
λ°μ΄ν°κ° λ°©λν κ²½μ° parallelStream() μΌλ‘ μμ½κ² λ³λ ¬ μ²λ¦¬ κ°λ₯
μ€λ λ μμ±, λ³λ ¬μ²λ¦¬ ν μμ§, μ€λ λ κ° μ»¨ν μ€νΈ μ€μμΉ λ±μ λΉμ©μΌλ‘ 무쑰건 λΉ¨λΌμ§λ 건 μλ
μ€νΈλ¦Ό νμ΄νλΌμΈ
0 λλ λ€μμ μ€κ° μ€νΌλ μ΄μ κ³Ό ν κ°μ μ’ λ£ μ€νΌλ μ΄μ μΌλ‘ ꡬμ±
μ€νΈλ¦Όμ λ°μ΄ν° μμ€λ μ€μ§ ν°λ―Έλ μ€νΌλ€μ΄μ μ μ€νν λμλ§ μ²λ¦¬
μ€κ° μ€νΌλ μ΄μ (intermediate operation)
Stream 리ν΄
Stateless / Stateful μ€νΌλ μ΄μ μΌλ‘ λ μμΈνκ² κ΅¬λΆ κ°λ₯
λλΆλΆ Stateless operation
μ΄μ μμ€ λ°μ΄ν°λ₯Ό μ°Έμ‘°ν΄μΌ νλ μ€νΌλ μ΄μ (ex. distinct, sorted)μ Stateful μ€νΌλ μ΄μ
filter, map, limit, skip, sorted ...
μ’ λ£ μ€νΌλ μ΄μ (terminal operation)
Stream λ¦¬ν΄ X
collect, allMatch, count, forEach, min, max ...
.
Stream API
νν°λ§
μ€νΈλ¦Ό λ³κ²½
μ€νΈλ¦Ό μμ±κ³Ό μ ν
μ€νΈλ¦Όμ μλ λ°μ΄ν°κ° νΉμ 쑰건μ λ§μ‘±νλμ§ νμΈ
μ€νΈλ¦Όμ λ°μ΄ν° νλλ‘ λμΉκΈ°
reduce(identity, BiFunction), collect(), sum(), max()
Optional
NullPointerException μ λ§λλ μ΄μ
null μ 리ν΄νκ³ , null 체ν¬λ₯Ό λμΉκΈ° λλ¬Έ
λ©μλμμ μμ μ€ νΉλ³ν μν©μμ κ°μ μ λλ‘ λ¦¬ν΄ν μ μλ κ²½μ° μ νν μ μλ λ°©λ²
μμΈ λμ§κΈ° (μ€ννΈλ μ΄μ€λ₯Ό μ°μ΄λ€λ³΄λ λΉμΌ λΉμ© λ°μ)
null λ¦¬ν΄ (ν΄λΌμ΄μΈνΈμͺ½μμ null μ²λ¦¬ νμ)
Optional λ¦¬ν΄ (ν΄λΌμ΄μΈνΈμκ² λͺ μμ μΌλ‘ λΉ κ°μΌ μλ μλ€λ κ²μ μ λ¬νκ³ , λΉ κ°μΈ κ²½μ°μ λν μ²λ¦¬λ₯Ό κ°μ )
Optional
ν κ°μ κ°μ΄ λ€μ΄μμ μλ μμ μλ μλ 컨λ€μ΄λ
μ£Όμμ
리ν΄κ°μΌλ‘λ§ μ¬μ© κΆμ₯
λ©μλ λ§€κ°λ³μ νμ μΌλ‘ μ¬μ© μ, λ²κ±°λ‘κ² null + optional μ²΄ν¬ νμ
λ§΅μ ν€ νμ μΌλ‘ μ¬μ© μ, λ§΅μ ν€κ° μμ μλ μλ€λ μν μ 곡
μΈμ€ν΄μ€ νλ νμ μΌλ‘ μ¬μ© μ, νλκ° μμ μλ μλ€λ μν μ 곡
null λμ Optional.empty() λ¦¬ν΄ κΆμ₯
Primitive Type Optional μ 곡
λ°μ±, μΈλ°μ± λ°μμ λ°©μ§νκ³ , μ±λ₯ ν₯μμ μν΄ μ¬μ© κΆμ₯
OptionalInt, OptionalLong ...
Collection, Map, Stream Array, Optionalμ Opiontal λ‘ λ λ² κ°μΈμ§ μκΈ°
Tired of Null Pointer Exceptions? Consider Using Java SE 8's "Optional"!
.
Optional API
Optional μμ±
Optional κ° ν¬ν¨ μ¬λΆ νμΈ
Optional κ° κ°μ Έμ€κΈ°
Optional μ κ°μ΄ μ‘΄μ¬ν κ²½μ° λμ μν
Optional μ κ°μ΄ μμ κ²½μ° κΊΌλ΄κ³ , 무쑰건 μλ‘μ΄ ν΄λμ€ μμ±
Optional μ κ°μ΄ μμ κ²½μ° κΊΌλ΄κ³ , μμΌλ©΄ μλ‘μ΄ ν΄λμ€ μ 곡
Optional μ κ°μ΄ μμ κ²½μ° κΊΌλ΄κ³ , μμΌλ©΄ μμΈ
Optional κ°μ νν°λ§
Optional κ°μ λ§€ν(λ³ν)
flatMap(Function): Optional μμ λ€μ΄μλ μΈμ€ν΄μ€κ° Optional μΈ κ²½μ° νΈλ¦¬
Date & Time API
java 8 μ μλ‘μ΄ λ μ§/μκ° API κ° μκΈ΄ μ΄μ
κ·Έ μ κΉμ§ μ¬μ©νλ java.util.Date ν΄λμ€λ mutable νκΈ° λλ¬Έμ thead safe νμ§ μμ
ν΄λμ€ μ΄λ¦μ΄ λͺ ννμ§ μμ(Date μΈλ° μκ°κΉμ§ λ€λ£¨λ λ±..)
λ²κ·Έκ° λ°μν μ¬μ§κ° λ§μ(νμ μμ μ±μ΄ μκ³ , μμ΄ 0λΆν° μμνλ λ±..)
λ μ§, μκ° μ²λ¦¬κ° 볡μ‘ν μ ν리μΌμ΄μ μμλ λ³΄ν΅ Joda Time μ¬μ©
java 8 μμ μ 곡νλ Date-Time API
JSR-310 μ€ν© ꡬν체 μ 곡
Clear: λμμ΄ λͺ ννκ³ μμ κ°λ₯Fluent: μ μ°ν μΈν°νμ΄μ€ μ 곡. λ©μλ νΈμΆμ μ°κ²°νμ¬ κ°κ²°ν¨ μ 곡Immutable: λΆλ³ κ°μ²΄ μμ±, thead safeExtensible: νμ₯ κ°λ₯
μ£Όμ API
κΈ°κ³μ© μκ°(
machine time)κ³Ό μΈλ₯μ© μκ°(human time)μΌλ‘ ꡬλΆκΈ°κ³μ© μκ°
EPOCK(1970λ 1μ 1μΌ 0μ 0λΆ 0μ΄)λΆν° νμ¬κΉμ§μ νμμ€ν¬νλ₯Ό νν
νμμ€ν¬νλ Instant μ¬μ©
μΈλ₯μ© μκ°
μ°λ¦¬κ° νν μ¬μ©νλ μ°,μ,μΌ,μ,λΆ,μ΄ λ±μ νν
νΉμ λ μ§(LocalDate), μκ°(LocalTime), μΌμ(LocalDateTime) μ¬μ© κ°λ₯
κΈ°κ°μ ννν λλ Duration(μκ° κΈ°λ°)κ³Ό Period(λ μ§ κΈ°λ°) μ¬μ© κ°λ₯
DateTimeFormatter λ₯Ό μ¬μ©ν΄μ μΌμλ₯Ό νΉμ ν λ¬Έμμ΄λ‘ ν¬λ§€ν κ°λ₯
μ°Έκ³
.
κΈ°κ³μ© μκ°(machine time) νν
UTC(Universal Time Coordinated) == GMT(Greenwich Mean Time)
λ³΄ν΅ μκ°μ μ¬λ κ²½μ° μ¬μ©
μΈλ₯μ© μκ°(human time) νν
LocalDateTime.of(int, Month, int, int, int, int): λ‘컬 νΉμ μΌμ
ZonedDateTime.of(int, Month, int, int, int, int, ZoneId): νΉμ Zone μ νΉμ μΌμ
λ μ§ μ°μ°
κΈ°κ° νν
Pasing/Formatting
λ κ±°μ API μ§μ
GregorianCalendar, Date νμ μ μΈμ€ν΄μ€λ₯Ό Instant/ZonedDateTime μΌλ‘ λ³ν κ°λ₯
java.util.TimeZone μμ java.time.ZoneId λ‘ μνΈ λ³ν κ°λ₯
CompletableFuture
Java Concurrency
Concurrent Software
λμμ μ¬λ¬ μμ μ ν μ μλ μννΈμ¨μ΄
Java Concurrency Programming
λ©ν°νλ‘μΈμ±(ProcessBuilder)
λ©ν°μ°λ λ
Java multi-thread Programming
Thread / Runnable
μ°λ λ μ£Όμ κΈ°λ₯(example)
sleep: νμ¬ μ°λ λ λ©μΆκΈ°
λ€λ₯Έ μ°λ λκ° μ²λ¦¬ν μ μλλ‘ κΈ°ν μ 곡(λ½μ λμ§ μμ, λ°λλ½ λ°μ κ°λ₯)
interrupt: λ€λ₯Έ μ°λ λ κΉ¨μ°κΈ°
λ€λ₯Έ μ°λ λλ₯Ό κΉ¨μμ interruptedExeption λ°μ
join: λ€λ₯Έ μ°λ λ λκΈ°
λ€λ₯Έ μ°λ λκ° λλ λκΉμ§ λκΈ°
λ€μμ μ€λ λλ₯Ό μ½λ©μΌλ‘ κ΄λ¦¬νκΈ° μ΄λ €μ. Execute μμ±.
Executors
High-Level Concurrency Programming
μ°λ λλ₯Ό μμ±νκ³ κ΄λ¦¬νλ μμ μ μ ν리μΌμ΄μ μμ λΆλ¦¬νκ³ Executors μκ² μμ
Executors μ νλ μΌ
μ°λ λ μμ±: μ ν리μΌμ΄μ μ΄ μ¬μ©ν μ°λ λ νμ λ§λ€μ΄ κ΄λ¦¬
μ°λ λ κ΄λ¦¬: μ°λ λ μλͺ μ£ΌκΈ°λ₯Ό κ΄λ¦¬
μμ μ²λ¦¬ λ° μ€ν: μ°λ λλ‘ μ€νν μμ μ μ 곡ν μ μλ API μ 곡
μ£Όμ μΈν°νμ΄μ€
Executor: execute(Runnable)ExecutorService: Executor λ₯Ό μμ λ°μ μΈν°νμ΄μ€Callable, Runnable μ€ν, Executor μ’ λ£
μ¬λ¬ Callable λμ μ€ν λ±μ κΈ°λ₯ μ 곡
ScheduledExecutorService: ExecutorService λ₯Ό μμ λ°μ μΈν°νμ΄μ€νΉμ μκ° μ΄ν λλ μ£ΌκΈ°μ μΌλ‘ μμ μ€ν
Fork/Join νλ μμν¬
ExecutorService ꡬνμ²΄λ‘ μ¬μ΄ λ©ν° νλ‘μΈμ νμ© μ§μ
Callable & Future
Callable
Runnable κ³Ό μ μ¬νμ§λ§ μμ μ κ²°κ³Όλ₯Ό 리ν΄
λΉλκΈ°μ μΈ μμ μ νμ¬ μνλ₯Ό μ‘°ννκ±°λ κ²°κ³Ό 리ν΄
CompletableFuture
μλ°μμ λΉλκΈ°(Asynchronous) νλ‘κ·Έλλ°μ΄ κ°λ₯νλλ‘ μ§μνλ μΈν°νμ΄μ€
Future λ‘λ λΉλκΈ° μ²λ¦¬κ° μ΄λμ λ κ°λ₯νμ§λ§, μ΄λ €μ΄ μμ λ€μ΄ λ€μ μ‘΄μ¬
Future λ₯Ό μΈλΆμμ μλ£ μ²λ¦¬ λΆκ°
cancel(), get() νμμμ μ€μ μ κ°λ₯
λΈλ‘νΉ μ½λ(ex. get())λ₯Ό μ¬μ©νμ§ μκ³ μλ μμ μ΄ λλ¬μ λ μ½λ°± μ€ν λΆκ°
μ¬λ¬ Future μ‘°ν© λΆκ°
ex. νμ¬ μ 보 μ‘°ν ν νμ¬ μ°Έμ νμ λͺ©λ‘ μ‘°ννκΈ°
μμΈ μ²λ¦¬μ© API μ 곡 X
Implements Future, CompletionStage
.
λΉλκΈ°λ‘ μμ
μ€ννκΈ°
.
μ½λ°± μ 곡νκΈ°
μ½λ°± μ체λ₯Ό λ λ€λ₯Έ μ°λ λμμ μ€ν κ°λ₯
.
μ‘°ν©νκΈ°
.
μμΈμ²λ¦¬
Etc..
μ λ
Έν
μ΄μ
μ λ³ν
java 8 μ λ Έν μ΄μ κ΄λ ¨ λ κ°μ§ ν° λ³ν
μ λ Έν μ΄μ μ
νμ μ μΈλΆ(μ λ€λ¦ νμ , λ³μ νμ , λ§€κ°λ³μ νμ , μμΈ νμ ...)μλ μ¬μ© κ°λ₯TYPE_PARAMETER: νμ λ³μμλ§ μ¬μ© κ°λ₯TYPE_USE: TYPE_PARAMETER ν¬ν¨ λͺ¨λ νμ μ μΈλΆμ μ¬μ© κ°λ₯
μ λ Έν μ΄μ μ€λ³΅ μ¬μ© κ°λ₯
.
Array Parallel Sorting
Arrays.parallelSort()
Fork/Join νλ μμν¬λ₯Ό μ¬μ©ν΄μ
λ°°μ΄μ λ³λ ¬λ‘ μ λ ¬νλ κΈ°λ₯ μ 곡λ³λ ¬ μ λ ¬ μκ³ λ¦¬λ¬
λ°°μ΄μ λλ‘ κ³μ μͺΌκ° ν ν©μΉλ©΄μ μ λ ¬
.
GC Metaspace
JVMμ μ¬λ¬ λ©λͺ¨λ¦¬ μμ μ€μ PermGen λ©λͺ¨λ¦¬ μμμ΄ μμ΄μ§κ³ Metaspace μμμ΄ λ±μ₯
PermGen(permanent generation)
ν΄λμ€ λ©νλ°μ΄ν°λ₯Ό λ΄λ μ μ₯μ(
Heapμμ)κΈ°λ³Έκ°μΌλ‘
μ νλ ν¬κΈ°λ₯Ό κ°μ§κ³ μμ
Metaspace
ν΄λμ€ λ©νλ°μ΄ν°λ₯Ό λ΄λ μ μ₯μ(Heap μμμ΄ μλλΌ,
Native Memoryμμ)κΈ°λ³Έκ°μΌλ‘ μ νλ ν¬κΈ°λ₯Ό κ°μ§κ³ μμ§ μμ(
νμν λ§νΌ κ³μ μ¦κ°)java 8 λΆν°λ PermGen κ΄λ ¨ μ΅μ μ 무μ
μ°Έκ³
JVM
JAVA, JVM, JDK, JRE

JVM(Java Virtual Machine)
μλ° λ°μ΄νΈ μ½λ(.class)λ₯Ό OS νΉνλ μ½λλ‘ λ³ν(μΈν°ν리ν°μ JIT μ»΄νμΌλ¬)νμ¬ μ€ν
νΉμ νλ«νΌμ μ’ μμ
λ°μ΄νΈ μ½λλ₯Ό μ€ννλ νμ€(JVM μ체λ νμ€)μ΄μ ꡬν체(νΉμ λ°΄λκ° κ΅¬νν JVM)
JVM λ°΄λ: Oracle, Amazon, Azul, ...
JRE(Java Runtime Environment): JVM + Library
μλ° μ ν리μΌμ΄μ μ μ€νν μ μλλ‘ κ΅¬μ±λ λ°°ν¬ν
JVM κ³Ό ν΅μ¬ λΌμ΄λΈλ¬λ¦¬ λ° μλ° λ°νμ νκ²½μμ μ¬μ©νλ νλ‘νΌν° μΈν μ΄λ 리μμ€ νμΌ λ³΄μ
κ°λ° κ΄λ ¨ λꡬλ λ―Έν¬ν¨(JDKμμ μ 곡)
JDK(Java Development Kit): JRE + Development Tool
μμ€ μ½λλ₯Ό μμ±ν λ μ¬μ©νλ μλ° μΈμ΄λ νλ«νΌμ λ 립μ
μ€λΌν΄μ μλ° 11λΆν°λ JDK λ§ μ 곡νλ©° JRE λ―Έμ 곡
Write Once Run Anywhere(WORA, ν λ²λ§ μμ±νλ©΄ μ΄λμμλ μ€ν κ°λ₯)
JAVA
νλ‘κ·Έλλ° μΈμ΄
JDK μ λ€μ΄μλ μλ° μ»΄νμΌλ¬(javac)λ₯Ό μ¬μ©νμ¬ λ°μ΄νΈμ½λ(.class)λ‘ μ»΄νμΌ κ°λ₯
μλ° μ λ£ν? μ€λΌν΄μμ λ§λ Oracle JDK 11 λ²μ λΆν° μμ©μΌλ‘ μ¬μ© μμλ§ μ λ£
JVM μΈμ΄
JVM κΈ°λ°μΌλ‘ λμνλ νλ‘κ·Έλλ° μΈμ΄
Clojure, Groovy, JRuby, Jython, Kotlin, Scala, ...
μ°Έκ³
.
JVM ꡬ쑰

Class Loader System
.class μμ λ°μ΄νΈμ½λλ₯Ό μ½κ³ λ©λͺ¨λ¦¬μ μ μ₯
loading: ν΄λμ€ μ½μ΄μ€λ κ³Όμ
linking: λ νΌλ°μ€λ₯Ό μ°κ²°νλ κ³Όμ
initialization: static κ°λ€μ μ΄κΈ°ν λ° λ³μμ ν λΉ
Memory
Stack Area
μ°λ λλ§λ€ λ°νμ μ€νμ λ§λ€κ³ , κ·Έ μμ λ©μλ νΈμΆμ μ€ν νλ μμ΄λΌ λΆλ₯΄λ λΈλμΌλ‘ μμ
μ°λ λλ₯Ό μ’ λ£νλ©΄ λ°νμ μ€νλ μλ©Έ(μ°λ λμμλ§ κ³΅μ )
PC(Program Counter) registers Area
μ°λ λλ§λ€ μ°λ λ λ΄ νμ¬ μ€νν instruction μμΉλ₯Ό κ°λ¦¬ν€λ ν¬μΈν° μμ±(μ°λ λμμλ§ κ³΅μ )
native method stack Area
μ°λ λλ§λ€ μμ±λκ³ , native method νΈμΆ μ μ¬μ©νλ λ³λμ method stack(μ°λ λμμλ§ κ³΅μ )
heap Area
κ°μ²΄ μ μ₯(곡μ μμ)
method Area
ν΄λμ€ μμ€μ μ 보(ν΄λμ€ μ΄λ¦, ν¨ν€μ§ κ²½λ‘, λΆλͺ¨ ν΄λμ€ μ΄λ¦, λ©μλ, λ³μ)μ μ₯(곡μ μμ)
Execution Engine
μΈν°ν리ν°
λ°μ΄νΈ μ½λλ₯Ό νμ€μ© μ€ν
JIT(Just-In-Time) μ»΄νμΌλ¬
μΈν°νλ¦¬ν° ν¨μ¨μ λμ΄κΈ° μν΄ μΈν°ν리ν°κ° λ°λ³΅λλ μ½λλ₯Ό λ°κ²¬νλ©΄ JIT μ»΄νμΌλ¬λ‘ λ°λ³΅λλ μ½λλ₯Ό λ€μ΄ν°λΈ μ½λλ‘ λ³κ²½
κ·Έ λ€μλΆν° μΈν°ν리ν°λ λ€μ΄ν°λΈ μ½λλ‘ μ»΄νμΌλ μ½λλ₯Ό λ°λ‘ μ¬μ©
GC(Garbage Collector)
λμ΄μ μ°Έμ‘°λμ§ μλ κ°μ²΄λ₯Ό λͺ¨μμ μ 리
JNI(Java Native Interface)
μλ° μ ν리μΌμ΄μ μμ C, C++, μ΄μ λΈλ¦¬λ‘ μμ±λ ν¨μλ₯Ό μ¬μ©ν μ μλ λ°©λ² μ 곡
Native ν€μλλ₯Ό μ¬μ©ν λ©μλ νΈμΆ
Native Method Library
C, C++λ‘ μμ±λ λΌμ΄λΈλ¬λ¦¬
JNI λ₯Ό ν΅ν΄ μ¬μ©
μ°Έκ³
.
Class Loader System
λ‘λ©, λ§ν¬, μ΄κΈ°ν μμΌλ‘ μ§ν

Loading
ν΄λμ€ λ‘λκ° .class νμΌμ μ½κ³ κ·Έ λ΄μ©μ λ°λΌ μ μ ν λ°μ΄λ리 λ°μ΄ν°λ₯Ό λ§λ€κ³ Method Memory μμμ μ μ₯
Method Memory μμμ μ μ₯νλ λ°μ΄ν°
FQCN(Full Qualified Class Name)
ν΄λμ€/μΈν°νμ΄μ€/μ΄λ
λ©μλμ λ³μ
λ‘λ©μ΄ λλλ©΄ ν΄λΉ ν΄λμ€ νμ μ Class κ°μ²΄λ₯Ό μμ±νμ¬ Heap μμμ μ μ₯
ν΄λμ€ λ‘λλ κ³μΈ΅ κ΅¬μ‘°λ‘ μ΄λ€μ Έ μμΌλ©΄ κΈ°λ³Έμ μΌλ‘ μΈκ°μ§ ν΄λμ€ λ‘λκ° μ 곡
BootstrapClassLoader
μ΅μμ μ°μ μμλ₯Ό κ°μ§ ν΄λμ€ λ‘λ
JAVA_HOME\lib μ μλ μ½μ΄ μλ° API μ 곡
PlatformClassLoader
JAVA_HOME\lib\ext ν΄λ λλ java.ext.dirs μμ€ν λ³μμ ν΄λΉνλ ν΄λμ€λ₯Ό μ½μ
AppClassLoader
μ ν리μΌμ΄μ ν΄λμ€ ν¨μ€μμ ν΄λμ€λ₯Ό μ½μ
ν΄λμ€ ν¨μ€: μ ν리μΌμ΄μ μ€ν μ -classpath μ΅μ λλ java.class.path νκ²½ λ³μ κ°μ ν΄λΉνλ μμΉ
μ΅μμ ν΄λμ€ λ‘λλΆν° ν΄λμ€λ₯Ό μ°Έμνλλ° λͺ¨λ ν΄λμ€ λ‘λκ° ν΄λμ€λ₯Ό μ°Ύμ§ λͺ» νλ€λ©΄ ClassNotFoundException λ°μ
Linking
Verify: .class νμΌ νμμ΄ μ ν¨νμ§ μ²΄ν¬
Preparation: ν΄λμ€ λ³μ(static λ³μ)μ κΈ°λ³Έκ°μ νμν λ©λͺ¨λ¦¬ μ€λΉ
Resolve(optional): μ¬λ³Όλ¦ λ©λͺ¨λ¦¬ λ νΌλ°μ€λ₯Ό λ©μλ μμμ μλ μ€μ λ νΌλ°μ€λ‘ κ΅μ²΄
Initialization
Static λ³μμ κ°μ ν λΉ(static λΈλμ΄ μλ€λ©΄ μ΄λ μ€ν)
Bytecode Operation
μ½λ 컀λ²λ¦¬μ§ μΈ‘μ
ν μ€νΈ μ½λκ° νμΈν μμ€ μ½λ λΉμ¨
.
ν΄λμ€ λ‘λ© μ λ°μ΄νΈμ½λ μ‘°μ
νλ‘κ·Έλ¨ λΆμ
μ½λμμ λ²κ·Έλ₯Ό μ°Ύλ ν΄
μ½λ 볡μ‘λ κ³μ°
ν΄λμ€ νμΌ μμ±
νλ‘μ
νΉμ API νΈμΆ μ κ·Ό μ ν
μ€μΉΌλΌ κ°μ μΈμ΄μ μ»΄νμΌλ¬
κ·Έλ°μλ μλ° μμ€μ½λλ₯Ό 건λλ¦¬μ§ μκ³ μ½λ λ³κ²½μ΄ νμν μ¬λ¬ κ²½μ°μ μ¬μ© κ°λ₯
νλ‘νμΌλ¬: CPU μ¬μ©λ₯ λ° λ©λͺ¨λ¦¬ μ¬μ©λ, Thread μ 보 ..
μ΅μ ν
λ‘κΉ
...
μ€νλ§μ λ°μ΄νΈμ½λ μ‘°μ ν΄ μ¬μ©: μ€νλ§ μ»΄ν¬λνΈ μ€μΊ
λΉμΌλ‘ λ±λ‘ν ν보 ν΄λμ€ μ 보λ₯Ό μ°Ύλλ° ASM μ¬μ©
ClassPathScanningCandidateComponentProvider -> SimpleMetadataReader
ClassReader, Visitor λ₯Ό μ¬μ©ν΄μ ν΄λμ€μ μλ λ©ν μ 보 μ‘°ν
μ°Έκ³
.
λ°μ΄νΈμ½λ μ‘°μ λΌμ΄λΈλ¬λ¦¬
.class νμΌ μ체λ₯Ό λ³κ²½μν€λ λ°©λ²
κΆμ₯νλ λΌμ΄λΈλ¬λ¦¬
ν΄λμ€ λ‘λκ° ν΄λμ€λ₯Ό μ½μ΄μ¬ λ javaagent λ₯Ό κ±°μ³μ λ³κ²½λ λ°μ΄νΈμ½λλ₯Ό μ½μ΄μ΄
premain: μμ μ λΆμ΄λ λ°©μ
agentmain: λ°νμ μ€ λμ μΌλ‘ λΆμ΄λ λ°©μ
java.lang.instrument μ¬μ©
CGlib
Reflection
리νλ μ μ μμμ Class<T>
Class<T> μ κ·Ό λ°©λ²
λͺ¨λ ν΄λμ€λ₯Ό λ‘λ© ν λ€μ Class<T> μΈμ€ν΄μ€ μμ±
νμ .classλ‘ μ κ·Ό κ°λ₯
λͺ¨λ μΈμ€ν΄μ€λ getClass() λ©μλ 보μ
μΈμ€ν΄μ€.getClass()λ‘ μ κ·Ό κ°λ₯
ν΄λμ€λ₯Ό λ¬Έμμ΄λ‘ μ½μ΄μ€λ λ°©λ²
Class.forName("FQCN")ν΄λμ€ν¨μ€μ ν΄λΉ ν΄λμ€κ° μλ€λ©΄ ClassNotFoundException λ°μ
Class<T> λ₯Ό ν΅ν΄ ν μ μλ κ²
νλ(λͺ©λ‘) κ°μ Έμ€κΈ°
λ©μλ(λͺ©λ‘) κ°μ Έμ€κΈ°
μμ ν΄λμ€ κ°μ Έμ€κΈ°
μΈν°νμ΄μ€(λͺ©λ‘) κ°μ Έμ€κΈ°
μ λ Έν μ΄μ κ°μ Έμ€κΈ°
μμ±μ κ°μ Έμ€κΈ° ...
.
Annotation & Reflection
Annotaion
@Retention: ν΄λΉ μ λ Έν μ΄μ μ μΈμ κΉμ§ μ μ§ν κ²μΈκ°. (SOURCE, CLASS, RUNTIME)
@Target: μ΄λμ μ¬μ©ν μ μλκ°. (TYPE, FIELD, METHOD, PARAMETER ..)
@Inherit: ν΄λΉ μ λ Έν μ΄μ μ νμ ν΄λμ€κΉμ§ μ λ¬ν κ²μΈκ°.
Reflection
getAnnotations(): μμλ°μ(@Inherit) μ λ Έν μ΄μ κΉμ§ μ‘°ν
getDeclaredAnnotations(): μκΈ° μμ μλ§ λΆμ΄μλ μ λ Έν μ΄μ μ‘°ν
.
Edit class information or Run
.
Reflection μ νμ©νμ¬ κ°λ¨ν DI νλ μμν¬ λ§λ€μ΄λ³΄κΈ°
@Inject μ μΈμΌλ‘ νλ μ£Όμ μ ν΄μ£Όλ 컨ν μ΄λ μλΉμ€
ContainerService.getObject
classType μ ν΄λΉνλ νμ μ κ°μ²΄ μμ±
ν΄λΉ κ°μ²΄μ νλ μ€μ @Inject κ° μλ€λ©΄ ν΄λΉ νλλ κ°μ΄ λ§λ€μ΄ μ 곡
.
Reflection μ 리
리νλ μ μ¬μ© μ μ£Όμ
μ§λμΉ μ¬μ©(무λΆλ³ν μΈμ€ν΄μ€ μμ±μΌλ‘)μ μ±λ₯ μ΄μλ₯Ό μΌκΈ°ν μ μμΌλ―λ‘ λ°λμ νμν κ²½μ°μλ§ μ¬μ© κΆμ₯
μ»΄νμΌ νμμ νμΈλμ§ μκ³ λ°νμ μμλ§ λ°μνλ λ¬Έμ λ₯Ό λ§λ€ κ°λ₯μ± μ‘΄μ¬
μ κ·Ό μ§μμ 무μ
리νλ μ μ¬μ© μ¬λ‘
Spring.
μμ‘΄μ± μ£Όμ
MVC View μμ λμ΄μ¨ λ°μ΄ν°λ₯Ό κ°μ²΄μ λ°μΈλ© ν λ
Hibernate.
@Entity ν΄λμ€μ Setter κ° μλ€λ©΄ 리νλ μ μ¬μ©
Reference.
Dynamic Proxy
λ°νμμ μΈν°νμ΄μ€/ν΄λμ€μ νλ‘μ μΈμ€ν΄μ€/ν΄λμ€λ₯Ό λ§λ€μ΄ μ¬μ©νλ νλ‘κ·Έλλ° κΈ°λ²
java.lang.
reflect.proxy
Spring Data JPA λ μ΄λ»κ² λμν κΉ?
μΈν°νμ΄μ€ νμ μ μΈμ€ν΄μ€λ λκ° λ§λ€μ΄ μ€κΉ?
JpaRepository μΈν°νμ΄μ€λ₯Ό μμλ°μΌλ©΄ κ°μ²΄λ μμ±λκ³ , λΉμΌλ₯΄λ λ±λ‘
Spring AOP κΈ°λ°μΌλ‘ λμνλ©° RepositoryFactorySupport μμ νλ‘μ κ°μ²΄ μμ±
μμ±λ νλ‘μ κ°μ²΄κ° λΉμΌλ‘ λ±λ‘λκ³ μ£Όμ
Dynamic Proxy μ¬μ© μ
Spring Data JPA
Spring AOP
Mockito
Hibernate lazy initialzation ...
.
Proxy Pattern

νλ‘μμ λ¦¬μΌ μλΈμ νΈκ° 곡μ νλ μΈν°νμ΄μ€κ° μκ³ , ν΄λΌμ΄μΈνΈλ ν΄λΉ μΈν°νμ΄μ€ νμ μΌλ‘ νλ‘μ μ¬μ©
ν΄λΌμ΄μΈνΈλ νλ‘μλ₯Ό κ±°μ³μ λ¦¬μΌ μλΈμ νΈλ₯Ό μ¬μ©
νλ‘μλ λ¦¬μΌ μλΈμ νΈμ λν μ κ·Ό κ΄λ¦¬, λΆκ° κΈ°λ₯ μ 곡, 리ν΄κ° λ³κ²½ κ°λ₯
λ¦¬μΌ μλΈμ νΈλ μμ μ΄ ν΄μΌ ν μΌλ§ νλ©΄μ(SRP) νλ‘μ μ¬μ©
λΆκ°μ μΈ κΈ°λ₯(μ κ·Ό μ ν, λ‘κΉ , νΈλμμ λ±) μ 곡 μ νλ‘μ ν¨ν΄μ μ£Όλ‘ μ¬μ©
λ¨μ
νλ‘μ ν¨ν΄μΌλ‘ ꡬννλ κ²μ λ²κ±°λ‘μ΄ μΌ
λΆκ°μ μΈ κΈ°λ₯μ μΆκ°ν λλ§λ€ λ³λ νλ‘μ μμ± νμ
νλ‘μλ‘ νλ‘μλ₯Ό κ°μΈμΌ νλ μΌλ λ°μ
λͺ¨λ ꡬν체μμ μλ νκ²μΌλ‘ μμνλ©΄μ μ€λ³΅ μ½λ λ°μ
νλ‘μ ν¨ν΄μ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ λμ μΌλ‘ λ°νμμ νλ‘μλ₯Ό μμ±ν΄λ΄λ λ€μ΄λλ―Ή νλ‘μ λ±μ₯
.
Dynamic Proxy
λ°νμμ νΉμ μΈν°νμ΄μ€λ€μ ꡬννλ ν΄λμ€ λλ μΈμ€ν΄μ€λ₯Ό λ§λλ κΈ°μ
λ¨μ .
ν΄λμ€ κΈ°λ°μ νλ‘μ μμ± λΆκ° -> μΈν°νμ΄μ€κ° μμ κ²½μ° λ€μ΄λλ―Ή νλ‘μ μ μ© λΆκ°
λΆκ°κΈ°λ₯μ΄ λ§μμ§μλ‘ μ½λκ° μ»€μ§λ μ μ°νμ§ μμ ꡬ쑰
νλ‘μ κΈ°λ° AOP μΈ μ€νλ§ AOP λ±μ₯
.
Class Proxy
μΈν°νμ΄μ€ μμ΄ νλ‘μ λ§λ€κΈ°
Spring, Hibernate μμλ μ¬μ©νλ λΌμ΄λΈλ¬λ¦¬
λ²μ νΈνμ±μ΄ μ’μ§ μμμ μλ‘ λ€λ₯Έ λΌμ΄λΈλ¬λ¦¬ λ΄λΆμ λ΄μ₯λ ννλ‘ μ 곡λκΈ°λ ν¨
λ°μ΄νΈ μ½λ μ‘°μ λΏ μλλΌ λ°νμ(λ€μ΄λλ―Ή) νλ‘μ μμ± μμλ μ¬μ©
μΈν°νμ΄μ€ μμ΄ νλ‘μλ₯Ό μμ±ν κ²½μ° λ¨μ
μμμ μ¬μ©νμ§ λͺ»νλ κ²½μ° νλ‘μ μμ± λΆκ°
Final ν΄λμ€μΈ κ²½μ°
Private μμ±μλ§ μλ κ²½μ°
κ°κΈμ νλ‘μ μ μ© μ μΈν°νμ΄μ€λ₯Ό λ§λ€μ΄μ μΈν°νμ΄μ€ νλ‘μλ₯Ό μ¬μ©νλ κ²μ κΆμ₯
Annotation processor
μ λ Έν μ΄μ νλ‘μΈμ μ¬μ© μ
Lombokνμ€μΌλ‘ μμ±ν΄μΌ νλ μ½λλ₯Ό κ°λ°μ λμ μμ±ν΄ μ£Όλ λΌμ΄λΈλ¬λ¦¬
AutoServicejava.util.ServiceLoader μ© νμΌ μμ± μ νΈλ¦¬ν°
@OverrideReflection API λ₯Ό μ¬μ©νμ¬ μνΌ ν΄λμ€μ ν΄λΉνλ λ©μλμ μΌμΉνλ νλͺ©μ΄ μλ€λ©΄ μ»΄νμΌ μ€λ₯ λ°μ
μ»΄νμΌ νμ DI μ 곡
μ₯μ
λ°νμ λΉμ©μ΄ μ λ‘
λ¨μ
κΈ°μ‘΄ ν΄λμ€ μ½λλ₯Ό λ³κ²½ν λλ μ½κ°μ hack νμ
.
Lombok
@Getter, @Setter λ±μ μ λ Έν μ΄μ κ³Ό μ λ Έν μ΄μ νλ‘μΈμλ₯Ό μ 곡νμ¬ νμ€ μμ± μ½λλ₯Ό κ°λ°μ λμ μμ±ν΄μ£Όλ λΌμ΄λΈλ¬λ¦¬
둬볡μ λμ μ리
μ»΄νμΌ μμ μ μ λ Έν μ΄μ νλ‘μΈμλ₯Ό μ¬μ©νμ¬ μμ€μ½λμ AST(abstract syntax tree) μ‘°μ
둬볡μ λ Όλ 거리
곡κ°λ API κ° μλ μ»΄νμΌλ¬ λ΄λΆ ν΄λμ€λ₯Ό μ¬μ©νμ¬ κΈ°μ‘΄ μμ€ μ½λλ₯Ό μ‘°μ
νΉν μ΄ν΄λ¦½μ€μ κ²½μ°μ java agent λ₯Ό μ¬μ©νμ¬ μ»΄νμΌλ¬ ν΄λμ€κΉμ§ μ‘°μνμ¬ μ¬μ©
ν΄λΉ ν΄λμ€λ€ μμ 곡κ°λ API κ° μλλ€λ³΄λ λ²μ νΈνμ±μ λ¬Έμ κ° μκΈΈ μ μμ
κ·ΈλΌμλ μμ²λ νΈλ¦¬ν¨μΌλ‘ λ리 μ°μ΄κ³ , λμμ΄ λͺκ°μ§ μμ§λ§ 둬볡μ λͺ¨λ κΈ°λ₯κ³Ό νΈμμ±μ λ체 λΆκ°
.
Annotation processor
μ¬λ¬ λΌμ΄λ(rounds)μ κ±°μ³ μμ€ λ° μ»΄νμΌ λ μ½λλ₯Ό μ²λ¦¬
AutoService
ServiceProvider λ μ§μ€νΈλ¦¬ μμ±κΈ°
μ»΄νμΌ μμ μ μ λ Έν μ΄μ νλ‘μΈμλ₯Ό μ¬μ©νμ¬
META-INF/services/javax.annotation.processor.ProcessorνμΌ μλ μμ±
javapoet
μμ€ μ½λ μμ± μ νΈλ¦¬ν°
Interface Filer
μμ€ μ½λ, ν΄λμ€ μ½λ λ° λ¦¬μμ€λ₯Ό μμ±ν μ μλ μΈν°νμ΄μ€
μ°Έκ³ .
Last updated