App desugaring(= Java 8+ AP#I / core library desugaring)์ด โ€œ๋ฌด์—‡์„โ€ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ์‹์ธ๊ฐ€

Android ์•ฑ์€ JVM์ด ์•„๋‹ˆ๋ผ ART(Android Runtime) ์œ„์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ์€ โ€œJVM ๋ฐ”์ดํŠธ์ฝ”๋“œ(.class)โ€๊ฐ€ ์•„๋‹ˆ๋ผ, ART๊ฐ€ ์‹คํ–‰ํ•˜๋Š” ๋ฐ”์ดํŠธ์ฝ”๋“œ ํฌ๋งท(DEX) ๋กœ ํŒจํ‚ค์ง•๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์ด ๊ณผ์ •์€ ๋ณดํ†ต D8/R8์ด .class โ†’ .dex๋กœ ์ปดํŒŒ์ผ(dexing) ํ•˜๋ฉด์„œ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ๋Š”, Android๊ฐ€ OS ๋ฒ„์ „(API ๋ ˆ๋ฒจ)์— ๋”ฐ๋ผ ์ œ๊ณตํ•˜๋Š” Java ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ API ๋ฒ”์œ„๊ฐ€ ๋‹ค๋ฅด๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด java.util.stream.* ๊ฐ™์€ API๋Š” ๋‚ฎ์€ OS์— ์—†๊ธฐ ๋•Œ๋ฌธ์—, ํ•ด๋‹น API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ(๋‚ด ์ฝ”๋“œ๋“  3rd party๋“ )๊ฐ€ ์‹คํ–‰๋˜๋ฉด ๋Œ€ํ‘œ์ ์œผ๋กœ NoClassDefFoundError/ClassNotFoundException ๋ฅ˜์˜ ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

App desugaring(๊ณต์‹ ๋ช…์นญ: Java 8+ API desugaring / core library desugaring) ์€ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด

  • (1) ์•ฑ์— โ€œ๋ถ€์กฑํ•œ Java ํ‘œ์ค€ API ๊ตฌํ˜„โ€์„ ๊ฐ™์ด ๋ฒˆ๋“ค๋ง(์‹ค์ œ๋กœ๋Š” desugared library๊ฐ€ ํฌํ•จ๋œ DEX/ํด๋ž˜์Šค๋“ค์ด ์•ฑ์— ๋“ค์–ด์˜ด)ํ•˜๊ณ 
  • (2) ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ ํ˜ธ์ถœ ์ง€์ ์„ ๋ฆฌ๋ผ์ดํŠธ(rewrite) ํ•ด์„œ
  • (3) ๋Ÿฐํƒ€์ž„์— โ€œํ”Œ๋žซํผ์— ์—†๋Š” APIโ€๋ฅผ ์•ฑ์ด ํฌํ•จํ•œ ๊ตฌํ˜„์œผ๋กœ ๋Œ€์ฒด(backport) ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

์š”์•ฝ: โ€œOS์— ์—†๋Š” Java ํ‘œ์ค€ API๋ฅผ ์•ฑ์ด ํ•จ๊ป˜ ๋“ค๊ณ  ๊ฐ€์„œ(backport) ์‹คํ–‰๋˜๊ฒŒ ํ•œ๋‹ค.โ€


desugar๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•œ Q&A (๊ผฌ๋ฆฌ ์งˆ๋ฌธ ํฌํ•จ)

Q1. ์™œ .class๋ฅผ ๊ทธ๋Œ€๋กœ ์“ฐ์ง€ ์•Š๊ณ  .dex๋กœ ๋งŒ๋“œ๋‚˜? (AGP๊ฐ€ ๊ตณ์ด ๋ณ€ํ™˜ํ•˜๋Š” ์ด์œ )

A. Android ๊ธฐ๊ธฐ์—์„œ ์•ฑ์€ JVM์ด ์•„๋‹ˆ๋ผ ART๊ฐ€ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ART๋Š” JVM .class๋ฅผ ์ง์ ‘ ์‹คํ–‰ํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, ์•ฑ์ด ํŒจํ‚ค์ง•ํ•œ DEX ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ๋นŒ๋“œ ํŒŒ์ดํ”„๋ผ์ธ์€ ํ•„์ˆ˜์ ์œผ๋กœ .class โ†’ .dex ์ปดํŒŒ์ผ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด ์—ญํ• ์„ D8(๋˜๋Š” R8)์ด ํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ์ž ๊ด€์  ์š”์•ฝ: .class โ†’ .dex๋Š” โ€œXMLโ†’JSON ๊ฐ™์€ ๋‹จ์ˆœ ํฌ๋งท ์น˜ํ™˜โ€์— ๊ฐ€๊น๊ธฐ๋ณด๋‹จ, ์‹คํ–‰ ๋จธ์‹ ์ด ๋‹ค๋ฅธ ํ™˜๊ฒฝ(ART)์„ ์œ„ํ•œ ์ปดํŒŒ์ผ์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค.


Q2. ๊ทธ๋Ÿฌ๋ฉด โ€œdesugarโ€๋Š” .class โ†’ .dex ๋ณ€ํ™˜ ์ž์ฒด๋ฅผ ์˜๋ฏธํ•˜๋‚˜?

A. ์ •ํ™•ํžˆ๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

  • dexing: .class โ†’ .dex๋กœ โ€œART ์‹คํ–‰ ํฌ๋งทโ€์„ ๋งŒ๋“œ๋Š” ์ปดํŒŒ์ผ ์ž‘์—…(D8/R8์˜ ์—ญํ• )
  • desugaring: dexing ๊ณผ์ •์—์„œ(๋˜๋Š” ๊ทธ ์ง์ „/์งํ›„์—) ํ˜ธํ™˜์„ฑ ํ™•๋ณด๋ฅผ ์œ„ํ•ด ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ ๋ณ€ํ™˜/๋ฆฌ๋ผ์ดํŠธํ•˜๋Š” ์ž‘์—…

์ฆ‰, desugar๋Š” โ€œdex๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒโ€์ด ์•„๋‹ˆ๋ผ dex๋กœ ๋ฐ”๊พธ๋Š” ๊ณผ์ •์— ๋ผ์–ด๋“œ๋Š” โ€˜์ถ”๊ฐ€ ๋ณ€ํ™˜โ€™์ด๋ผ๊ณ  ๋ณด๋Š” ๊ฒŒ ์ •ํ™•ํ•ฉ๋‹ˆ๋‹ค.


Q3. โ€˜๋‚ฎ์€ ๋Ÿฐํƒ€์ž„์—์„œ๋„ ๋™์ž‘ํ•œ๋‹คโ€™๋Š” ๊ฒŒ ๋ฌด์Šจ ๋œป?

A. โ€œ๋‚ฎ์€ ๋Ÿฐํƒ€์ž„โ€์€ ๋ณดํ†ต **๋‚ฎ์€ Android API ๋ ˆ๋ฒจ(= ์˜ค๋ž˜๋œ OS)**์„ ๋œปํ•ฉ๋‹ˆ๋‹ค. ๋‚ฎ์€ OS์—์„œ๋Š”

  1. ์–ธ์–ด ๊ธฐ๋Šฅ: (์˜ˆ: ๋žŒ๋‹ค, default interface method ๋“ฑ) ํŠน์ • ๋ฐ”์ดํŠธ์ฝ”๋“œ ํŒจํ„ด์ด ๊ทธ๋Œ€๋กœ ์œ ์ง€๋˜๋ฉด ์•ˆ์ „ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์–ด D8/R8์ด โ€œ๋” ๋‹จ์ˆœํ•œ ํ˜•ํƒœโ€๋กœ ํ’€์–ด์ฃผ๋Š” ๋ณ€ํ™˜์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
    โ†’ ์ด๊ฑธ ํ”ํžˆ ์–ธ์–ด ๊ธฐ๋Šฅ desugaring์ด๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.

  2. ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ API: (์˜ˆ: java.util.stream, java.time ์ผ๋ถ€) OS์— ํด๋ž˜์Šค ์ž์ฒด๊ฐ€ ์—†์–ด์„œ ๊ทธ๋Œ€๋กœ ์‹คํ–‰ํ•˜๋ฉด NoClass ์—๋Ÿฌ๊ฐ€ ๋‚ฉ๋‹ˆ๋‹ค.
    โ†’ ์ด๊ฑธ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด โ€œ์•ฑ์ด ๊ตฌํ˜„์„ ํฌํ•จ + ํ˜ธ์ถœ์„ ๊ทธ ๊ตฌํ˜„์œผ๋กœ ๋ฐ”๊ฟˆโ€์ด ํ•„์š”ํ•˜๊ณ , ๊ทธ๊ฒŒ core library desugaring(App desugaring) ์ž…๋‹ˆ๋‹ค.

ํ•œ ์ค„ ์š”์•ฝ:

  • ์–ธ์–ด desugar: โ€œ๋ฌธ๋ฒ•/๋ฐ”์ดํŠธ์ฝ”๋“œ ํŒจํ„ดโ€์„ ๋‚ฎ์€ ํ™˜๊ฒฝ์—์„œ๋„ ๋˜๊ฒŒ ๋ณ€ํ™˜
  • API desugar: โ€œ์—†๋Š” ํ‘œ์ค€ API ๊ตฌํ˜„โ€์„ ์•ฑ์— ํฌํ•จ + ํ˜ธ์ถœ ๋ฆฌ๋ผ์ดํŠธ

Q4. core library desugaring์€ โ€˜ํŒจํ‚ค์ง€๋ช…์„ ์˜› ํŒจํ‚ค์ง€๋กœ ์—ฐ๊ฒฐ(alias)โ€™ํ•ด์ฃผ๋Š” ๊ฑด๊ฐ€?

A. โ€œ๋ณ„์นญ(alias)๋กœ ์—ฐ๊ฒฐโ€์ด๋ผ๊ธฐ๋ณด๋‹ค๋Š”, ํ”Œ๋žซํผ(java.*)๊ณผ ์ถฉ๋Œ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค/๋ฆฌ๋ผ์ดํŠธ ์ „๋žต์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค.

  • Android ํ”Œ๋žซํผ์˜ java.*๋Š” bootclasspath์— ์žˆ๊ณ  ์•ฑ์ด ์ด๋ฅผ โ€œ๋ฎ์–ด์“ฐ๊ธฐโ€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ๊ทธ๋ž˜์„œ desugared library ๊ตฌํ˜„์€ ์ถฉ๋Œ ํšŒํ”ผ๋ฅผ ์œ„ํ•ด ๋ณ„๋„ ๋„ค์ž„์ŠคํŽ˜์ด์Šค(์˜ˆ: j$.*)๋กœ ๋“ค์–ด์˜ค๊ฑฐ๋‚˜, ๊ทœ์น™์— ๋”ฐ๋ผ ํŠน์ • prefix๋ฅผ rewriteํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  • ์ผ๋ถ€ ์ผ€์ด์Šค๋Š” ์ตœ์‹  OS์—์„œ๋Š” ํ”Œ๋žซํผ ํด๋ž˜์Šค๊ฐ€ ์šฐ์„  ์‚ฌ์šฉ๋˜๊ณ (bootclasspath ์šฐ์„ ), ๋‚ฎ์€ OS์—์„œ๋Š” desugared ๊ตฌํ˜„์ด ์‚ฌ์šฉ๋˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. (์ด๊ฑด ์ฝ”๋“œ ๋ถ„๊ธฐ๋ผ๊ธฐ๋ณด๋‹ค๋Š” โ€œ์–ด๋–ค ํด๋ž˜์Šค๋ฅผ ๋กœ๋”ฉํ•˜๋А๋ƒโ€์˜ ์„ฑ๊ฒฉ)

Q5. ๊ทธ๋Ÿผ DEX ์•ˆ์—๋Š” Android ๋ฒ„์ „๋ณ„ ๋ถ„๊ธฐ(if SDK_INTโ€ฆ)๊ฐ€ ์ž”๋œฉ ๋“ค์–ด๊ฐ€๋‚˜?

A. ๋ณดํ†ต์€ ์•„๋‹™๋‹ˆ๋‹ค. ํ•ต์‹ฌ์€ โ€œ๋Ÿฐํƒ€์ž„์—์„œ minSdk๋ฅผ ํ™•์ธํ•ด ๋ญ”๊ฐ€๋ฅผ ์ถ”๊ฐ€โ€๊ฐ€ ์•„๋‹ˆ๋ผ,

  • ๋นŒ๋“œ ์‹œ์ ์— ์ด๋ฏธ minSdk๊ฐ€ ์ •ํ•ด์ ธ ์žˆ๊ณ , ๊ทธ ๊ฐ’์— ๋งž์ถฐ D8/R8์ด ๋ณ€ํ™˜/๋ฆฌ๋ผ์ดํŠธ/๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํฌํ•จ์„ ์ˆ˜ํ–‰ํ•ด
  • APK์— ๊ณ ์ •๋œ ๊ฒฐ๊ณผ๋ฌผ๋กœ ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค.

๋‹ค๋งŒ core library desugaring์€ โ€œํด๋ž˜์Šค ๋กœ๋”ฉ ์šฐ์„ ์ˆœ์œ„(ํ”Œ๋žซํผ ์šฐ์„ )โ€ ๊ฐ™์€ ์ด์œ ๋กœ ๊ฒฐ๊ณผ์ ์œผ๋กœ OS์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๊ตฌํ˜„์ด ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ผ ์ˆ˜๋Š” ์žˆ์Šต๋‹ˆ๋‹ค(ํ•˜์ง€๋งŒ ์ผ๋ฐ˜์ ์ธ if (SDK_INT >= โ€ฆ) ๋ถ„๊ธฐ ์ฝ”๋“œ๊ฐ€ ์ฆ๊ฐ€ํ•˜๋Š” ํ˜•ํƒœ๋Š” ํ”์น˜ ์•Š์Œ).


์™œ(์–ธ์ œ) ํ•„์š”ํ•œ๊ฐ€

์•„๋ž˜ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ํ•ด๋‹นํ•˜๋ฉด โ€˜API desugaringโ€™์ด ํ•„์š”ํ•ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋‚ด ์ฝ”๋“œ๊ฐ€ Java 8+ API๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
    • ์˜ˆ: Stream API(java.util.stream) ๋“ฑ
  • ์˜์กด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(3rd party)๊ฐ€ Java 8+ API๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
    • ์•ฑ์ด ์ง์ ‘ ์•ˆ ์“ฐ๋”๋ผ๋„ ์˜์กด์„ฑ ๋‚ด๋ถ€ ํ˜ธ์ถœ ๋•Œ๋ฌธ์— ๋Ÿฐํƒ€์ž„/๊ฒ€์ฆ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ
  • ํŠน์ • SDK๊ฐ€ โ€œcore library desugaring์„ ํ•„์ˆ˜ ๋นŒ๋“œ ์š”๊ฑดโ€์œผ๋กœ ์š”๊ตฌํ•œ๋‹ค.
    • ์ด ๊ฒฝ์šฐ๋Š” โ€œOS ๋ฏธ์ง€์›โ€๊ณผ ๋ณ„๊ฐœ๋กœ, โ€œSDK ๋ฆด๋ฆฌ์ฆˆ ์ •์ฑ…/๋นŒ๋“œ ๊ฐ€์ •โ€ ๋•Œ๋ฌธ์— ์—…๊ทธ๋ ˆ์ด๋“œ๊ฐ€ ๋ง‰ํž ์ˆ˜ ์žˆ์Œ

์ฐธ๊ณ : โ€œJava 8 ์–ธ์–ด ๊ธฐ๋Šฅ(๋žŒ๋‹ค ๋“ฑ)โ€์€ ๊ธฐ๋ณธ desugar(์–ธ์–ด ๊ธฐ๋Šฅ)๋กœ ํ•ด๊ฒฐ๋˜๊ณ ,
์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” โ€˜App desugaringโ€™์€ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ API(ํด๋ž˜์Šค/๋ฉ”์„œ๋“œ)๊นŒ์ง€ ํ™•์žฅ(backport)ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.


(๊ณต์‹ ๋ฌธ์„œ ๊ด€์ ) App desugaring์ด ์‹ค์ œ๋กœ ํ•˜๋Š” ์ผ

Android Gradle Plugin(AGP)์—์„œ API desugaring์„ ์ผœ๋ฉด:

  1. missing API ๊ตฌํ˜„์„ ํฌํ•จํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(desugared library)๋ฅผ ์•ฑ์— ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
  2. desugaring ๊ณผ์ •์—์„œ ์•ฑ์˜ ํ˜ธ์ถœ ์ง€์ ์„ ๋ณ€ํ™˜(rewrite) ํ•˜์—ฌ, ๋Ÿฐํƒ€์ž„์— ๊ทธ ๊ตฌํ˜„์„ ์“ฐ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
  3. ์ œ๊ณต๋˜๋Š” API ๋ฒ”์œ„๋Š” desugar_jdk_libs(๋ฐ AGP/๋ฒ„์ „)์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

์„ค์ •(์˜ˆ์‹œ)

์•„๋ž˜๋Š” ๊ณต์‹ ๋ฌธ์„œ์˜ ๋Œ€ํ‘œ ์„ค์ • ํ˜•ํƒœ๋ฅผ ๊ทธ๋Œ€๋กœ ์š”์•ฝํ•œ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

Kotlin DSL (build.gradle.kts)

android {
  compileOptions {
    // AGP 4.1+
    isCoreLibraryDesugaringEnabled = true
    sourceCompatibility = JavaVersion.VERSION_1_8
    targetCompatibility = JavaVersion.VERSION_1_8
  }
}
 
dependencies {
  coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.0.3")
}

๋ˆˆ์œผ๋กœ ๋ณด๋Š” ์ฆ๊ฑฐ(โ€œ์ •๋ง ๋ญ๊ฐ€ ์ถ”๊ฐ€๋˜๊ณ , ๋ญ๊ฐ€ ๋ฐ”๋€Œ๋‚˜?โ€)

์•„๋ž˜๋Š” ํ”„๋กœ์ ํŠธ์—์„œ ๋ฐ”๋กœ ํ™•์ธ ๊ฐ€๋Šฅํ•œ ์ฒดํฌ๋ฆฌ์ŠคํŠธ์ž…๋‹ˆ๋‹ค.

1) APK์— โ€œ์ถ”๊ฐ€๋œ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ตฌํ˜„โ€์ด ๋“ค์–ด์™”๋Š”์ง€

  • Android Studio Analyze APK ๋˜๋Š” jadx๋กœ APK ์—ด๊ธฐ
  • ํด๋ž˜์Šค ๊ฒ€์ƒ‰:
    • j$/util/stream/
    • j$/time/
    • j$/util/function/ โ†’ ์ด๋Ÿฐ ํŒจํ‚ค์ง€๊ฐ€ ๋ณด์ด๋ฉด โ€œํ”Œ๋žซํผ์— ์—†๋Š” API ๊ตฌํ˜„์ด ์•ฑ์— ๋ฒˆ๋“ค๋ง๋˜์—ˆ๋‹คโ€๋Š” ๊ฐ•ํ•œ ์ฆ๊ฑฐ์ž…๋‹ˆ๋‹ค.

