The Java

๋ฐฑ๊ธฐ์„ ๋‹˜์˜ ๋” ์ž๋ฐ”, Java 8arrow-up-right, ๋” ์ž๋ฐ”, ์ฝ”๋“œ๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•arrow-up-right ๊ฐ•์˜๋ฅผ ์š”์•ฝํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

Java 8

Java 8

.

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

Lambda Expressionsarrow-up-right

(์ธ์ž ๋ฆฌ์ŠคํŠธ) -> {๋ฐ”๋””}

.

์ธ์ž ๋ฆฌ์ŠคํŠธ

  • ์ธ์ž ์—†์Œ: ()

  • ์ธ์ž๊ฐ€ ํ•œ ๊ฐœ: (one) ๋˜๋Š” one

  • ์ธ์ž๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ: (one, two)

  • ์ธ์ž์˜ ํƒ€์ž…์€ ์ƒ๋žต ๊ฐ€๋Šฅ(์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ถ”๋ก ํ•˜์ง€๋งŒ ๋ช…์‹œ๋„ ๊ฐ€๋Šฅ)

.

๋ฐ”๋””

  • ํ™”์‚ดํ‘œ ์˜ค๋ฅธ์ชฝ์— ํ•จ์ˆ˜ ๋ณธ๋ฌธ ์ •์˜

  • ์—ฌ๋Ÿฌ ์ค„์ธ ๊ฒฝ์šฐ {} ์‚ฌ์šฉ

  • ํ•œ ์ค„์ธ ๊ฒฝ์šฐ ๋ฐ”๋””, return ์ƒ๋žต ๊ฐ€๋Šฅ

.

๋ณ€์ˆ˜ ์บก์ฒ˜(Variable Capture)

  • ๋กœ์ปฌ ๋ณ€์ˆ˜ ์บก์ฒ˜

    • final, effective final ์ธ ๊ฒฝ์šฐ์—๋งŒ ์ฐธ์กฐ ๊ฐ€๋Šฅ

    • ๊ทธ๋ ‡์ง€ ์•Š์„ ๊ฒฝ์šฐ, concurrency ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์–ด์„œ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ฐฉ์ง€

  • effective final

    • ์ž๋ฐ” 8๋ถ€ํ„ฐ ์ง€์›ํ•˜๋Š” ๊ธฐ๋Šฅ

    • final ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์ง€๋งŒ, ๋ณ€๊ฒฝ์ด ์—†๋Š” ๋ณ€์ˆ˜๋ฅผ ์ต๋ช… ํด๋ž˜์Šค ๊ตฌํ˜„์ฒด, ๋žŒ๋‹ค์—์„œ ์ฐธ์กฐ ๊ฐ€๋Šฅ

  • ๋žŒ๋‹ค๋Š” ์ต๋ช… ํด๋ž˜์Šค ๊ตฌํ˜„์ฒด์™€ ๋‹ฌ๋ฆฌ Shadowingarrow-up-rightํ•˜์ง€ ์•Š์Œ

    • ์ต๋ช… ํด๋ž˜์Šค๋Š” ์ƒˆ๋กœ์šด ์Šค์ฝฅ์„ ๋งŒ๋“ค์ง€๋งŒ, ๋žŒ๋‹ค๋Š” ๋žŒ๋‹ค๋ฅผ ๊ฐ์‹ธ๊ณ  ์žˆ๋Š” ์Šค์ฝฅ๊ณผ ๊ฐ™์Œ

    • ๋žŒ๋‹ค๋ฅผ ๊ฐ์‹ผ ์Šค์ฝฅ์— ์žˆ๋Š” ๋™์ผํ•œ ์ด๋ฆ„์˜ ๋ณ€์ˆ˜ ์ •์˜ ๋ถˆ๊ฐ€

Method Reference

Method Referencesarrow-up-right ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฉ”์†Œ๋“œ, ์ƒ์„ฑ์ž ํ˜ธ์ถœ๋ฅผ ๋งค์šฐ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ํ‘œํ˜„ ๊ฐ€๋Šฅ

Interface

Default Methodsarrow-up-right

Collection interface

  • ์ธํ„ฐํŽ˜์ด์Šค์— ๋ฉ”์†Œ๋“œ ์„ ์–ธ์ด ์•„๋‹ˆ๋ผ ๊ตฌํ˜„์ฒด๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ๋ฒ•

  • ๊ตฌํ˜„ ํด๋ž˜์Šค๋ฅผ ๊นจ๋œจ๋ฆฌ์ง€ ์•Š๊ณ  ์ƒˆ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ๊ฐ€๋Šฅ

  • Default Methods ๋Š” ๊ตฌํ˜„์ฒด ๋ชจ๋ฅด๊ฒŒ ์ถ”๊ฐ€๋œ ๊ธฐ๋Šฅ์œผ๋กœ ๋ฆฌ์Šคํฌ ์กด์žฌ

    • ์ปดํŒŒ์ผ ์—๋Ÿฌ๋Š” ์•„๋‹ˆ์ง€๋งŒ ๊ตฌํ˜„์ฒด์— ๋”ฐ๋ผ ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ(ex. NPE) ๋ฐœ์ƒ ๊ฐ€๋Šฅ

    • ๋ฐ˜๋“œ์‹œ ๋ฌธ์„œํ™” ํ•„์š”(@implSpec ์‚ฌ์šฉ)

    • ํ•„์š” ์‹œ ๊ตฌํ˜„์ฒด๊ฐ€ ์žฌ์ •์˜

  • Object ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ(equals, hasCode)์€ ๊ธฐ๋ณธ ๋ฉ”์†Œ๋“œ๋กœ ์ œ๊ณต ๋ถˆ๊ฐ€

    • ๊ตฌํ˜„์ฒด๊ฐ€ ์žฌ์ •์˜

  • ๋ณธ์ธ์ด ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์—๋งŒ ๊ธฐ๋ณธ ๋ฉ”์†Œ๋“œ ์ œ๊ณต ๊ฐ€๋Šฅ

  • ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋ฐ›๋Š” ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ๊ธฐ๋ณธ ๋ฉ”์†Œ๋“œ๋ฅผ ๋‹ค์‹œ ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋กœ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ

  • ๊ธฐ๋ณธ ๋ฉ”์†Œ๋“œ๊ฐ€ ์ถฉ๋™ํ•˜๋Š” ๊ฒฝ์šฐ ์ง์ ‘ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•„์š”

.

Static Method

  • ํ•ด๋‹น ํƒ€์ž… ๊ด€๋ จ ํ—ฌํผ, ์œ ํ‹ธ๋ฆฌํ‹ฐ ๋ฉ”์†Œ๋“œ ์ œ๊ณต ์‹œ ์œ ์šฉ

.

Java 8 Default Methods

Iterablearrow-up-right ๊ธฐ๋ณธ ๋ฉ”์†Œ๋“œ

Collectionarrow-up-right ๊ธฐ๋ณธ ๋ฉ”์†Œ๋“œ

  • parallelStream(), spliterator()

Comparatorarrow-up-right ๊ธฐ๋ณธ ๋ฉ”์†Œ๋“œ ๋ฐ ์Šคํƒœํ‹ฑ ๋ฉ”์†Œ๋“œ

  • thenComparing()

  • static reverseOrder() / naturalOrder()

  • static nullsFirst() / nullsLast()

  • static comparing()

Spliteratorarrow-up-right ๊ธฐ๋ณธ ๋ฉ”์†Œ๋“œ

  • forEachRemaining(Consumer)

  • getExactSizeIfKnown()

  • hasCharacteristics()

  • getComparator()

Stream

Package java.util.streamarrow-up-right