2) ํ˜ธ์ถœ์ด rewrite ๋˜์—ˆ๋Š”์ง€(์†Œ์Šค๋Š” java.util.stream์ธ๋ฐ ๊ฒฐ๊ณผ๋ฌผ์€?)

  • stream()/java.util.stream ์‚ฌ์šฉ ์ง€์ ์„ ๋””์ปดํŒŒ์ผํ•ด์„œ ํ™•์ธ
  • desugaring์ด ์ ์šฉ๋œ ๊ฒฝ์šฐ, ๋‚ด๋ถ€์ ์œผ๋กœ j$.util.stream ๊ณ„์—ด ํ˜ธ์ถœ ํ”์ ์ด ๋ณด์ด๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

3) ์–ธ์–ด desugar ํ”์ (๋žŒ๋‹ค ๋“ฑ)

  • ๊ฒฐ๊ณผ๋ฌผ์—์„œ $$ExternalSyntheticLambda / $$Lambda$... ๊ฐ™์€ synthetic ํด๋ž˜์Šค ํ”์ ์„ ํ™•์ธ โ†’ โ€œ๋žŒ๋‹ค๊ฐ€ ์›ํ˜• ๊ทธ๋Œ€๋กœโ€๊ฐ€ ์•„๋‹ˆ๋ผ, ๋‚ฎ์€ ํ™˜๊ฒฝ์—์„œ๋„ ์•ˆ์ „ํ•œ ํ˜•ํƒœ๋กœ ํ’€๋ ธ๋‹ค๋Š” ๋‹จ์„œ์ž…๋‹ˆ๋‹ค.