Streamarrow-up-right

  • ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ์ €์žฅ์†Œ(์ปฌ๋ ‰์…˜)๊ฐ€ ์•„๋‹ˆ๋ผ, ์–ด๋– ํ•œ ์—ฐ์†๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์˜คํผ๋ ˆ์ด์…˜๋“ค์˜ ๋ชจ์Œ

  • ์ŠคํŠธ๋ฆผ ์ฒ˜๋ฆฌ ์‹œ ๋ฐ์ดํ„ฐ ์›๋ณธ์€ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Œ

  • ์ŠคํŠธ๋ฆผ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ์ดํ„ฐ๋Š” ์˜ค์ง ํ•œ ๋ฒˆ๋งŒ ์ฒ˜๋ฆฌ

  • ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ŠคํŠธ๋ฆผ ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์˜ฌ ๊ฒฝ์šฐ ๋ฌดํ•œ ์ฒ˜๋ฆฌ(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

StreamTestarrow-up-right

ํ•„ํ„ฐ๋ง

์ŠคํŠธ๋ฆผ ๋ณ€๊ฒฝ

์ŠคํŠธ๋ฆผ ์ƒ์„ฑ๊ณผ ์ œํ•œ

์ŠคํŠธ๋ฆผ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ํŠน์ • ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š”์ง€ ํ™•์ธ

์ŠคํŠธ๋ฆผ์„ ๋ฐ์ดํ„ฐ ํ•˜๋‚˜๋กœ ๋ญ‰์น˜๊ธฐ

  • reduce(identity, BiFunction), collect(), sum(), max()

Optional

Class Optionalarrow-up-right

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"!arrow-up-right

.

Optional API

OptionalTestarrow-up-right

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 Timearrow-up-right ์‚ฌ์šฉ

java 8 ์—์„œ ์ œ๊ณตํ•˜๋Š” Date-Time API

  • JSR-310 ์ŠคํŒฉarrow-up-right ๊ตฌํ˜„์ฒด ์ œ๊ณต

  • Design Principlesarrow-up-right

    • Clear: ๋™์ž‘์ด ๋ช…ํ™•ํ•˜๊ณ  ์˜ˆ์ƒ ๊ฐ€๋Šฅ

    • Fluent: ์œ ์—ฐํ•œ ์ธํ„ฐํŽ˜์ด์Šค ์ œ๊ณต. ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ์„ ์—ฐ๊ฒฐํ•˜์—ฌ ๊ฐ„๊ฒฐํ•จ ์ œ๊ณต

    • Immutable: ๋ถˆ๋ณ€ ๊ฐ์ฒด ์ƒ์„ฑ, thead safe

    • Extensible: ํ™•์žฅ ๊ฐ€๋Šฅ

์ฃผ์š” API

  • ๊ธฐ๊ณ„์šฉ ์‹œ๊ฐ„(machine time)๊ณผ ์ธ๋ฅ˜์šฉ ์‹œ๊ฐ„(human time)์œผ๋กœ ๊ตฌ๋ถ„

  • ๊ธฐ๊ณ„์šฉ ์‹œ๊ฐ„

    • EPOCK(1970๋…„ 1์›” 1์ผ 0์‹œ 0๋ถ„ 0์ดˆ)๋ถ€ํ„ฐ ํ˜„์žฌ๊นŒ์ง€์˜ ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ํ‘œํ˜„

    • ํƒ€์ž„์Šคํƒฌํ”„๋Š” Instant ์‚ฌ์šฉ

  • ์ธ๋ฅ˜์šฉ ์‹œ๊ฐ„

    • ์šฐ๋ฆฌ๊ฐ€ ํ”ํžˆ ์‚ฌ์šฉํ•˜๋Š” ์—ฐ,์›”,์ผ,์‹œ,๋ถ„,์ดˆ ๋“ฑ์„ ํ‘œํ˜„

    • ํŠน์ • ๋‚ ์งœ(LocalDate), ์‹œ๊ฐ„(LocalTime), ์ผ์‹œ(LocalDateTime) ์‚ฌ์šฉ ๊ฐ€๋Šฅ

    • ๊ธฐ๊ฐ„์„ ํ‘œํ˜„ํ•  ๋•Œ๋Š” Duration(์‹œ๊ฐ„ ๊ธฐ๋ฐ˜)๊ณผ Period(๋‚ ์งœ ๊ธฐ๋ฐ˜) ์‚ฌ์šฉ ๊ฐ€๋Šฅ

    • DateTimeFormatter ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ผ์‹œ๋ฅผ ํŠน์ •ํ•œ ๋ฌธ์ž์—ด๋กœ ํฌ๋งคํŒ… ๊ฐ€๋Šฅ

์ฐธ๊ณ 

.

DateTest.javaarrow-up-right

๊ธฐ๊ณ„์šฉ ์‹œ๊ฐ„(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

Java Concurrencyarrow-up-right

Concurrent Software

  • ๋™์‹œ์— ์—ฌ๋Ÿฌ ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ๋Š” ์†Œํ”„ํŠธ์›จ์–ด

Java Concurrency Programming

  • ๋ฉ€ํ‹ฐํ”„๋กœ์„ธ์‹ฑ(ProcessBuilder)

  • ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ

Java multi-thread Programming

  • Thread / Runnable

์“ฐ๋ ˆ๋“œ ์ฃผ์š” ๊ธฐ๋Šฅ(examplearrow-up-right)

  • sleeparrow-up-right: ํ˜„์žฌ ์“ฐ๋ ˆ๋“œ ๋ฉˆ์ถ”๊ธฐ

    • ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ธฐํšŒ ์ œ๊ณต(๋ฝ์„ ๋†“์ง„ ์•Š์Œ, ๋ฐ๋“œ๋ฝ ๋ฐœ์ƒ ๊ฐ€๋Šฅ)

  • interruptarrow-up-right: ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ ๊นจ์šฐ๊ธฐ

    • ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ๋ฅผ ๊นจ์›Œ์„œ interruptedExeption ๋ฐœ์ƒ

  • joinarrow-up-right: ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ ๋Œ€๊ธฐ

    • ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋๋‚  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ

๋‹ค์ˆ˜์˜ ์Šค๋ ˆ๋“œ๋ฅผ ์ฝ”๋”ฉ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ์–ด๋ ค์›€. Execute ์ƒ์„ฑ.

Executors

High-Level Concurrency Programming

  • ์“ฐ๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ์ž‘์—…์„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ถ„๋ฆฌํ•˜๊ณ  Executors ์—๊ฒŒ ์œ„์ž„

Executorsarrow-up-right ์˜ ํ•˜๋Š” ์ผ

  • ์“ฐ๋ ˆ๋“œ ์ƒ์„ฑ: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‚ฌ์šฉํ•  ์“ฐ๋ ˆ๋“œ ํ’€์„ ๋งŒ๋“ค์–ด ๊ด€๋ฆฌ

  • ์“ฐ๋ ˆ๋“œ ๊ด€๋ฆฌ: ์“ฐ๋ ˆ๋“œ ์ƒ๋ช… ์ฃผ๊ธฐ๋ฅผ ๊ด€๋ฆฌ

  • ์ž‘์—… ์ฒ˜๋ฆฌ ๋ฐ ์‹คํ–‰: ์“ฐ๋ ˆ๋“œ๋กœ ์‹คํ–‰ํ•  ์ž‘์—…์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋Š” API ์ œ๊ณต

์ฃผ์š” ์ธํ„ฐํŽ˜์ด์Šค

  • Executor: execute(Runnable)

  • ExecutorService: Executor ๋ฅผ ์ƒ์† ๋ฐ›์€ ์ธํ„ฐํŽ˜์ด์Šค

    • Callable, Runnable ์‹คํ–‰, Executor ์ข…๋ฃŒ

    • ์—ฌ๋Ÿฌ Callable ๋™์‹œ ์‹คํ–‰ ๋“ฑ์˜ ๊ธฐ๋Šฅ ์ œ๊ณต

  • ScheduledExecutorService: ExecutorService ๋ฅผ ์ƒ์† ๋ฐ›์€ ์ธํ„ฐํŽ˜์ด์Šค

    • ํŠน์ • ์‹œ๊ฐ„ ์ดํ›„ ๋˜๋Š” ์ฃผ๊ธฐ์ ์œผ๋กœ ์ž‘์—… ์‹คํ–‰

examplearrow-up-right

Fork/Join ํ”„๋ ˆ์ž„์›Œํฌ

  • ExecutorService ๊ตฌํ˜„์ฒด๋กœ ์‰ฌ์šด ๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์„œ ํ™œ์šฉ ์ง€์›

Callable & Future

Callable

  • Runnable ๊ณผ ์œ ์‚ฌํ•˜์ง€๋งŒ ์ž‘์—…์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํ„ด

Futurearrow-up-right

  • ๋น„๋™๊ธฐ์ ์ธ ์ž‘์—…์˜ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ์กฐํšŒํ•˜๊ฑฐ๋‚˜ ๊ฒฐ๊ณผ ๋ฆฌํ„ด

CallableAndFuture.javaarrow-up-right

CompletableFuture

์ž๋ฐ”์—์„œ ๋น„๋™๊ธฐ(Asynchronous) ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ์ง€์›ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค

  • Future ๋กœ๋„ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์–ด๋А์ •๋„ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ์–ด๋ ค์šด ์ž‘์—…๋“ค์ด ๋‹ค์ˆ˜ ์กด์žฌ

    • Future ๋ฅผ ์™ธ๋ถ€์—์„œ ์™„๋ฃŒ ์ฒ˜๋ฆฌ ๋ถˆ๊ฐ€

      • cancel(), get() ํƒ€์ž„์•„์›ƒ ์„ค์ •์€ ๊ฐ€๋Šฅ

    • ๋ธ”๋กœํ‚น ์ฝ”๋“œ(ex. get())๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ ์„œ๋Š” ์ž‘์—…์ด ๋๋‚ฌ์„ ๋•Œ ์ฝœ๋ฐฑ ์‹คํ–‰ ๋ถˆ๊ฐ€

    • ์—ฌ๋Ÿฌ Future ์กฐํ•ฉ ๋ถˆ๊ฐ€

      • ex. ํ–‰์‚ฌ ์ •๋ณด ์กฐํšŒ ํ›„ ํ–‰์‚ฌ ์ฐธ์„ ํšŒ์› ๋ชฉ๋ก ์กฐํšŒํ•˜๊ธฐ

    • ์˜ˆ์™ธ ์ฒ˜๋ฆฌ์šฉ API ์ œ๊ณต X

CompletableFuturearrow-up-right

.

๋น„๋™๊ธฐ๋กœ ์ž‘์—… ์‹คํ–‰ํ•˜๊ธฐ

.

์ฝœ๋ฐฑ ์ œ๊ณตํ•˜๊ธฐ

.

์กฐํ•ฉํ•˜๊ธฐ

.

์˜ˆ์™ธ์ฒ˜๋ฆฌ

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

Result

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)๋กœ ์ปดํŒŒ์ผ ๊ฐ€๋Šฅ

  • ์ž๋ฐ” ์œ ๋ฃŒํ™”arrow-up-right? ์˜ค๋ผํด์—์„œ ๋งŒ๋“  Oracle JDK 11 ๋ฒ„์ „๋ถ€ํ„ฐ ์ƒ์šฉ์œผ๋กœ ์‚ฌ์šฉ ์‹œ์—๋งŒ ์œ ๋ฃŒ

JVM ์–ธ์–ด

  • JVM ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด

  • Clojure, Groovy, JRuby, Jython, Kotlin, Scala, ...

์ฐธ๊ณ 

.

JVM ๊ตฌ์กฐ

Result

Class Loader System

  • .class ์—์„œ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ์ฝ๊ณ  ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ

  • loading: ํด๋ž˜์Šค ์ฝ์–ด์˜ค๋Š” ๊ณผ์ •

  • linking: ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๊ณผ์ •

  • initialization: static ๊ฐ’๋“ค์„ ์ดˆ๊ธฐํ™” ๋ฐ ๋ณ€์ˆ˜์— ํ• ๋‹น

Memory

Java JVM Run-time Data Areasarrow-up-right

  • 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

๋กœ๋”ฉ, ๋งํฌ, ์ดˆ๊ธฐํ™” ์ˆœ์œผ๋กœ ์ง„ํ–‰

Result

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 ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํด๋ž˜์Šค์— ์žˆ๋Š” ๋ฉ”ํƒ€ ์ •๋ณด ์กฐํšŒ

์ฐธ๊ณ 

.

๋ฐ”์ดํŠธ์ฝ”๋“œ ์กฐ์ž‘ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

  • ByteBuddyarrow-up-right

    • .class ํŒŒ์ผ ์ž์ฒด๋ฅผ ๋ณ€๊ฒฝ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•

    • ๊ถŒ์žฅํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

  • Javassistarrow-up-right

    • ํด๋ž˜์Šค ๋กœ๋”๊ฐ€ ํด๋ž˜์Šค๋ฅผ ์ฝ์–ด์˜ฌ ๋•Œ javaagent ๋ฅผ ๊ฑฐ์ณ์„œ ๋ณ€๊ฒฝ๋œ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ์ฝ์–ด์˜ด

      • premain: ์‹œ์ž‘ ์‹œ ๋ถ™์ด๋Š” ๋ฐฉ์‹

      • agentmain: ๋Ÿฐํƒ€์ž„ ์ค‘ ๋™์ ์œผ๋กœ ๋ถ™์ด๋Š” ๋ฐฉ์‹

  • CGlib

Reflection

๋ฆฌํ”Œ๋ ‰์…˜์˜ ์‹œ์ž‘์€ Class<T>arrow-up-right

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

BallTestarrow-up-right

.

Reflection ์„ ํ™œ์šฉํ•˜์—ฌ ๊ฐ„๋‹จํ•œ DI ํ”„๋ ˆ์ž„์›Œํฌ ๋งŒ๋“ค์–ด๋ณด๊ธฐ

@Inject ์„ ์–ธ์œผ๋กœ ํ•„๋“œ ์ฃผ์ž…์„ ํ•ด์ฃผ๋Š” ์ปจํ…Œ์ด๋„ˆ ์„œ๋น„์Šคarrow-up-right

ContainerService.getObject

  • classType ์— ํ•ด๋‹นํ•˜๋Š” ํƒ€์ž…์˜ ๊ฐ์ฒด ์ƒ์„ฑ

  • ํ•ด๋‹น ๊ฐ์ฒด์˜ ํ•„๋“œ ์ค‘์— @Inject ๊ฐ€ ์žˆ๋‹ค๋ฉด ํ•ด๋‹น ํ•„๋“œ๋„ ๊ฐ™์ด ๋งŒ๋“ค์–ด ์ œ๊ณต

.

Reflection ์ •๋ฆฌ

๋ฆฌํ”Œ๋ ‰์…˜ ์‚ฌ์šฉ ์‹œ ์ฃผ์˜

  • ์ง€๋‚˜์นœ ์‚ฌ์šฉ(๋ฌด๋ถ„๋ณ„ํ•œ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ์œผ๋กœ)์€ ์„ฑ๋Šฅ ์ด์Šˆ๋ฅผ ์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉ ๊ถŒ์žฅ

  • ์ปดํŒŒ์ผ ํƒ€์ž„์— ํ™•์ธ๋˜์ง€ ์•Š๊ณ  ๋Ÿฐํƒ€์ž„ ์‹œ์—๋งŒ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ๋งŒ๋“ค ๊ฐ€๋Šฅ์„ฑ ์กด์žฌ

  • ์ ‘๊ทผ ์ง€์‹œ์ž ๋ฌด์‹œ

๋ฆฌํ”Œ๋ ‰์…˜ ์‚ฌ์šฉ ์‚ฌ๋ก€

  • Spring.

    • ์˜์กด์„ฑ ์ฃผ์ž…

    • MVC View ์—์„œ ๋„˜์–ด์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ์ฒด์— ๋ฐ”์ธ๋”ฉ ํ•  ๋•Œ

  • Hibernate.

    • @Entity ํด๋ž˜์Šค์— Setter ๊ฐ€ ์—†๋‹ค๋ฉด ๋ฆฌํ”Œ๋ ‰์…˜ ์‚ฌ์šฉ

Reference.

Dynamic Proxy

๋Ÿฐํƒ€์ž„์— ์ธํ„ฐํŽ˜์ด์Šค/ํด๋ž˜์Šค์˜ ํ”„๋ก์‹œ ์ธ์Šคํ„ด์Šค/ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ฒ•

Spring Data JPA ๋Š” ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ• ๊นŒ?

  • ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค๋Š” ๋ˆ„๊ฐ€ ๋งŒ๋“ค์–ด ์ค„๊นŒ?

    • JpaRepository ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋ฐ›์œผ๋ฉด ๊ฐ์ฒด๋„ ์ƒ์„ฑ๋˜๊ณ , ๋นˆ์œผ๋ฅด๋„ ๋“ฑ๋ก

  • Spring AOP ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•˜๋ฉฐ RepositoryFactorySupport ์—์„œ ํ”„๋ก์‹œ ๊ฐ์ฒด ์ƒ์„ฑ

    • ์ƒ์„ฑ๋œ ํ”„๋ก์‹œ ๊ฐ์ฒด๊ฐ€ ๋นˆ์œผ๋กœ ๋“ฑ๋ก๋˜๊ณ  ์ฃผ์ž…

Dynamic Proxy ์‚ฌ์šฉ ์˜ˆ

  • Spring Data JPA

  • Spring AOP

  • Mockito

  • Hibernate lazy initialzation ...

.

Proxy Pattern

Result
  • ํ”„๋ก์‹œ์™€ ๋ฆฌ์–ผ ์„œ๋ธŒ์ ํŠธ๊ฐ€ ๊ณต์œ ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์žˆ๊ณ , ํด๋ผ์ด์–ธํŠธ๋Š” ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž…์œผ๋กœ ํ”„๋ก์‹œ ์‚ฌ์šฉ

  • ํด๋ผ์ด์–ธํŠธ๋Š” ํ”„๋ก์‹œ๋ฅผ ๊ฑฐ์ณ์„œ ๋ฆฌ์–ผ ์„œ๋ธŒ์ ํŠธ๋ฅผ ์‚ฌ์šฉ

    • ํ”„๋ก์‹œ๋Š” ๋ฆฌ์–ผ ์„œ๋ธŒ์ ํŠธ์— ๋Œ€ํ•œ ์ ‘๊ทผ ๊ด€๋ฆฌ, ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ ์ œ๊ณต, ๋ฆฌํ„ด๊ฐ’ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ

  • ๋ฆฌ์–ผ ์„œ๋ธŒ์  ํŠธ๋Š” ์ž์‹ ์ด ํ•ด์•ผ ํ•  ์ผ๋งŒ ํ•˜๋ฉด์„œ(SRParrow-up-right) ํ”„๋ก์‹œ ์‚ฌ์šฉ

๋‹จ์ 

  • ํ”„๋ก์‹œ ํŒจํ„ด์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ๋ฒˆ๊ฑฐ๋กœ์šด ์ผ

  • ๋ถ€๊ฐ€์ ์ธ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ๋•Œ๋งˆ๋‹ค ๋ณ„๋„ ํ”„๋ก์‹œ ์ƒ์„ฑ ํ•„์š”

  • ํ”„๋ก์‹œ๋กœ ํ”„๋ก์‹œ๋ฅผ ๊ฐ์‹ธ์•ผ ํ•˜๋Š” ์ผ๋„ ๋ฐœ์ƒ

  • ๋ชจ๋“  ๊ตฌํ˜„์ฒด์—์„œ ์›๋ž˜ ํƒ€๊ฒŸ์œผ๋กœ ์œ„์ž„ํ•˜๋ฉด์„œ ์ค‘๋ณต ์ฝ”๋“œ ๋ฐœ์ƒ

Proxy Pattern examplearrow-up-right

ํ”„๋ก์‹œ ํŒจํ„ด์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋™์ ์œผ๋กœ ๋Ÿฐํƒ€์ž„์— ํ”„๋ก์‹œ๋ฅผ ์ƒ์„ฑํ•ด๋‚ด๋Š” ๋‹ค์ด๋‚˜๋ฏน ํ”„๋ก์‹œ ๋“ฑ์žฅ

.

Dynamic Proxy

๋Ÿฐํƒ€์ž„์— ํŠน์ • ์ธํ„ฐํŽ˜์ด์Šค๋“ค์„ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค ๋˜๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ธฐ์ˆ 

๋‹จ์ .

  • ํด๋ž˜์Šค ๊ธฐ๋ฐ˜์˜ ํ”„๋ก์‹œ ์ƒ์„ฑ ๋ถˆ๊ฐ€ -> ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์—†์„ ๊ฒฝ์šฐ ๋‹ค์ด๋‚˜๋ฏน ํ”„๋ก์‹œ ์ ์šฉ ๋ถˆ๊ฐ€

  • ๋ถ€๊ฐ€๊ธฐ๋Šฅ์ด ๋งŽ์•„์งˆ์ˆ˜๋ก ์ฝ”๋“œ๊ฐ€ ์ปค์ง€๋Š” ์œ ์—ฐํ•˜์ง€ ์•Š์€ ๊ตฌ์กฐ

ํ”„๋ก์‹œ ๊ธฐ๋ฐ˜ AOP ์ธ ์Šคํ”„๋ง AOP ๋“ฑ์žฅ

.

Class Proxy

์ธํ„ฐํŽ˜์ด์Šค ์—†์ด ํ”„๋ก์‹œ ๋งŒ๋“ค๊ธฐ

CGlibarrow-up-right

  • Spring, Hibernate ์—์„œ๋„ ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

  • ๋ฒ„์ „ ํ˜ธํ™˜์„ฑ์ด ์ข‹์ง€ ์•Š์•„์„œ ์„œ๋กœ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋‚ด๋ถ€์— ๋‚ด์žฅ๋œ ํ˜•ํƒœ๋กœ ์ œ๊ณต๋˜๊ธฐ๋„ ํ•จ

ByteBuddyarrow-up-right

  • ๋ฐ”์ดํŠธ ์ฝ”๋“œ ์กฐ์ž‘ ๋ฟ ์•„๋‹ˆ๋ผ ๋Ÿฐํƒ€์ž„(๋‹ค์ด๋‚˜๋ฏน) ํ”„๋ก์‹œ ์ƒ์„ฑ ์‹œ์—๋„ ์‚ฌ์šฉ

์ธํ„ฐํŽ˜์ด์Šค ์—†์ด ํ”„๋ก์‹œ๋ฅผ ์ƒ์„ฑํ•  ๊ฒฝ์šฐ ๋‹จ์ 

  • ์ƒ์†์„ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ ํ”„๋ก์‹œ ์ƒ์„ฑ ๋ถˆ๊ฐ€

    • Final ํด๋ž˜์Šค์ธ ๊ฒฝ์šฐ

    • Private ์ƒ์„ฑ์ž๋งŒ ์žˆ๋Š” ๊ฒฝ์šฐ

๊ฐ€๊ธ‰์  ํ”„๋ก์‹œ ์ ์šฉ ์‹œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค์–ด์„œ ์ธํ„ฐํŽ˜์ด์Šค ํ”„๋ก์‹œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅ

Annotation processor

์• ๋…ธํ…Œ์ด์…˜ ํ”„๋กœ์„ธ์„œ ์‚ฌ์šฉ ์˜ˆ

  • Lombok

    • ํ‘œ์ค€์œผ๋กœ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๊ฐœ๋ฐœ์ž ๋Œ€์‹  ์ƒ์„ฑํ•ด ์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

  • AutoService

    • java.util.ServiceLoader ์šฉ ํŒŒ์ผ ์ƒ์„ฑ ์œ ํ‹ธ๋ฆฌํ‹ฐ

  • @Override

    • Reflection API ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์Šˆํผ ํด๋ž˜์Šค์— ํ•ด๋‹นํ•˜๋Š” ๋ฉ”์„œ๋“œ์™€ ์ผ์น˜ํ•˜๋Š” ํ•ญ๋ชฉ์ด ์—†๋‹ค๋ฉด ์ปดํŒŒ์ผ ์˜ค๋ฅ˜ ๋ฐœ์ƒ

  • Daggerarrow-up-right

    • ์ปดํŒŒ์ผ ํƒ€์ž„ DI ์ œ๊ณต

์žฅ์ 

  • ๋Ÿฐํƒ€์ž„ ๋น„์šฉ์ด ์ œ๋กœ

๋‹จ์ 

  • ๊ธฐ์กด ํด๋ž˜์Šค ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ๋Š” ์•ฝ๊ฐ„์˜ hack ํ•„์š”

.

Lombok

  • @Getter, @Setter ๋“ฑ์˜ ์• ๋…ธํ…Œ์ด์…˜๊ณผ ์• ๋…ธํ…Œ์ด์…˜ ํ”„๋กœ์„ธ์„œ๋ฅผ ์ œ๊ณตํ•˜์—ฌ ํ‘œ์ค€ ์ž‘์„ฑ ์ฝ”๋“œ๋ฅผ ๊ฐœ๋ฐœ์ž ๋Œ€์‹  ์ƒ์„ฑํ•ด์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

๋กฌ๋ณต์˜ ๋™์ž‘ ์›๋ฆฌ

๋กฌ๋ณต์˜ ๋…ผ๋ž€ ๊ฑฐ๋ฆฌ

  • ๊ณต๊ฐœ๋œ API ๊ฐ€ ์•„๋‹Œ ์ปดํŒŒ์ผ๋Ÿฌ ๋‚ด๋ถ€ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ์กด ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์กฐ์ž‘

  • ํŠนํžˆ ์ดํด๋ฆฝ์Šค์˜ ๊ฒฝ์šฐ์—” java agent ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปดํŒŒ์ผ๋Ÿฌ ํด๋ž˜์Šค๊นŒ์ง€ ์กฐ์ž‘ํ•˜์—ฌ ์‚ฌ์šฉ

  • ํ•ด๋‹น ํด๋ž˜์Šค๋“ค ์—ญ์‹œ ๊ณต๊ฐœ๋œ API ๊ฐ€ ์•„๋‹ˆ๋‹ค๋ณด๋‹ˆ ๋ฒ„์ „ ํ˜ธํ™˜์„ฑ์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ์Œ

  • ๊ทธ๋Ÿผ์—๋„ ์—„์ฒญ๋‚œ ํŽธ๋ฆฌํ•จ์œผ๋กœ ๋„๋ฆฌ ์“ฐ์ด๊ณ , ๋Œ€์•ˆ์ด ๋ช‡๊ฐ€์ง€ ์žˆ์ง€๋งŒ ๋กฌ๋ณต์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ๊ณผ ํŽธ์˜์„ฑ์„ ๋Œ€์ฒด ๋ถˆ๊ฐ€

.

Annotation processor

Processor Interfacearrow-up-right

  • ์—ฌ๋Ÿฌ ๋ผ์šด๋“œ(rounds)์— ๊ฑฐ์ณ ์†Œ์Šค ๋ฐ ์ปดํŒŒ์ผ ๋œ ์ฝ”๋“œ๋ฅผ ์ฒ˜๋ฆฌ

AutoService

  • ServiceProviderarrow-up-right ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์ƒ์„ฑ๊ธฐ

  • ์ปดํŒŒ์ผ ์‹œ์ ์— ์• ๋…ธํ…Œ์ด์…˜ ํ”„๋กœ์„ธ์„œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ META-INF/services/javax.annotation.processor.Processor ํŒŒ์ผ ์ž๋™ ์ƒ์„ฑ

javapoet

Interface Filer

  • ์†Œ์Šค ์ฝ”๋“œ, ํด๋ž˜์Šค ์ฝ”๋“œ ๋ฐ ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค

์ฐธ๊ณ .

Last updated