์‹ค๋ฌด์—์„œ ์ฒดํฌํ•ด์•ผ ํ•˜๋Š” ์˜ํ–ฅ(๋ฆฌ์Šคํฌ/์šด์˜ ํฌ์ธํŠธ)

์•„๋ž˜๋Š” โ€œ๊ธฐ๋Šฅ ์ž์ฒดโ€๊ฐ€ ์•„๋‹ˆ๋ผ, ๋„์ž… ์‹œ ํ”ํžˆ ๋ถ€๋”ชํžˆ๋Š” ์šด์˜ ํฌ์ธํŠธ์ž…๋‹ˆ๋‹ค.

  • ์•ฑ ์‚ฌ์ด์ฆˆ/๋ฉ”์„œ๋“œ ์ˆ˜ ์ฆ๊ฐ€ ๊ฐ€๋Šฅ์„ฑ
    • ๋ฒˆ๋“ค๋ง๋˜๋Š” API ๋ฒ”์œ„๊ฐ€ ๋„“์„์ˆ˜๋ก ์ฝ”๋“œ ์‚ฌ์ด์ฆˆ ์˜ํ–ฅ์ด ์ปค์งˆ ์ˆ˜ ์žˆ์Œ
  • ํ…Œ์ŠคํŠธ ๋ฒ”์œ„ ํ™•๋Œ€
    • desugared ๊ตฌํ˜„ + ํ˜ธ์ถœ ๋ฆฌ๋ผ์ดํŠธ๊ฐ€ ๋“ค์–ด๊ฐ€๋ฏ€๋กœ, ๋‹จ๋ง/OS ์กฐํ•ฉ ํ…Œ์ŠคํŠธ ํ•„์š”
  • ๋ฆฌํ”Œ๋ ‰์…˜/ํด๋ž˜์Šค ์ถฉ๋Œ ๋ฆฌ์Šคํฌ
    • (ํŠนํžˆ java.* / javax.* ์ ‘๊ทผ์„ ๋ฆฌํ”Œ๋ ‰์…˜์œผ๋กœ ๋‹ค๋ฃจ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์กฐํ•ฉ์—์„œ) ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋™์ž‘ ๊ฐ€๋Šฅ์„ฑ
  • ์˜ตํŠธ์ธ ํ›„ ์˜ตํŠธ์•„์›ƒ์ด ์‰ฝ์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ
    • ์—ฌ๋Ÿฌ ๋ชจ๋“ˆ/์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ desugared API ์‚ฌ์šฉ์— ์˜์กดํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด ๋˜๋Œ๋ฆฌ๊ธฐ ๋น„์šฉ์ด ์ปค์ง

์ฐธ๊ณ (๊ณต์‹ ๋ฌธ์„œ/๋ ˆํผ๋Ÿฐ์Šค)