Skip to content

Latest commit

ย 

History

History
936 lines (561 loc) ยท 40.5 KB

Kotlin_sieun.md

File metadata and controls

936 lines (561 loc) ยท 40.5 KB

๋ฐœํ‘œ์ž : ์†ก์‹œ์€

๋ฐœํ‘œ์ฃผ์ œ : ์ฝ”ํ‹€๋ฆฐ

๋ฐœํ‘œ๋‚ ์งœ : 2018.07.13


[TOC]

0.์ฐธ๊ณ ๋ฌธ์„œ

Kotlin IN ACTION [๋“œ๋ฏธํŠธ๋ฆฌ ์ œ๋ฉ”๋กœํ”„, ์Šค๋ฒ ํŠธ๋ผ๋‚˜ ์ด์‚ฌ์ฝ”๋ฐ” ์ง€์Œ / ์˜คํ˜„์„ ์˜ฎ๊น€]

๊นก์ƒ˜์˜ ์ฝ”ํ‹€๋ฆฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ [๊ฐ•์„ฑ์œค ์ง€์Œ]

์ฐจ์„ธ๋Œ€ ์•ˆ๋“œ๋กœ์ด๋“œ ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ์ปค๋‹ˆ์˜ ์ฝ”ํ‹€๋ฆฐ [๊น€ํƒœํ˜ธ ์ง€์Œ]

[inlining] https://stackoverflow.com/questions/3924995/what-is-method-inlining

[์•คํ„ฐํ”„๋ผ์ด์ฆˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜] https://scroogy.atlassian.net/wiki/spaces/SPRING/pages/8847424

[ํŠธ๋ ˆ์ด๋“œ์˜คํ”„] https://zetawiki.com/wiki/ํŠธ๋ ˆ์ด๋“œ์˜คํ”„

1. Kotlin์„ ์•Œ์•„๋ณด์ž

1.0 ์†Œ๊ฐœ

์ฝ”ํ‹€๋ฆฐ์€ ์ž๋ฐ” ํ”Œ๋žซํผ์—์„œ ๋Œ์•„๊ฐ€๋Š” ์ƒˆ๋กœ์šด ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด

์ฝ”ํ‹€๋ฆฐ์€ ๊ฐ„๊ฒฐํ•˜๊ณ  ์‹ค์šฉ์ ์ด๋ฉฐ, ์ž๋ฐ” ์ฝ”๋“œ์™€์˜ ์ƒํ˜ธ์šด์šฉ์„ฑ์„ ์ค‘์‹œ

๋Œ€ํ‘œ์ ์œผ๋กœ ์„œ๋ฒ„ ๊ฐœ๋ฐœ, ์•ˆ๋“œ๋กœ์ด๋“œ ์•ฑ ๊ฐœ๋ฐœ ๋“ฑ์˜ ๋ถ„์•ผ์—์„œ ์ฝ”ํ‹€๋ฆฐ์„ ์”€

1.1 ์ฝ”ํ‹€๋ฆฐ์˜ ์ฃผ์š” ํŠน์„ฑ

1.1.1 ๋Œ€์ƒ ํ”Œ๋žซํผ

์ฝ”ํ‹€๋ฆฐ์ด ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์˜์—ญ์€ ์„œ๋ฒ„์ƒ์˜ ์ฝ”๋“œ(ํŠนํžˆ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฐฑ์—”๋“œ), ์•ˆ๋“œ๋กœ์ด๋“œ ๋””๋ฐ”์ด์Šค์—์„œ ์‹คํ–‰๋˜๋Š” ๋ชจ๋ฐ”์ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋‹ค. ํ•˜์ง€๋งŒ ์ฝ”ํ‹€๋ฆฐ์€ ๋‹ค๋ฅธ ํ™˜๊ฒฝ์—์„œ๋„ ์ž˜ ์ž‘๋™ํ•œ๋‹ค.

  • ์ธํ…”์˜ ๋ฉ€ํ‹ฐOS ์—”์ง„์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”ํ‹€๋ฆฐ์„ iOS๋””๋ฐ”์ด์Šค์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ๋ฐ์Šคํฌํƒ‘ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ž‘์„ฑํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ฝ”ํ‹€๋ฆฐ๊ณผ ํ† ๋„ค์ด๋„FX, ์ž๋ฐ”FX ๋“ฑ์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์ž๋ฐ”๋ฟ ์•„๋‹ˆ๋ผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋„ ์ฝ”ํ‹€๋ฆฐ์„ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ๋‹ค => ์ฝ”ํ‹€๋ฆฐ ์ฝ”๋“œ๋ฅผ ๋ธŒ๋ผ์šฐ์ €๋‚˜ ๋…ธ๋“œ์—์„œ ์‹คํ–‰๊ฐ€๋Šฅ

  • 2017๋…„ 3์›” 1์ผ์— ๋ฐœํ‘œ๋œ ์ฝ”ํ‹€๋ฆฐ 1.1๋ถ€ํ„ฐ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ๊ณต์‹์ ์œผ๋กœ ์ง€์›ํ•œ๋‹ค.

1.1.2 ์ •์  ํƒ€์ž… ์ง€์ • ์–ธ์–ด

์ž๋ฐ”์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ฝ”ํ‹€๋ฆฐ๋„ *์ •์  ํƒ€์ž… ์ง€์ • ์–ธ์–ด๋‹ค.

๋™์  ํƒ€์ž… ์ง€์ • ์–ธ์–ด์—์„œ๋Š” ํƒ€์ž…๊ณผ ๊ด€๊ณ„์—†์ด ๋ชจ๋“  ๊ฐ’์„ ๋ณ€์ˆ˜์— ๋„ฃ์„ ์ˆ˜ ์žˆ๊ณ , ๋ฉ”์†Œ๋“œ๋‚˜ ํ•„๋“œ ์ ‘๊ทผ์— ๋Œ€ํ•œ ๊ฒ€์ฆ์ด ์ƒํ–‰ ์‹œ์ ์— ์ผ์–ด๋‚˜๋ฉฐ, ๊ทธ์— ๋”ฐ๋ผ ์ฝ”๋“œ๊ฐ€ ๋” ์งง์•„์ง€๊ณ  ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๋” ์œ ์—ฐํ•˜๊ฒŒ ์ƒ์„ฑํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฐ˜๋Œ€๋กœ ์ด๋ฆ„์„ ์ž˜๋ชป ์ž…๋ ฅํ•˜๋Š” ๋“ฑ์˜ ์‹ค์ˆ˜๋„ ์ปดํŒŒ์ผ ์‹œ ๊ฑธ๋Ÿฌ๋‚ด์ง€ ๋ชปํ•˜๊ณ  ์‹คํ–‰ ์‹œ์ ์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

ํ•œํŽธ ์ž๋ฐ”์™€ ๋‹ฌ๋ฆฌ ์ฝ”ํ‹€๋ฆฐ์—์„œ๋Š” ๋ชจ๋“  ๋ณ€์ˆ˜์˜ ํƒ€์ž…์„ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ง์ ‘ ๋ช…์‹œํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์ฝ”ํ‹€๋ฆฐ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ฌธ๋งฅ์œผ๋กœ๋ถ€ํ„ฐ ๋ณ€์ˆ˜ ํƒ€์ž…์„ ์ž๋™์œผ๋กœ ์œ ์ถ”ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ํƒ€์ž… ์„ ์–ธ์„ ์ƒ๋žตํ•ด๋„ ๋œ๋‹ค.

var x = 1

์—ฌ๊ธฐ์„œ๋Š” ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•˜๋ฉด์„œ ์ •์ˆ˜ ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค. ์ฝ”ํ‹€๋ฆฐ์€ ์ด ๋ณ€์ˆ˜์˜ ํƒ€์ž…์ด Int์ž„์„ ์ž๋™์œผ๋กœ ์•Œ์•„๋‚ธ๋‹ค. ์ด๋ ‡๊ฒŒ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ฌธ๋งฅ์„ ๊ณ ๋ คํ•ด ๋ณ€์ˆ˜ ํƒ€์ž…์„ ๊ฒฐ์ •ํ•˜๋Š” ์ด๋Ÿฐ ๊ธฐ๋Šฅ์„ ํƒ€์ž… ์ถ”๋ก ์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

์ •์  ํƒ€์ž… ์ง€์ •์˜ ์žฅ์ 
  • ์„ฑ๋Šฅ

    ์‹คํ–‰ ์‹œ์ ์— ์–ด๋–ค ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ• ์ง€ ์•Œ์•„๋‚ด๋Š” ๊ณผ์ •์ด ํ•„์š” ์—†์œผ๋ฏ€๋กœ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ์ด ๋” ๋น ๋ฅด๋‹ค.

  • ์‹ ๋ขฐ์„ฑ

    ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํ”„๋กœ๊ทธ๋žจ์˜ ์ •ํ™•์„ฑ์„ ๊ฒ€์ฆํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹คํ–‰ ์‹œ ํ”„๋กœ๊ทธ๋žจ์ด ์˜ค๋ฅ˜๋กœ ์ค‘๋‹จ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋” ์ ์–ด์ง„๋‹ค.

  • ์œ ์ง€ ๋ณด์ˆ˜์„ฑ

    ์ฝ”๋“œ์—์„œ ๋‹ค๋ฃจ๋Š” ๊ฐ์ฒด๊ฐ€ ์–ด๋–ค ํƒ€์ž…์— ์†ํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฒ˜์Œ ๋ณด๋Š” ์ฝ”๋“œ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ๋„ ๋” ์‰ฝ๋‹ค.

  • ๋„๊ตฌ ์ง€์›

    ์ •์  ํƒ€์ž… ์ง€์ •์„ ํ™œ์šฉํ•˜๋ฉด ๋” ์•ˆ์ „ํ•˜๊ฒŒ ๋ฆฌํŒฉํ† ๋ง ํ•  ์ˆ˜ ์žˆ๊ณ , ๋„๊ตฌ๋Š” ๋” ์ •ํ™•ํ•œ ์ฝ”๋“œ ์™„์„ฑ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, IDE์˜ ๋‹ค๋ฅธ ์ง€์› ๊ธฐ๋Šฅ๋„ ๋” ์ž˜ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

์ฝ”ํ‹€๋ฆฐ์˜ ํƒ€์ž… ์‹œ์Šคํ…œ์„ ์‚ดํŽด๋ณด๋ฉด ํด๋ž˜์Šค, ์ธํ„ฐํŽ˜์ด์Šค, ์ œ๋„ค๋ฆญ์Šค๋Š” ๋ชจ๋‘ ์ž๋ฐ”์™€ ๋น„์Šทํ•˜๊ฒŒ ์ž‘๋™ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์ž๋ฐ”์— ๋Œ€ํ•ด ์•„๋Š” ๋‚ด์šฉ์„ ์ฝ”ํ‹€๋ฆฐ์—์„œ๋„ ์‰ฝ๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ช‡ ๊ฐ€์ง€ ์ƒˆ๋กœ์šด ์ ์ด ์žˆ๋‹ค.

  • ์ฝ”ํ‹€๋ฆฐ์ด ๋„์ด ๋  ์ˆ˜ ์žˆ๋Š” ํƒ€์ž…์„ ์ง€์›ํ•œ๋‹ค. ๋„์ด ๋  ์ˆ˜ ์žˆ๋Š” ํƒ€์ž…์„ ์ง€์›ํ•จ์— ๋”ฐ๋ผ ์ปดํŒŒ์ผ ์‹œ์ ์— ๋„ ํฌ์ธํ„ฐ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒ€์‚ฌํ•  ์ˆ˜ ์žˆ์–ด์„œ ์ข€ ๋” ํ”„๋กœ๊ทธ๋žจ์˜ ์‹ ๋ขฐ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.

  • ์ฝ”ํ‹€๋ฆฐ์˜ ํƒ€์ž… ์‹œ์Šคํ…œ์— ์žˆ๋Š” ๋‹ค๋ฅธ ์ƒˆ๋กœ์šด ๋‚ด์šฉ์œผ๋กœ๋Š” ํ•จ์ˆ˜ ํƒ€์ž…์— ๋Œ€ํ•œ ์ง€์›์„ ๋“ค ์ˆ˜ ์žˆ๋‹ค.


*์ •์  ํƒ€์ž… ์ง€์ • ๋ชจ๋“  ํ”„๋กœ๊ทธ๋žจ ๊ตฌ์„ฑ ์š”์†Œ์˜ ํƒ€์ž…์„ ์ปดํŒŒ์ผ ์‹œ์ ์— ์•Œ ์ˆ˜ ์žˆ๊ณ  ํ”„๋กœ๊ทธ๋žจ ์•ˆ์—์„œ ๊ฐ์ฒด์˜ ํ•„๋“œ๋‚˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋งˆ๋‹ค ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํƒ€์ž…์„ ๊ฒ€์ฆํ•ด์ค€๋‹ค.

1.1.3 ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ํ•ต์‹ฌ ๊ฐœ๋…
  • *์ผ๊ธ‰ ์‹œ๋ฏผ์ธ ํ•จ์ˆ˜

ํ•จ์ˆ˜๋ฅผ ์ผ๋ฐ˜ ๊ฐ’์ฒ˜๋Ÿผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋‹ค. ํ•จ์ˆ˜๋ฅผ ๋ณ€์ˆ˜์— ์ €์žฅํ•  ์ˆ˜ ์žˆ๊ณ , ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋‹ค๋ฅธ ํ•จ์ˆ˜์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ•จ์ˆ˜์—์„œ ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ๋ถˆ๋ณ€์„ฑ

ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ๋Š” ์ผ๋‹จ ๋งŒ๋“ค์–ด์ง€๊ณ  ๋‚˜๋ฉด ๋‚ด๋ถ€ ์ƒํƒœ๊ฐ€ ์ ˆ๋Œ€๋กœ ๋ฐ”๋€Œ์ง€ ์•Š๋Š” ๋ถˆ๋ณ€ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ด ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•œ๋‹ค.

  • ๋ถ€์ˆ˜ ํšจ๊ณผ ์—†์Œ

ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ๋Š” ์ž…๋ ฅ์ด ๊ฐ™์œผ๋ฉด ํ•ญ์ƒ ๊ฐ™์€ ์ถœ๋ ฅ์„ ๋‚ด๋†“๊ณ  ๋‹ค๋ฅธ ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฉฐ, ํ•จ์ˆ˜ ์™ธ๋ถ€๋‚˜ ๋‹ค๋ฅธ ๋ฐ”๊นฅ ํ™˜๊ฒฝ๊ณผ ์ƒํ˜ธ์ž‘์šฉํ•˜์ง€ ์•Š๋Š” **์ˆœ์ˆ˜ ํ•จ์ˆ˜*๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

ํ•จ์ˆ˜ํ˜• ์Šคํƒ€์ผ๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•  ๋•Œ์˜ ์œ ์ตํ•œ ์ 
  1. ๊ฐ„๊ฒฐ์„ฑ

    ํ•จ์ˆ˜ํ˜• ์ฝ”๋“œ๋Š” ๊ทธ์— ์ƒ์‘ํ•˜๋Š” ๋ช…๋ นํ˜• ์ฝ”๋“œ์— ๋น„ํ•ด ๋” ๊ฐ„๊ฒฐํ•˜๋ฉฐ ์šฐ์•„ํ•˜๋‹ค. ํ•จ์ˆ˜๋ฅผ ๊ฐ’์ฒ˜๋Ÿผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ๋” ๊ฐ•๋ ฅํ•œ ์ถ”์ƒํ™”๋ฅผ ํ•  ์ˆ˜ ์žˆ๊ณ  ๊ฐ•๋ ฅํ•œ ์ถ”์ƒํ™”๋ฅผ ์‚ฌ์šฉํ•ด ์ฝ”๋“œ ์ค‘๋ณต์„ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค.

  2. ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด๋„ ์•ˆ์ „

    ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” ์ ์ ˆํ•œ ๋™๊ธฐํ™” ์—†์ด ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒฝ์šฐ ๊ฐ€์žฅ ๋งŽ์€ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด๋‹ค. ๋ถˆ๋ณ€ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์ˆœ์ˆ˜ ํ•จ์ˆ˜๋ฅผ ๊ทธ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์— ์ ์šฉํ•œ๋‹ค๋ฉด ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค. ๋”ฐ๋ผ์„œ ๋ณต์žกํ•œ ๋™๊ธฐํ™”๋ฅผ ์ ์šฉํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

  3. ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์‰ฝ๋‹ค.

    ๋ถ€์ˆ˜ ํšจ๊ณผ๊ฐ€ ์žˆ๋Š” ํ•จ์ˆ˜๋Š” ๊ทธ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ํ•„์š”ํ•œ ์ „์ฒด ํ™˜๊ฒฝ์„ ๊ตฌ์„ฑํ•˜๋Š” ์ค€๋น„ ์ฝ”๋“œ๊ฐ€ ๋”ฐ๋กœ ํ•„์š”ํ•˜์ง€๋งŒ, ์ˆœ์ˆ˜ ํ•จ์ˆ˜๋Š” ๊ทธ๋Ÿฐ ์ค€๋น„ ์ฝ”๋“œ ์—†์ด ๋…๋ฆฝ์ ์œผ๋กœ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฝ”ํ‹€๋ฆฐ์€ ์ฒ˜์Œ๋ถ€ํ„ฐ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ’๋ถ€ํ•˜๊ฒŒ ์ง€์›ํ•ด ์™”๋‹ค. ๊ทธ๋Ÿฐ ์ง€์›์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค

  • ํ•จ์ˆ˜ ํƒ€์ž…์„ ์ง€์›ํ•จ์— ๋”ฐ๋ผ ์–ด๋–ค ํ•จ์ˆ˜๊ฐ€ ๋‹ค๋ฅธ ํ•จ์ˆ˜๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›๊ฑฐ๋‚˜ ํ•จ์ˆ˜๊ฐ€ ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋žŒ๋‹ค ์‹์„ ์ง€์›ํ•จ์— ๋”ฐ๋ผ ๋ฒˆ๊ฑฐ๋กœ์šด ์ค€๋น„ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ ์ฝ”๋“œ ๋ธ”๋ก์„ ์‰ฝ๊ฒŒ ์ •์˜ํ•˜๊ณ  ์—ฌ๊ธฐ์ €๊ธฐ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ ํด๋ž˜์Šค๋Š” ๋ถˆ๋ณ€์ ์ธ ๊ฐ’ ๊ฐ์ฒด๋ฅผ ๊ฐ„ํŽธํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ตฌ๋ฌธ์„ ์ œ๊ณตํ•œ๋‹ค.
  • ์ฝ”ํ‹€๋ฆฐ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๊ฐ์ฒด์™€ ์ปฌ๋ ‰์…˜์„ ํ•จ์ˆ˜ํ˜• ์Šคํƒ€์ผ๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋Š” API๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

์ฝ”ํ‹€๋ฆฐ์€ ํ•จ์ˆ˜ํ˜• ์Šคํƒ€์ผ๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ์งค ์ˆ˜ ์žˆ๊ฒŒ ์ง€์›ํ•˜์ง€๋งŒ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์Šคํƒ€์ผ์„ ๊ฐ•์ œํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค. ๋ช…๋ นํ˜• ๋ฐฉ์‹์ด ๋” ์ ํ•ฉํ•œ ๊ฒฝ์šฐ๋ผ๋ฉด ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์œผ๋กœ ๋ฒˆ๊ฑฐ๋กญ๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ํ•„์š” ์—†์ด ์ง์ ‘ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ์™€ ๋ถ€์ˆ˜ ํšจ๊ณผ๋ฅผ ํ™œ์šฉํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๋œ๋‹ค.


*์ผ๊ธ‰ ์‹œ๋ฏผ์ธ ํ•จ์ˆ˜(์ผ๊ธ‰ ๊ฐ์ฒด) ํ•จ์ˆ˜๊ฐ€ ํ”„๋กœ๊ทธ๋žจ์˜ ์ตœ์ƒ์œ„ ๊ตฌ์„ฑ์š”์†Œ๋ผ๋Š” ์˜๋ฏธ. ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ๋Š” ํด๋ž˜์Šค๊ฐ€ ์ผ๊ธ‰ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

*์ˆœ์ˆ˜ ํ•จ์ˆ˜ ๋ถ€์ˆ˜ํšจ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜. ๋ถ€์ˆ˜ํšจ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์€ ๊ฐ™์€ ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•ด์„œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ํ•ญ์ƒ ๊ฐ™์€ ๊ฒฐ๊ด๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ์˜๋ฏธ.

1.1.4 ๋ฌด๋ฃŒ ์˜คํ”ˆ์†Œ์Šค

์ฝ”ํ‹€๋ฆฐ ์–ธ์–ด์™€ ์ปดํŒŒ์ผ๋Ÿฌ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฐ ์ฝ”ํ‹€๋ฆฐ๊ณผ ๊ด€๋ จ๋œ ๋ชจ๋“  ๋„๊ตฌ๋Š” ์˜คํ”ˆ์†Œ์Šค๋ฉฐ, ์–ด๋–ค ๋ชฉ์ ์—๋“  ๋ฌด๋ฃŒ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฝ”ํ‹€๋ฆฐ์€ ์•„ํŒŒ์น˜2 ๋ผ์ด์„ ์Šคํ•˜์— ์ œ๊ณต๋œ๋‹ค.

์ฝ”ํ‹€๋ฆฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ ์ธํ…”๋ฆฌJ ์•„์ด๋””์–ด ์ปค๋ฎค๋‹ˆํ‹ฐ ์—๋””์…˜, ์•ˆ๋“œ๋กœ์ด๋“œ ์ŠคํŠœ๋””์˜ค, ์ดํด๋ฆฝ์Šค ๊ฐ™์€ ์˜คํ”ˆ์†Œ์Šค IDE๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

1.2 ์ฝ”ํ‹€๋ฆฐ ์‘์šฉ

1.2.2 ์ฝ”ํ‹€๋ฆฐ ์•ˆ๋“œ๋กœ์ด๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

์ „ํ˜•์ ์ธ ๋ชจ๋ฐ”์ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ „ํ˜•์ ์ธ **์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜*๊ณผ ์•„์ฃผ ๋งŽ์ด ๋‹ค๋ฅด๋‹ค. ๋ชจ๋ฐ”์ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋ณด๋‹ค ๋” ์ž‘๊ณ  ๊ธฐ์กด ์ฝ”๋“œ ๊ธฐ๋ฐ˜๊ณผ ์ƒˆ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ฉํ•  ํ•„์š”๋„ ๋” ์ ๋‹ค. ๋˜ ๋ชจ๋ฐ”์ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋ณดํ†ต ๋” ๋‹ค์–‘ํ•œ ๋””๋ฐ”์ด์Šค์— ๋Œ€ํ•ด ์„œ๋น„์Šค์˜ ์‹ ๋ขฐ์„ฑ์„ ๋ณด์žฅํ•˜๋ฉด์„œ ๋” ๋น ๋ฅด๊ฒŒ ๋ฐฐํฌํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

์ฝ”ํ‹€๋ฆฐ ์–ธ์–ด์˜ ํŠน์„ฑ๊ณผ ์•ˆ๋“œ๋กœ์ด๋“œ ํ”„๋ ˆ์ž„์›Œํฌ์˜ ํŠน๋ณ„ํ•œ ์ปดํŒŒ์ผ๋Ÿฌ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ง€์›์„ ์กฐํ•ฉํ•˜๋ฉด ์•ˆ๋“œ๋กœ์ด๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์˜ ์ƒ์‚ฐ์„ฑ์„ ๋” ๋†’์ด๊ณ  ๊ฐœ๋ฐœ์˜ ์ฆ๊ฑฐ์›€์„ ๋”ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ปจํŠธ๋กค์— ๋ฆฌ์Šค๋„ˆ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๋ ˆ์ด์•„์›ƒ ์š”์†Œ๋ฅผ ํ•„๋“œ์™€ ๋ฐ”์ธ๋”ฉํ•˜๋Š” ๋“ฑ์˜ ํ”ํ•œ ์•ˆ๋“œ๋กœ์ด๋“œ ๊ฐœ๋ฐœ ์ž‘์—…์„ ํ›จ์”ฌ ๋” ์ ์€ ์ฝ”๋“œ๋กœ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ๊ณ , ๋•Œ๋กœ๋Š” ์ „ํ˜€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ  ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค(์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ž๋™์œผ๋กœ ํ•„์š”ํ•œ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑ).

์ฝ”ํ‹€๋ฆฐ ํŒ€์ด ๋งŒ๋“  ์•ˆ์ฝ” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ˆ˜๋งŽ์€ ์•ˆ๋“œ๋กœ์ด๋“œ API์— ๋Œ€ํ•œ ์ฝ”ํ‹€๋ฆฐ ์–ด๋Œ‘ํ„ฐ๋ฅผ ์ œ๊ณต๋ฐ›์„ ์ˆ˜ ์žˆ์–ด์„œ ์•ˆ๋“œ๋กœ์ด๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฒฝํ—˜์„ ๋” ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฝ”ํ‹€๋ฆฐ์„ ์‚ฌ์šฉํ•˜๋ฉด ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ด์ต
  1. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์‹ ๋ขฐ์„ฑ์ด ๋” ๋†’์•„์ง„๋‹ค

    ์•ˆ๋“œ๋กœ์ด๋“œ ์•ฑ์„ ๊ฐœ๋ฐœํ•ด๋ณธ ์‚ฌ๋žŒ์ด๋ผ๋ฉด 'ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ค‘๋‹จ๋จ(Process Has Stopped)' ๋Œ€ํ™”์ƒ์ž๋ฅผ ๋ณธ ์ผ์ด ๋งŽ์„ ๊ฒƒ์ด๋‹ค. ๊ทธ ๋Œ€ํ™”์ƒ์ž๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ ์˜ˆ์™ธ(์ฃผ๋กœ NullPointerException)๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ์— ํ‘œ์‹œ๋œ๋‹ค. ์ฝ”ํ‹€๋ฆฐ ํƒ€์ž… ์‹œ์Šคํ…œ์€ null ๊ฐ’์„ ์ •ํ™•ํžˆ ์ถ”์ ํ•˜๋ฉฐ ๋„ ํฌ์ธํ„ฐ๋กœ ์ธํ•ด ์ƒ๊ธฐ๋Š” ๋ฌธ์ œ๋ฅผ ์ค„์—ฌ์ค€๋‹ค. ์ž๋ฐ”์—์„œ NullPointerException์„ ์ผ์œผํ‚ค๋Š” ์œ ํ˜•์˜ ์ฝ”๋“œ๋Š” ๋Œ€๋ถ€๋ถ„ ์ฝ”ํ‹€๋ฆฐ์—์„œ๋Š” ์ปดํŒŒ์ผ๋„ ๋˜์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐœ๋ฐœ ์ค‘์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‚ฌ์šฉ์ž์—๊ฒŒ ์ „๋‹ฌ๋˜๊ธฐ ์ „์— ๋„ ํฌ์ธํ„ฐ ๊ด€๋ จ ์˜ค๋ฅ˜๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

  2. ์ฝ”ํ‹€๋ฆฐ์€ ์ž๋ฐ” 6๊ณผ ์™„์ „ํžˆ ํ˜ธํ™˜๋œ๋‹ค

    ๋”ฐ๋ผ์„œ ํ˜ธํ™˜์„ฑ๊ณผ ๊ด€๋ จํ•œ ์ƒˆ๋กœ์šด ๋ฌธ์ œ๋ฅผ ์•ผ๊ธฐํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ฝ”ํ‹€๋ฆฐ์ด ์ œ๊ณตํ•˜๋Š” ์ƒˆ๋กญ๊ณ  ๋ฉ‹์ง„ ์–ธ์–ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•ด ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•ด๋„ ์‚ฌ์šฉ์ž์˜ ๋””๋ฐ”์ด์Šค์—์„œ ๊ทธ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ์‚ฌ์šฉ์ž์˜ ๋””๋ฐ”์ด์Šค์— ์ตœ์‹  ์•ˆ๋“œ๋กœ์ด๋“œ๊ฐ€ ํƒ‘์žฌ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋„ ๋ง์ด๋‹ค.

  3. ์ฝ”ํ‹€๋ฆฐ์„ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ์„ฑ๋Šฅ ์ธก๋ฉด์—์„œ ์•„๋ฌด ์†ํ•ด๊ฐ€ ์—†๋‹ค

    ์ฝ”ํ‹€๋ฆฐ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ƒ์„ฑํ•œ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋Š” ์ผ๋ฐ˜์ ์ธ ์ž๋ฐ” ์ฝ”๋“œ์™€ ๋˜‘๊ฐ™์ด ํšจ์œจ์ ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค. ์ฝ”ํ‹€๋ฆฐ์˜ ๋Ÿฐํƒ€์ž„ ์‹œ์Šคํ…œ์€ ์ƒ๋‹นํžˆ ์ž‘๊ธฐ ๋•Œ๋ฌธ์— ์ปดํŒŒ์ผ ํ›„ ํŒจํ‚ค์ง•ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํฌ๊ธฐ๋„ ์ž๋ฐ” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋น„ํ•ด ๊ทธ๋ฆฌ ๋งŽ์ด ๋Š˜์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค. ๋˜ํ•œ ๋Œ€๋ถ€๋ถ„์˜ ์ฝ”ํ‹€๋ฆฐ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•จ์ˆ˜๋Š” ์ธ์ž๋กœ ๋ฐ›์€ ๋žŒ๋‹ค ํ•จ์ˆ˜๋ฅผ *์ธ๋ผ์ด๋‹ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๋žŒ๋‹ค๋ฅผ ์‚ฌ์šฉํ•ด๋„ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๊ฐ€ ๋งŒ๋“ค์–ด์ง€์ง€ ์•Š์œผ๋ฏ€๋กœ ๊ฐ์ฒด ์ฆ๊ฐ€๋กœ ์ธํ•ด ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์ด ๋Š˜์–ด๋‚˜์„œ ํ”„๋กœ๊ทธ๋žจ์ด ์ž์ฃผ ๋ฉˆ์ถ”๋Š” ์ผ๋„ ์—†๋‹ค.


*์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐ์—…๊ณผ ์กฐ์ง์˜ ๋น„์ฆˆ๋‹ˆ์Šค๋ฅผ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” ์‹œ์Šคํ…œ์„ ์˜๋ฏธ

*์ธ๋ผ์ด๋‹ Java Just-In-Time ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ์ตœ์ ํ™”

1.3 ์ฝ”ํ‹€๋ฆฐ์˜ ์ฒ ํ•™

1.3.1 ์‹ค์šฉ์„ฑ

  1. ์ฝ”ํ‹€๋ฆฐ์€ ์‹ค์ œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ์‹ค์šฉ์ ์ธ ์–ธ์–ด๋‹ค.

    ์ฝ”ํ‹€๋ฆฐ ์„ค๊ณ„๋Š”๋Œ€๊ทœ๋ชจ ์‹œ์Šคํ…œ์„ ๊ฐœ๋ฐœํ•ด๋ณธ ๋‹ค๋…„๊ฐ„์˜ IT์—…๊ณ„ ๊ฒฝํ—˜์„ ๋ฐ”ํƒ•์œผ๋กœ ์ด๋ค„์กŒ์œผ๋ฉฐ, ์ˆ˜๋งŽ์€ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์ž๋“ค์˜ ์‚ฌ์šฉ์— ์ž˜ ๋“ค์–ด๋งž์„ ์ˆ˜ ์žˆ๊ฒŒ ์ฃผ์˜ ๊นŠ๊ฒŒ ์–ธ์–ด ํŠน์„ฑ์„ ์„ ํƒํ–ˆ๋‹ค. ๋” ๋‚˜์•„๊ฐ€ ์ ฏ๋ธŒ๋ ˆ์ธ์Šค๋‚˜ ์ฝ”ํ‹€๋ฆฐ ์ปค๋ฎค๋‹ˆํ‹ฐ ๋‚ด๋ถ€์˜ ๊ฐœ๋ฐœ์ž๋“ค์ด ๋‹ค๋…„๊ฐ„ ์ฝ”ํ‹€๋ฆฐ ์ดˆ๊ธฐ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์ „๋‹ฌํ•œ ํ”ผ๋“œ๋ฐฑ์ด ํ˜„์žฌ ๋ฐœํ‘œ๋œ ์ตœ์ข… ์ฝ”ํ‹€๋ฆฐ ๋ฒ„์ „์— ๋ฐ˜์˜๋ผ ์žˆ๋‹ค.

  2. ์ฝ”ํ‹€๋ฆฐ์€ ์—ฐ๊ตฌ๋ฅผ ์œ„ํ•œ ์–ธ์–ด๊ฐ€ ์•„๋‹ˆ๋‹ค.

    ์ฝ”ํ‹€๋ฆฐ์€ ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๊ฐ€ ์ฑ„ํƒํ•œ ์ด๋ฏธ ์„ฑ๊ณต์ ์œผ๋กœ ๊ฒ€์ฆ๋œ ํ•ด๋ฒ•๊ณผ ๊ธฐ๋Šฅ์— ์˜์กดํ•œ๋‹ค.

  3. ์ฝ”ํ‹€๋ฆฐ์€ ์–ด๋Š ํŠน์ • ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์Šคํƒ€์ผ์ด๋‚˜ ํŒจ๋Ÿฌ๋‹ค์ž„์„ ์‚ฌ์šฉํ•  ๊ฒƒ์„ ๊ฐ•์ œ๋กœ ์š”๊ตฌํ•˜์ง€ ์•Š๋Š”๋‹ค.

  4. ์‹ค์šฉ์„ฑ์— ์žˆ์–ด ์ฝ”ํ‹€๋ฆฐ์˜ ๋‹ค๋ฅธ ์ธก๋ฉด์€ ๋„๊ตฌ๋ฅผ ๊ฐ•์กฐํ•œ๋‹ค๋Š” ์ ์ด๋‹ค.

    ์ฝ”ํ‹€๋ฆฐ์˜ ๊ฒฝ์šฐ ์ธํ…”๋ฆฌJ ์•„์ด๋””์–ด์˜ ๊ฐœ๋ฐœ๊ณผ ์ปดํŒŒ์ผ๋Ÿฌ์˜ ๊ฐœ๋ฐœ์ด ๋งž๋ฌผ๋ ค ์ด๋ค„์ ธ ์™”๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ฝ”ํ‹€๋ฆฐ ์–ธ์–ด์˜ ํŠน์„ฑ์€ ํ•ญ์ƒ ๋„๊ตฌ์˜ ํ™œ์šฉ์„ ์—ผ๋‘์— ๋‘๊ณ  ์„ค๊ณ„๋ผ ์™”๋‹ค.

  5. ์ฝ”ํ‹€๋ฆฐ์˜ ์—ฌ๋Ÿฌ ํŠน์„ฑ์„ ๋ฐฐ์šธ ๋•Œ๋„ IDE์˜ ์ฝ”ํ‹€๋ฆฐ ์–ธ์–ด ์ง€์›์ด ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•œ๋‹ค.

    ํ”ํžˆ ์“ฐ์ด์ง€๋งŒ ๋” ๊ฐ„๊ฒฐํ•œ ๊ตฌ์กฐ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์ฝ”๋“œ ํŒจํ„ด์„ ๋„๊ตฌ๊ฐ€ ์ž๋™์œผ๋กœ ๊ฐ์ง€ํ•ด์„œ ์ˆ˜์ •ํ•˜๋ผ๊ณ  ์ œ์•ˆํ•œ๋‹ค. ์ด๋Ÿฐ ์ž๋™ ์ˆ˜์ • ์•ˆ๋‚ด๋ฅผ ์‚ดํŽด๋ณด๋ฉด์„œ ์ฝ”ํ‹€๋ฆฐ ์–ธ์–ด์˜ ํŠน์„ฑ์„ ์ž˜ ์ดํ•ดํ•˜๋ฉด ์ž์‹ ์˜ ์ฝ”๋“œ์— ๊ทธ๋Ÿฐ ํŠน์„ฑ์„ ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋‹ค.

1.3.2 ๊ฐ„๊ฒฐ์„ฑ

์ฝ”ํ‹€๋ฆฐ์€ ๊ฒŒํ„ฐ, ์„ธํ„ฐ, ์ƒ์„ฑ์ž ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ•„๋“œ์— ๋Œ€์ž…ํ•˜๊ธฐ ์œ„ํ•œ ๋กœ์ง ๋“ฑ ์ž๋ฐ”์— ์กด์žฌํ•˜๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฒˆ๊ฑฐ๋กœ์šด ์ค€๋น„ ์ฝ”๋“œ๋ฅผ ์ฝ”ํ‹€๋ฆฐ์€ ๋ฌต์‹œ์ ์œผ๋กœ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”ํ‹€๋ฆฐ ์†Œ์Šค์ฝ”๋“œ๋Š” ๊ทธ๋Ÿฐ ์ค€๋น„ ์ฝ”๋“œ๋กœ ์ธํ•ด ์ง€์ €๋ถ„ํ•ด์ง€๋Š” ์ผ์ด ์—†๋‹ค.

๋‹ค๋ฅธ ์ตœ์‹  ์–ธ์–ด์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ฝ”ํ‹€๋ฆฐ์€ ๊ธฐ๋Šฅ์ด ๋‹ค์–‘ํ•œ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ˜๋ณต๋˜๊ฑฐ๋‚˜ ๊ธธ์–ด์งˆ ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•จ์ˆ˜ ํ˜ธ์ถœ๋กœ ๋Œ€์น˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฝ”ํ‹€๋ฆฐ์€ ๋žŒ๋‹ค๋ฅผ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ž‘์€ ์ฝ”๋“œ ๋ธ”๋ก์„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•จ์ˆ˜์— ์‰ฝ๊ฒŒ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ผ๋ฐ˜์ ์ธ ๊ธฐ๋Šฅ์„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์•ˆ์— ์บก์Šํ™”ํ•˜๊ณ  ์ž‘์—…์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ ธ์•ผ ํ•˜๋Š” ๊ฐœ๋ณ„์ ์ธ ๋‚ด์šฉ์„ ์‚ฌ์šฉ์ž๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ ์•ˆ์— ๋‚จ๊ฒจ๋‘˜ ์ˆ˜ ์žˆ๋‹ค.

  • java ์ฝ”๋“œ
package com.example.kotlinlab.ch1;
import java.util.ArrayList;
class User {
    private int no;
    private String name;
    private String email;
    public int getNo() {
        return no;
    }
    public void setNo(int no) {
        this.no = no;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
}

public class JavaClass {
    public static void main(String[] args) {
        ArrayList<User> list = new ArrayList<>();
        User user1 = new User();
        user1.setNo(1);
        user1.setname("kkang");
        user1.setEmail("[email protected]");
        list.add(user1);
        
        User user2 = new User();
        user2.setNo(1);
        user2.setName("kkang");
        user2.setEmail("[email protected]");
        list.add(user2);
        
        //ArrayList ํ•ญ๋ชฉ ๊ฐœ์ˆ˜ ์ถœ๋ ฅ
        System.out.println("List Size : " + list.size());
        //user1 ๊ฐ์ฒด์™€ user2 ๊ฐ์ฒด์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ์ธ์ง€ ํŒ๋‹จ
        if(user1.getNo() == user2.getNo() && 
           user1.getName().equals(user2.getName()) && 
           user1.getEmail().equals(user2.getEmail())) {
            System.out.println("user1 == user2");
        }else {
            System.out.println("user1 != user2");
        }
    }
}
  • kotlin ์ฝ”๋“œ
package com.example.kotlinlab.ch1
data class User(val no: Int, val name: String, val email: String)

fun main(args: Array<String>) {
    val list = ArrayList<User>()
    val user1 = User(1, "kkang", "[email protected]")
    list.add(user1)
    
    val user2 = User(1, "kkang", "[email protected]")
    list.add(user2)
    println("List Size ${list.size}")
    
    if(user1.equals(user2)) {
        println("user1 == user2")
    }else {
        println("user1 != user2")
    }
}

1.3.3 ์•ˆ์ „์„ฑ

์ผ๋ฐ˜์ ์œผ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๊ฐ€ ์•ˆ์ „ํ•˜๋‹ค๋Š” ๋ง์€ ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์˜ค๋ฅ˜ ์ค‘์—์„œ ์ผ๋ถ€ ์œ ํ˜•์˜ ์˜ค๋ฅ˜๋ฅผ ํ”„๋กœ๊ทธ๋žจ ์„ค๊ณ„๊ฐ€ ์›์ฒœ์ ์œผ๋กœ ๋ฐฉ์ง€ํ•ด์ค€๋‹ค๋Š” ๋œป์ด๋‹ค. ๋” ํฐ ์•ˆ์ „์„ฑ์„ ์–ป๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ”„๋กœ๊ทธ๋žจ์— ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ๋ง๋ถ™์—ฌ์•ผ ํ•˜๋ฏ€๋กœ ์ƒ์‚ฐ์„ฑ์ด ํ•˜๋ฝํ•˜๋Š” ๊ฒƒ์„ ๊ฐ์ˆ˜ํ•ด์•ผ ํ•˜๋ฉฐ ์•ˆ์ „์„ฑ๊ณผ ์ƒ์‚ฐ์„ฑ ์‚ฌ์ด์—๋Š” *ํŠธ๋ ˆ์ด๋“œ์˜คํ”„ ๊ด€๊ณ„๊ฐ€ ์„ฑ๋ฆฝํ•œ๋‹ค.

์ฝ”ํ‹€๋ฆฐ์„ JVM์—์„œ ์‹คํ–‰ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์€ ์ด๋ฏธ ์ƒ๋‹นํ•œ ์•ˆ์ „์„ฑ์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด JVM์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ ์•ˆ์ „์„ฑ์„ ๋ณด์žฅํ•˜๊ณ , ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ๋ฅผ ๋ฐฉ์ง€ํ•˜๋ฉฐ, ๋™์ ์œผ๋กœ ํ• ๋‹นํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ž˜๋ชป ์‚ฌ์šฉํ•จ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ๋ฌธ์ œ๋ฅผ ์˜ˆ๋ฐฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฝ”ํ‹€๋ฆฐ์€ ๊ฑฐ๊ธฐ์„œ ํ•œ๊ฑธ์Œ ๋” ๋‚˜์•„๊ฐ€ ์‹คํ–‰ ์‹œ์ ์— ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๋Œ€์‹  ์ปดํŒŒ์ผ ์‹œ์  ์„ฌ์‚ฌ๋ฅผ ํ†ตํ•ด ์˜ค๋ฅ˜๋ฅผ ๋” ๋งŽ์ด ๋ฐฉ์ง€ํ•ด์ค€๋‹ค. ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋‚ด์šฉ์œผ๋กœ ์ฝ”ํ‹€๋ฆฐ์€ ํ”„๋กœ๊ทธ๋žจ์˜ NullPointerException์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์—ฐ์‚ฐ์„ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๊ธˆ์ง€ํ•œ๋‹ค. ์–ด๋–ค ํƒ€์ž…์ด ๋„์ด ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ? ํ•œ ๊ธ€์ž๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด ๋œ๋‹ค

val s1: String? = null	//Null์ด ๋  ์ˆ˜ ์žˆ์Œ
val s2: String = ""		//Null์ด ๋  ์ˆ˜ ์—†์Œ

์ฝ”ํ‹€๋ฆฐ์ด ๋ฐฉ์ง€ํ•ด์ฃผ๋Š” ๋‹ค๋ฅธ ์˜ˆ์™ธ๋กœ๋Š” ClassCastException์ด ์žˆ๋‹ค. ์–ด๋–ค ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฅธ ํƒ€์ž…์œผ๋กœ ์บ์ŠคํŠธํ•˜๊ธฐ ์ „์— ํƒ€์ž…์„ ๋ฏธ๋ฆฌ ๊ฒ€์‚ฌํ•˜์ง€ ์•Š์œผ๋ฉด ClassCastException์ด ๋ฐœ์ƒํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์ฝ”ํ‹€๋ฆฐ์—์„œ๋Š” ํƒ€์ž… ๊ฒ€์‚ฌ์™€ ์บ์ŠคํŠธ๊ฐ€ ํ•œ ์—ฐ์‚ฐ์ž์— ์˜๋ค„์ง„๋‹ค. ์–ด๋–ค ๊ฐ์ฒด์˜ ํƒ€์ž…์„ ๊ฒ€์‚ฌํ–ˆ๊ณ  ๊ทธ ๊ฐ์ฒด๊ฐ€ ๊ทธ ํƒ€์ž…์— ์†ํ•œ๋‹ค๋ฉด ํ•ด๋‹น ํƒ€์ž…์˜ ๋ฉ”์†Œ๋“œ๋‚˜ ํ•„๋“œ ๋“ฑ์˜ ๋ฉค๋ฒ„๋ฅผ ๋ณ„๋„์˜ ์บ์ŠคํŠธ ์—†์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

if (value is String)				//ํƒ€์ž…์„ ๊ฒ€์‚ฌํ•œ๋‹ค
	println(value.toUpperCase())	//ํ•ด๋‹น ํƒ€์ž…์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค

*ํŠธ๋ ˆ์ด๋“œ์˜คํ”„ ์ด์œจ ๋ฐฐ๋ฐ˜์˜ ๊ด€๊ณ„, ํ•œ์ชฝ์„ ์ถ”๊ตฌํ•˜๋ฉด ๋‹ค๋ฅธ ์ชฝ์€ ํฌ์ƒ๋˜์–ด์•ผ ํ•˜๋Š” ๊ด€๊ณ„

1.3.4 ์ƒํ˜ธ์šด์šฉ์„ฑ

  1. ์ฝ”ํ‹€๋ฆฐ์€ ๊ธฐ์กด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

    ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์–ด๋–ค API๋ฅผ ์ œ๊ณตํ•˜๋˜ ๊ฐ„์— ์ฝ”ํ‹€๋ฆฐ์—์„œ ๊ทธ API๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ž๋ฐ” ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ ์ž๋ฐ” ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜๊ฑฐ๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜ ์ž๋ฐ” ์• ๋…ธํ…Œ์ด์…˜์„ ์ฝ”ํ‹€๋ฆฐ ์ฝ”๋“œ์— ์ ์šฉํ•˜๋Š” ๋“ฑ์˜ ์ผ์ด ๋ชจ๋‘ ๊ฐ€๋Šฅํ•˜๋‹ค.

  2. ์ฝ”ํ‹€๋ฆฐ์˜ ํด๋ž˜์Šค๋‚˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์ผ๋ฐ˜์ ์ธ ์ž๋ฐ” ํด๋ž˜์Šค๋‚˜ ๋ฉ”์†Œ๋“œ์™€ ๋˜‘๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

    ๊ธฐ์กด ์ž๋ฐ” ํ”„๋กœ์ ํŠธ์— ์ฝ”ํ‹€๋ฆฐ์„ ๋„์ž…ํ•˜๋Š” ๊ฒฝ์šฐ ์ž๋ฐ”๋ฅผ ์ฝ”ํ‹€๋ฆฐ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋„๊ตฌ๋ฅผ ์ฝ”๋“œ๋ฒ ์ด์Šค ์•ˆ์— ์žˆ๋Š” ์ž๋ฐ” ํด๋ž˜์Šค์— ๋Œ€ํ•ด ์‹คํ–‰ํ•ด์„œ ๊ทธ ํด๋ž˜์Šค๋ฅผ ์ฝ”ํ‹€๋ฆฐ ํด๋ž˜์Šค๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

  3. ๊ธฐ์กด ์ž๋ฐ” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐ€๋Šฅํ•˜๋ฉด ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•œ๋‹ค.

    ์˜ˆ๋ฅผ ๋“ค์–ด ์ฝ”ํ‹€๋ฆฐ์€ ์ž์ฒด ์ปฌ๋ ‰์…˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ฝ”ํ‹€๋ฆฐ์€ ์ž๋ฐ” ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํด๋ž˜์Šค์— ์˜ํ•ด ์˜์กดํ•œ๋‹ค. ์ด๋Š” ์ฝ”ํ‹€๋ฆฐ์—์„œ ์ž๋ฐ” API๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ๊ฐ์ฒด๋ฅผ ๊ฐ์‹ธ๊ฑฐ๋‚˜ ๋ณ€ํ™˜ํ•  ํ•„์š”๊ฐ€ ์—†๊ณ , ์ž๋ฐ”์—์„œ ์ฝ”ํ‹€๋ฆฐ API๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์•„๋ฌด๋Ÿฐ ๋ณ€ํ™˜์ด ํ•„์š”์—†๋‹ค๋Š” ๋œป์ด๋‹ค.

  4. ์ฝ”ํ‹€๋ฆฐ์ด ์ œ๊ณตํ•˜๋Š” ๋„๊ตฌ๋„ ๋‹ค์ค‘ ์–ธ์–ด ํ”„๋กœ์ ํŠธ๋ฅผ ์™„์ „ํžˆ ์ง€์›ํ•œ๋‹ค.

    ์ฝ”ํ‹€๋ฆฐ์€ ์ž๋ฐ”์™€ ์ฝ”ํ‹€๋ฆฐ ์†Œ์Šค ํŒŒ์ผ์ด ์ž„์˜๋กœ ์„ž์—ฌ ์žˆ์–ด๋„ ์ œ๋Œ€๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ๋‹ค. IDE ๊ธฐ๋Šฅ๋„ ์–ธ์–ด์™€ ๊ด€๊ณ„์—†์ด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•œ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋™์ž‘์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

    • ์ž๋ฐ”์™€ ์ฝ”ํ‹€๋ฆฐ ์†Œ์Šค ํŒŒ์ผ์„ ์ž์œ ๋กญ๊ฒŒ ๋‚ด๋น„๊ฒŒ์ด์…˜ ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์—ฌ๋Ÿฌ ์–ธ์–ด๋กœ ์ด๋ค„์ง„ ํ”„๋กœ์ ํŠธ๋ฅผ ๋””๋ฒ„๊น…ํ•˜๊ณ  ์„œ๋กœ ๋‹ค๋ฅธ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ์–ธ์–ด์™€ ๊ด€๊ณ„์—†์ด ํ•œ ๋‹จ๊ณ„์”ฉ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์ž๋ฐ” ๋ฉ”์†Œ๋“œ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•ด๋„ ๊ทธ ๋ฉ”์†Œ๋“œ์™€ ๊ด€๋ จ ์žˆ๋Š” ์ฝ”ํ‹€๋ฆฐ ์ฝ”๋“œ๊นŒ์ง€ ์ œ๋Œ€๋กœ ๋ณ€๊ฒฝ๋œ๋‹ค. ์—ญ์œผ๋กœ ์ฝ”ํ‹€๋ฆฐ ๋ฉ”์†Œ๋“œ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•ด๋„ ์ž๋ฐ” ์ฝ”๋“œ๊นŒ์ง€ ๋ชจ๋‘ ์ž๋™์œผ๋กœ ๋ณ€๊ฒฝ๋œ๋‹ค.

1.4 ์š”์•ฝ

  • ์ฝ”ํ‹€๋ฆฐ์€ ํƒ€์ž… ์ถ”๋ก ์„ ์ง€์›ํ•˜๋Š” ์ •์  ํƒ€์ž… ์ง€์ • ์–ธ์–ด๋‹ค. ๋”ฐ๋ผ์„œ ์†Œ์Šค์ฝ”๋“œ์˜ ์ •ํ™•์„ฑ๊ณผ ์„ฑ๋Šฅ์„ ๋ณด์žฅํ•˜๋ฉด์„œ๋„ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ฝ”ํ‹€๋ฆฐ์€ ๊ฐ์ฒด์ง€ํ–ฅ๊ณผ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์Šคํƒ€์ผ์„ ๋ชจ๋‘ ์ง€์›ํ•œ๋‹ค. ์ฝ”ํ‹€๋ฆฐ์—์„œ๋Š” ์ผ๊ธ‰ ์‹œ๋ฏผ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ์ˆ˜์ค€ ๋†’์€ ์ถ”์ƒํ™”๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ณ , ๋ถˆ๋ณ€ ๊ฐ’ ์ง€์›์„ ํ†ตํ•ด ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฐœ๋ฐœ๊ณผ ํ…Œ์ŠคํŠธ๋ฅผ ๋” ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ฝ”ํ‹€๋ฆฐ์„ ์„œ๋ฒ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์— ์ž˜ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฝ”ํ‹€๋ฆฐ์€ ๊ธฐ์กด ์ž๋ฐ” ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์™„๋ฒฝํ•˜๊ฒŒ ์ง€์›ํ•˜๋Š” ํ•œํŽธ, HTML ์ƒ์„ฑ๊ธฐ๋‚˜ ์˜์†ํ™” ๋“ฑ์˜ ์ผ๋ฐ˜์ ์ธ ์ž‘์—…์„ ์œ„ํ•œ ์ƒˆ๋กœ์šด ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
  • ์ฝ”ํ‹€๋ฆฐ์„ ์•ˆ๋“œ๋กœ์ด๋“œ์—๋„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฝ”ํ‹€๋ฆฐ์˜ ๋Ÿฐํƒ€์ž„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ํฌ๊ธฐ๊ฐ€ ์ž‘๊ณ , ์ฝ”ํ‹€๋ฆฐ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์•ˆ๋“œ๋กœ์ด๋“œ API๋ฅผ ํŠน๋ณ„ํžˆ ์ง€์›ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ฝ”ํ‹€๋ฆฐ์˜ ๋‹ค์–‘ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ ํ”ํžˆ ํ•˜๋Š” ์ž‘์—…์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉด์„œ ์ฝ”ํ‹€๋ฆฐ๊ณผ ์ž˜ ํ†ตํ•ฉ๋  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
  • ์ฝ”ํ‹€๋ฆฐ์€ ๋ฌด๋ฃŒ๋ฉฐ ์˜คํ”ˆ์†Œ์Šค๋‹ค. ๋˜ํ•œ ์ฃผ์š” IDE์™€ ๋นŒ๋“œ ์‹œ์Šคํ…œ์„ ์™„์ „ํžˆ ์ง€์›ํ•œ๋‹ค.
  • ์ฝ”ํ‹€๋ฆฐ์€ ์‹ค์šฉ์ ์ด๋ฉฐ ์•ˆ์ „ํ•˜๊ณ , ๊ฐ„๊ฒฐํ•˜๋ฉฐ ์ƒํ˜ธ์šด์šฉ์„ฑ์ด ์ข‹๋‹ค. ์ด๋Š” ์ฝ”ํ‹€๋ฆฐ์„ ์„ค๊ณ„ํ•˜๋ฉด์„œ ์ผ๋ฐ˜์ ์ธ ์ž‘์—…์— ๋Œ€ํ•ด ์ด๋ฏธ ์ž˜ ์•Œ๋ ค์ง„ ํ•ด๋ฒ•์„ ์ฑ„ํƒํ•˜๊ณ , NullPointerException๊ณผ ๊ฐ™์ด ํ”ํžˆ ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๋ฉฐ, ์ฝ๊ธฐ ์‰ฝ๊ณ  ๊ฐ„๊ฒฐํ•œ ์ฝ”๋“œ๋ฅผ ์ง€์›ํ•˜๋ฉด์„œ ์ž๋ฐ”์™€ ์•„๋ฌด๋Ÿฐ ์ œ์•ฝ ์—†์ด ํ†ตํ•ฉ๋  ์ˆ˜ ์žˆ๋Š” ์–ธ์–ด๋ฅผ ๋งŒ๋“œ๋Š”๋ฐ ์ดˆ์ ์„ ๋งž์ท„๋‹ค๋Š” ๋œป์ด๋‹ค.

2. Kotlin์„ ๋ฐฐ์›Œ๋ณด์ž

2.1 ์ฝ”ํ‹€๋ฆฐ ํŒŒ์ผ์ •์˜

2.1.1 ์ผ๋ฐ˜ ํŒŒ์ผ๊ณผ ํด๋ž˜์Šค ํŒŒ์ผ

  • ์ฝ”ํ‹€๋ฆฐ ํ”„๋กœ๊ทธ๋žจ์€ ํ™•์žฅ์ž๊ฐ€ kt์ธ ํŒŒ์ผ์„ ์ž‘์„ฑํ•˜์—ฌ ๊ฐœ๋ฐœํ•œ๋‹ค.

  • ์ฝ”ํ‹€๋ฆฐ ํŒŒ์ผ์€ ํด๋ž˜์Šค ํŒŒ์ผ์ผ ์ˆ˜๋„ ์žˆ๊ณ  ์ผ๋ฐ˜ ํŒŒ์ผ์ผ ์ˆ˜๋„ ์žˆ๋‹ค.

    ์ฝ”ํ‹€๋ฆฐ ์ž์ฒด์˜ ๊ทœ์น™์ด๋ผ๊ธฐ๋ณด๋‹ค๋Š” IDE์—์„œ์˜ ํŽธ์˜๋ฅผ ์œ„ํ•œ ๊ตฌ๋ถ„์ด๋‹ค. ํด๋ž˜์Šค ํŒŒ์ผ์—๋Š” ํด๋ž˜์Šค๊ฐ€ ๊ผญ ์ž‘์„ฑ๋˜์–ด์•ผ ํ•˜๊ณ , ์ผ๋ฐ˜ ํŒŒ์ผ์—๋Š” ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•˜์ง€ ๋ชปํ•œ๋‹ค๋Š” ๊ทœ์น™์€ ์—†์œผ๋ฉฐ, ํด๋ž˜์Šค ํŒŒ์ผ๋กœ ๋งŒ๋“  ํ›„ ํด๋ž˜์Šค๊ฐ€ ์•„๋‹Œ ํ•จ์ˆ˜์™€ ๋ณ€์ˆ˜ ๋“ฑ์œผ๋กœ๋งŒ ํŒŒ์ผ์„ ๊ตฌ์„ฑํ•ด๋„ ์ƒ๊ด€์—†๊ณ , ์ผ๋ฐ˜ ํŒŒ์ผ๋กœ ๋งŒ๋“  ํ›„ ๊ทธ๊ณณ์— ํด๋ž˜์Šค๋ฅผ ์„ ์–ธํ•ด๋„ ์ƒ๊ด€์—†๋‹ค.

2.1.2 ํŒŒ์ผ์˜ ๊ตฌ์„ฑ์š”์†Œ

  • ํ•˜๋‚˜์˜ ํŒŒ์ผ์— ํŒจํ‚ค์ง€, ์ž„ํฌํŠธ, ํด๋ž˜์Šค๋ฅผ ์„ ์–ธํ•œ ๋‹จ์ˆœ ๊ตฌ์กฐ์ด๋ฉฐ, ๋‹ค๋ฅธ ๊ฐ์ฒด์ง€ํ–ฅ ์–ธ์–ด์™€ ํฐ ์ฐจ์ด๊ฐ€ ์—†๋‹ค.

  • ์ฝ”ํ‹€๋ฆฐ ํŒŒ์ผ์—๋„ ํŒจํ‚ค์ง€๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ๋ฐ˜๋“œ์‹œ ํŒŒ์ผ์˜ ์ฒซ ์ค„์— ์„ ์–ธํ•ด์•ผ ํ•œ๋‹ค.

  • ์ฝ”ํ‹€๋ฆฐ ํŒŒ์ผ์€ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜๋กœ๋งŒ ๊ตฌ์„ฑํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

  • ์ฝ”ํ‹€๋ฆฐ์—์„œ๋Š” ๋ชจ๋“  ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ๊ผญ ํด๋ž˜์Šค๋กœ ๋ฌถ์ง€ ์•Š์•„๋„ ๋˜๋ฉฐ, ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜๋ฅผ ํด๋ž˜์Šค ์™ธ๋ถ€์— ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์ฝ”ํ‹€๋ฆฐ์€ ํŒŒ์ผ์˜ ๊ตฌ์„ฑ์š”์†Œ์— ๋Œ€ํ•œ ๊ทœ์น™์ด ์—†์œผ๋ฉฐ ๊ฐœ๋ฐœ์ž์˜ ํŽธ์˜์— ๋”ฐ๋ผ์„œ ๋ณ€์ˆ˜, ํ•จ์ˆ˜, ํด๋ž˜์Šค ๋“ฑ์„ ์ž์œ ๋กญ๊ฒŒ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.


Q. ์ฝ”ํ‹€๋ฆฐ์ด JVM์—์„œ ์ˆ˜ํ–‰๋œ๋‹ค๊ณ  ํ–ˆ๋Š”๋ฐ ํด๋ž˜์Šค ์„ ์–ธ ์—†์ด ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๋ฉด JVM ์‹คํ–‰ ์‹œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒ?

A. ์ฝ”ํ‹€๋ฆฐ์œผ๋กœ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๊ฐ€ ๊ทธ๋Œ€๋กœ JVM์—์„œ ์‹คํ–‰๋˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, JVM์—์„œ ์‹คํ–‰๋˜๋„๋ก ์ ์ ˆํ•˜๊ฒŒ ๋ณ€ํ˜•๋œ๋‹ค. ํŒŒ์ผ๋ช…์— "Kt"๊ฐ€ ์ถ”๊ฐ€๋˜๋Š” ํด๋ž˜์Šค๊ฐ€ ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด์ง„๋‹ค.

2.1.3 ๋ณ€์ˆ˜ / ํ•จ์ˆ˜ ์ž„ํฌํŠธ

  • ํด๋ž˜์Šค ์—†์ด ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜๋ฅผ ์™ธ๋ถ€์—์„œ ์ด์šฉํ•˜๋ ค๋ฉด ํด๋ž˜์Šค์ฒ˜๋Ÿผ ๊ทธ๋Œ€๋กœ ์ž„ํฌํŠธํ•ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

    package com.example.ch3.two.sub
    
    val threeVal = 10
    
    fun threeFun() {
        
    }

    ์ด ํŒŒ์ผ์˜ ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜๋ฅผ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์˜ ํŒŒ์ผ์—์„œ ์ด์šฉํ•˜๋ ค๋ฉด

    package com.example.ch3.two
    
    import com.example.ch3.two.sub.threeFun
    import com.example.ch3.two.sub.threeVal
    
    fun main(args: Array<String>) {
        println(threeVal)
        threeFun()
    }

    ์ด์ฒ˜๋Ÿผ ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜๋ฅผ ์ง์ ‘ ์ž„ํฌํŠธํ•˜์—ฌ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ํด๋ž˜์Šค๋กœ ๋ฌถ์ง€ ์•Š์€ ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜๋ฅผ ์ตœ์ƒ์œ„ ๋ ˆ๋ฒจ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ฆ‰, ํŒจํ‚ค์ง€ ๋‚ด์— ์„ ์–ธ๋œ ์ „์—ญ๋ณ€์ˆ˜๋‚˜ ์ „์—ญํ•จ์ˆ˜์ฒ˜๋Ÿผ ์ทจ๊ธ‰ํ•œ๋‹ค.

2.1.4 ๊ธฐ๋ณธ ํŒจํ‚ค์ง€

์ฝ”ํ‹€๋ฆฐ์—์„œ ๋‹ค์Œ์˜ ํŒจํ‚ค์ง€๋Š” ๋ณ„๋„์˜ import ๊ตฌ๋ฌธ ์—†์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  • kotlin.*
  • kotlin.annotation.*
  • kotlin.collections.*
  • kotlin.comparisons.* (since 1.1)
  • kotlin.io.*
  • kotlin.ranges.*
  • kotlin.sequences.*
  • kotlin.text.*
  • kotlin.lang.*
  • kotlin.jvm.*

2.1.5 ์ด๋ฆ„ ๋ณ€๊ฒฝํ•ด์„œ ์ž„ํฌํŠธํ•˜๊ธฐ

ํด๋ž˜์Šค๋ฅผ ์ž„ํฌํŠธํ•  ๋•Œ ์ด๋ฆ„์„ ๋ฐ”๊พธ์–ด ๋‹ค๋ฅธ ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

import java.text.SimpleDateFormat as MySimpleDateFormat

์ž„ํฌํŠธํ•˜๊ณ ์ž ํ•˜๋Š” ํด๋ž˜์Šค๋Š” java.text.SimpleDateFormat์ด๋‹ค. as๋ผ๋Š” ์˜ˆ์•ฝ์–ด๋ฅผ ์ด์šฉํ•˜์—ฌ ์ด๋ฆ„์„ MySimpleDateFormat์ด๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๋ณ€๊ฒฝํ–ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ž„ํฌํŠธํ•œ ํŒŒ์ผ ๋‚ด์—์„œ๋Š” ์ด์ œ MySimpleDateFormat์ด๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ SimpleDateFormatํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

2.2 ์ฝ”ํ‹€๋ฆฐ์˜ ์ฃผ์š” ๋ฌธ๋ฒ•

2.2.1 ๊ฐ’ ๋ฐ ๋ณ€์ˆ˜ ์„ ์–ธ

  • ํƒ€์ž…์„ ๋จผ์ € ์ ๊ณ  ๊ทธ ๋‹ค์Œ ์ด๋ฆ„์„ ์ ๋Š” ์ž๋ฐ”์™€ ๋‹ฌ๋ฆฌ, ์ฝ”ํ‹€๋ฆฐ์—์„œ๋Š” ์ด๋ฆ„์„ ๋จผ์ € ์ ๊ณ  ํƒ€์ž…์„ ์ ๋Š”๋‹ค. ํƒ€์ž…์€ ์ƒํ™ฉ์— ๋”ฐ๋ผ ์ƒ๋žต ๊ฐ€๋Šฅํ•˜๋‹ค.

    // String ํƒ€์ž…์„ ๊ฐ–๋Š” ๊ฐ’ a ์„ ์–ธ
    val a: String = "foo"
    
    // ํ• ๋‹นํ•˜๋Š” ์ž๋ฃŒ์˜ ํƒ€์ž…์— ๋”ฐ๋ผ ์ž๋™์œผ๋กœ ํƒ€์ž…์„ ์ถ”๋ก ํ•˜๋ฏ€๋กœ ํƒ€์ž…์„ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋‹ค.
    val b = "bar"
    
    // ์„ ์–ธ ์‹œ ์ž๋ฃŒ๋ฅผ ํ• ๋‹นํ•˜์ง€ ์•Š์œผ๋ฉด ํƒ€์ž…์„ ๊ผญ ๋ถ™์—ฌ์•ผ ํ•œ๋‹ค.
    val c: String
    
    // ์ž๋ฃŒ ํ• ๋‹น
    c = "baz"
    
    // ๋ณ€์ˆ˜ d ์„ ์–ธ
    var d: Int = 0
    
    // ๋ณ€์ˆ˜ ๊ฐ’ ๋ณ€๊ฒฝ
    d += 1
  • val(value)์€ **Assign-once ๋ณ€์ˆ˜*๋กœ ์„ ์–ธํ•˜๊ณ , var(variable)๋Š” * Mutable ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•œ๋‹ค.


*Assign-once ๋ณ€์ˆ˜ ํ•œ ๋ฒˆ ์ดˆ๊ธฐํ™”ํ•˜๋ฉด ๋”๋Š” ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค.

*Mutable ๋ณ€์ˆ˜ ์–ธ์ œ๋“ ์ง€ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ

2.2.2 ํ•จ์ˆ˜ ์„ ์–ธ

  • ํ•จ์ˆ˜๋Š” ์ž๋ฐ”์˜ ๋ฉ”์„œ๋“œ์— ๋Œ€์‘ํ•˜๋ฉฐ, ๊ฐ’ ๋ฐ ๋ณ€์ˆ˜ ์„ ์–ธ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ฐ˜ํ™˜ ํƒ€์ž…์„ ๋’ค์— ์ ๋Š”๋‹ค.

  • ์ฝ”ํ‹€๋ฆฐ์—์„œ๋Š” ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•  ๋•Œ๋Š” fun์ด๋ผ๋Š” ์˜ˆ์•ฝ์–ด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

    fun greet(name: String) : Unit {
        println("Hello, $name!")
    }
    
    fun sum(a: Int, b: Int) : Int {
        return a + b
    }
    
    fun some(a: Int, b: Int): Int = a + b
    // ๋ฐ˜ํ™˜ ํƒ€์ž… ์ƒ๋žต
    fun some(a: Int, b: Int) = a + b
  • ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’์— ์‚ฌ์šฉํ•˜๋Š” Unit์€ ์ž๋ฐ”์˜ void์™€ ์œ ์‚ฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉฐ Unit์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋Š” ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ํƒ€์ž…์ด ์„ ์–ธ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด ๊ธฐ๋ณธ์œผ๋กœ Unit์ด ์ ์šฉ๋œ๋‹ค.

  • ๋‹จ์ผ ํ‘œํ˜„ ํ•จ์ˆ˜๋Š” ๋ฐ˜ํ™˜ ํƒ€์ž…๊ณผ ์ค‘๊ด„ํ˜ธ๋ฅผ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฐ˜ํ™˜ ํƒ€์ž…์„ ์ƒ๋žตํ•˜๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์œ ์ถ”ํ•ด์„œ ์ •ํ•œ๋‹ค.

2.2.3 ํด๋ž˜์Šค ๋ฐ ์ธํ„ฐํŽ˜์ด์Šค ์„ ์–ธ

ํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์„ ์–ธํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์ž๋ฐ”์™€ ํฌ๊ฒŒ ๋‹ค๋ฅด์ง€ ์•Š๋‹ค. ๋‹จ, ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ๋‹ค์†Œ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

2.2.3.1 ์ƒ์„ฑ์ž

์ฝ”ํ‹€๋ฆฐ์—์„œ๋Š” ์ƒ์„ฑ์ž๋ฅผ ์ฃผ ์ƒ์„ฑ์ž์™€ ๋ณด์กฐ ์ƒ์„ฑ์ž๋กœ ๊ตฌ๋ถ„ํ•œ๋‹ค.

์ฃผ ์ƒ์„ฑ์ž

  • ํด๋ž˜์Šค ์„ ์–ธ ๋ถ€๋ถ„์— ์ž‘์„ฑ
  • ํ•˜๋‚˜์˜ ํด๋ž˜์Šค์— ํ•˜๋‚˜์˜ ์ฃผ ์ƒ์„ฑ์ž๋งŒ ์ •์˜ ๊ฐ€๋Šฅ
  • ๊ผญ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š” ๊ฑด ์•„๋‹ˆ๋ฉฐ ๋ณด์กฐ ์ƒ์„ฑ์ž๊ฐ€ ์žˆ๋‹ค๋ฉด ์ž‘์„ฑํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ

๋ณด์กฐ ์ƒ์„ฑ์ž

  • ํด๋ž˜์Šค ๋ชธ์ฒด์— constructor ์˜ˆ์•ฝ์–ด๋กœ ์„ ์–ธ
  • ๋ณด์กฐ ์ƒ์„ฑ์ž๋ฅผ ์„ ์–ธํ–ˆ์œผ๋ฉด ์ฃผ ์ƒ์„ฑ์ž๋Š” ์„ ์–ธํ•˜์ง€ ์•Š์•„๋„ ๋จ
// ์ฃผ ์ƒ์„ฑ์ž๋กœ ์„ ์–ธ
class User1(name: String, age: Int){
    
}
// ๋ณด์กฐ ์ƒ์„ฑ์ž๋กœ ์„ ์–ธ
class User2{
    constructor(name: String, age: Int){}
}

fun main(args: Array<String>){
    val user1 = User1("kkang", 30)
    val user2 = User2("kkang", 30)
}
2.2.3.2 ์ž๋ฐ” VS ์ฝ”ํ‹€๋ฆฐ
  • ์ฝ”ํ‹€๋ฆฐ์—์„œ๋Š” ํŒŒ์ผ ๋‚ด์— ํŒŒ์ผ๋ช…๊ณผ ๊ฐ™์€ public ํด๋ž˜์Šค๋ฅผ ๊ฐ•์ œํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ์ฝ”ํ‹€๋ฆฐ์—๋Š” new ์—ฐ์‚ฐ์ž๊ฐ€ ์—†๋‹ค.
  • ์ฝ”ํ‹€๋ฆฐ์˜ ์ƒ์„ฑ์ž๋Š” ์ž๋ฐ”์˜ ์ž‘์„ฑ ๋ฐฉ๋ฒ• ๋ฐ ๋™์ž‘ ์›๋ฆฌ๊ฐ€ ๋งŽ์ด ๋‹ค๋ฅด๋‹ค.
    • constructor ์˜ˆ์•ฝ์–ด๋ฅผ ์ด์šฉํ•ด ์ƒ์„ฑ์ž ์„ ์–ธ
    • ์ฃผ ์ƒ์„ฑ์ž์™€ ๋ณด์กฐ ์ƒ์„ฑ์ž๋กœ ๊ตฌ๋ถ„
    • ์ƒ์„ฑ์ž์˜ ์ดˆ๊ธฐํ™” ๋กœ์ง์„ ์œ„ํ•ด init{} ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉ
    • ์ฃผ ์ƒ์„ฑ์ž์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์— val, var๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ํด๋ž˜์Šค์˜ **ํ”„๋กœํผํ‹ฐ*๊ฐ€ ๋˜์–ด ํ•จ์ˆ˜์—์„œ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ์ฝ”ํ‹€๋ฆฐ์—์„œ๋Š” ํ•จ์ˆ˜ ๋‚ด์˜ ์ง€์—ญ๋ณ€์ˆ˜๋ฅผ final๋กœ ์„ ์–ธํ•˜์ง€ ์•Š์•„๋„ ํ•จ์ˆ˜ ๋‚ด์— ์„ ์–ธํ•œ Nested ํด๋ž˜์Šค์—์„œ ์ด์šฉ
  • ์ฝ”ํ‹€๋ฆฐ์—์„œ๋Š” static์ด๋ผ๋Š” ์˜ˆ์•ฝ์–ด๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์Œ

*ํ”„๋กœํผํ‹ฐ ์ฝ”ํ‹€๋ฆฐ์—์„œ๋Š” ํด๋ž˜์Šค์˜ ๋ณ€์ˆ˜๋ฅผ ํ”„๋กœํผํ‹ฐ๋ผ ๋ถ€๋ฅธ๋‹ค. var, val๋กœ ์„ ์–ธ๋˜๋Š” ๋ณ€์ˆ˜๋“ค์ด ํ”„๋กœํผํ‹ฐ์ด๋‹ค.

2.2.4 ์กฐ๊ฑด๋ฌธ

  • if - else๋ฌธ์€ ์ž๋ฐ”์™€ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์ด ๋™์ผํ•˜๋‹ค.
  • when๋ฌธ์€ ์ž๋ฐ”์˜ switch์™€ ๋™์ผํ•œ ์—ญํ• ์„ ํ•œ๋‹ค.

2.2.5 ๋ฐ˜๋ณต๋ฌธ

์ธ๋ฑ์Šค ๊ธฐ๋ฐ˜ for๋ฌธ๊ณผ for - each๋ฌธ์„ ๋ชจ๋‘ ์ง€์›ํ•˜๋Š” ์ž๋ฐ”์™€ ๋‹ฌ๋ฆฌ ์ฝ”ํ‹€๋ฆฐ์€ for - each๋ฌธ๋งŒ ์ง€์›ํ•œ๋‹ค.

2.2.6 ๋žŒ๋‹ค ํ‘œํ˜„์‹

  • ๋žŒ๋‹ค์‹, ๋˜๋Š” ๋žŒ๋‹ค ํ•จ์ˆ˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ฐœ๋…์œผ๋กœ ์ต๋ช… ํ•จ์ˆ˜๋ฅผ ์ง€์นญํ•˜๋Š” ์šฉ์–ด์ด๋‹ค.

  • ๋งŽ์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ์ง€์›ํ•˜๋ฉฐ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๋ชฉ์ ์œผ๋กœ ํ•˜์ง€ ์•Š๋”๋ผ๋„ ์ฝ”๋“œ์˜ ๊ฐ„๊ฒฐํ•จ์„ ์ฃผ๋ชฉ์ ์œผ๋กœ ์ž์ฃผ ์ด์šฉํ•œ๋‹ค.

  • ๋žŒ๋‹ค ํ•จ์ˆ˜๋Š” fun๊ณผ ํ•จ์ˆ˜์ด๋ฆ„์„ ๋ช…์‹œํ•˜์ง€ ์•Š๊ณ  ์ถ•์•ฝํ˜•์œผ๋กœ ์„ ์–ธํ•œ๋‹ค.

    ์ฝ”ํ‹€๋ฆฐ์—์„œ ํ•จ์ˆ˜ ์ •์˜

    fun ํ•จ์ˆ˜์ด๋ฆ„(๋งค๊ฐœ๋ณ€์ˆ˜) { ํ•จ์ˆ˜๋‚ด์šฉ }

    ๋žŒ๋‹ค ํ•จ์ˆ˜

    { ๋งค๊ฐœ๋ณ€์ˆ˜ -> ํ•จ์ˆ˜๋‚ด์šฉ }

  • ๋žŒ๋‹ค ํ•จ์ˆ˜๋Š” {} ์•ˆ์— ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜ ๋‚ด์šฉ์„ ์„ ์–ธํ•˜๋Š” ํ•จ์ˆ˜๋กœ ๋‹ค์Œ ๊ทœ์น™์— ๋”ฐ๋ผ ์ •์˜ํ•œ๋‹ค.

    • ๋žŒ๋‹ค ํ•จ์ˆ˜๋Š” ํ•ญ์ƒ {}์œผ๋กœ ๊ฐ์‹ธ์„œ ํ‘œํ˜„ํ•ด์•ผ ํ•œ๋‹ค.
    • {} ์•ˆ์— -> ํ‘œ์‹œ๊ฐ€ ์žˆ์œผ๋ฉฐ -> ์™ผ์ชฝ์€ ๋งค๊ฐœ๋ณ€์ˆ˜, ์˜ค๋ฅธ์ชฝ์€ ํ•จ์ˆ˜ ๋‚ด์šฉ์ด๋‹ค.
    • ๋งค๊ฐœ๋ณ€์ˆ˜ ํƒ€์ž…์„ ์„ ์–ธํ•ด์•ผ ํ•˜๋ฉฐ ์ถ”๋ก ํ•  ์ˆ˜ ์žˆ์„ ๋•Œ๋Š” ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’์€ ํ•จ์ˆ˜ ๋‚ด์šฉ์˜ ๋งˆ์ง€๋ง‰ ํ‘œํ˜„์‹์ด๋‹ค.
    // ์ผ๋ฐ˜ ํ•จ์ˆ˜ ์ •์˜๋ฒ•
    fun sum(x1: Int, x2: Int): Int {
        return x1 + x2
    }
    
    // ๋žŒ๋‹ค ํ•จ์ˆ˜๋กœ ์ •์˜
    val sum1 = {x1: Int, x2: Int -> x1 + x2}
    
    fun main(args: Array<String>) {
        val result1 = sum1(10, 20)
    }
    // ๋žŒ๋‹ค ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฆฌ์Šค๋„ˆ ์„ ์–ธ
    Button button = ... // ๋ฒ„ํŠผ ์ธ์Šคํ„ด์Šค
    
    // ๋žŒ๋‹ค ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฆฌ์Šค๋„ˆ๋ฅผ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค.
    button.setOnClickListener((View v) -> doSomething())
    
    // ์ธ์ž์˜ ํƒ€์ž…์„ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋‹ค.
    button.setOnClickListener(v -> doSomething())
  • ๋žŒ๋‹ค ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•˜๋ฉด, ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋„˜๊ธธ ์ˆ˜ ์žˆ๋Š” ๊ณ ์ฐจํ•จ์ˆ˜์— ๋“ค์–ด๊ฐˆ ํ•จ์ˆ˜ํ˜• ์ธ์ž๋ฅผ ์‰ฝ๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

2.2.7 ์ธ๋ผ์ธ ํ•จ์ˆ˜

๋žŒ๋‹ค ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์„ฑํ•œ ํ•จ์ˆ˜๋Š” ์ปดํŒŒ์ผ ๊ณผ์ •์—์„œ ์ต๋ช… ํด๋ž˜์Šค๋กœ ๋ณ€ํ™˜๋œ๋‹ค. ๋”ฐ๋ผ์„œ ์ต๋ช… ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋งค๋ฒˆ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๋ฏ€๋กœ ์ด๋Ÿฌํ•œ ์ฝ”๋“œ๊ฐ€ ์—ฌ๋Ÿฌ๋ฒˆ ํ˜ธ์ถœ๋˜๋Š” ๊ฒฝ์šฐ ์‹คํ–‰ ์‹œ์ ์˜ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ฒŒ ๋œ๋‹ค.

์ธ๋ผ์ธ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›๋Š” ํ•จ์ˆ˜ํ˜• ์ธ์ž์˜ ๋ณธ์ฒด๋ฅผ ํ•ด๋‹น ์ธ์ž๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๋ถ€๋ถ„์— ๊ทธ๋Œ€๋กœ ๋Œ€์ž…ํ•˜๋ฏ€๋กœ ์„ฑ๋Šฅ ํ•˜๋ฝ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ธ๋ผ์ธ ํ•จ์ˆ˜๋กœ ์„ ์–ธํ•˜๋ ค๋ฉด ํ•จ์ˆ˜ ์„ ์–ธ ์•ž์— inline ํ‚ค์›Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋œ๋‹ค.

3. Kotlin์„ ์‚ฌ์šฉํ•˜์ž

3.1 ์ฝ”ํ‹€๋ฆฐ ์•ˆ๋“œ๋กœ์ด๋“œ ์ต์Šคํ…์…˜

3.1.1 findViewById() ๋ฉ”์„œ๋“œ

  • ์•กํ‹ฐ๋น„ํ‹ฐ๋‚˜ ํ”„๋ž˜๊ทธ๋จผํŠธ ๋“ฑ ๋ ˆ์ด์•„์›ƒ ํŒŒ์ผ์— ์„ ์–ธ๋œ ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ทฐ๋กœ ๊ตฌ์„ฑ๋œ ์™€๋ฉด์—์„œ ํŠน์ • ๋ทฐ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์–ป๊ธฐ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค.
  • ์ด ๋ฉ”์„œ๋“œ์—์„œ ๋ฐ˜ํ™˜ํ•œ ๋ทฐ ๊ฐ์ฒด๋ฅผ ์ž˜๋ชป๋œ ํƒ€์ž…์˜ ๋ทฐ๋กœ ์บ์ŠคํŒ…ํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ๋ ˆ์ด์•„์›ƒ์— ์„ ์–ธ๋œ ID๋ฅผ ์ž˜๋ชป ์‚ฌ์šฉํ•˜๋ฉด ๋„ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • ํ™”๋ฉด์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ทฐ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ๊ฐ ์ปดํฌ๋„ŒํŠธ์˜ ์ดˆ๊ธฐํ™” ์‹œ์ ์— ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•„์š”ํ•œ ๋ทฐ์˜ ๊ฐœ์ˆ˜๋งŒํผ findViewById() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
  • ๋ณต์žกํ•œ ๊ตฌ์กฐ๋กœ ๊ตฌ์„ฑ๋œ ํ™”๋ฉด์„ ๋‹ค๋ฃจ๋Š” ๊ฒฝ์šฐ ๋ทฐ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ›๋Š” ์ฝ”๋“œ๋งŒ ๋ช‡์‹ญ ์ค„์„ ์ฐจ์ง€ํ•˜์—ฌ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง„๋‹ค.

์œ„์™€ ๊ฐ™์€ findViewById์˜ ๋ถˆํŽธํ•จ์€ ์ฝ”ํ‹€๋ฆฐ ์•ˆ๋“œ๋กœ์ด๋“œ ์ต์Šคํ…์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ง๋”ํžˆ ํ•ด๊ฒฐ๋œ๋‹ค.

3.1.2 ์ฝ”ํ‹€๋ฆฐ ์•ˆ๋“œ๋กœ์ด๋“œ ์ต์Šคํ…์…˜ ์„ค์ •

์ฝ”ํ‹€๋ฆฐ ์•ˆ๋“œ๋กœ์ด๋“œ ์ต์Šคํ…์…˜์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ด๋ฅผ ์‚ฌ์šฉํ•  ๋ชจ๋“ˆ์˜ ๋นŒ๋“œ์Šคํฌ๋ฆฝํŠธ์— kotlin-android-extensions ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ ์šฉํ•ด์•ผ ํ•œ๋‹ค. ์ด ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด kotlin-android ํ”Œ๋Ÿฌ๊ทธ์ธ๋„ ํ•จ๊ป˜ ์ ์šฉํ•œ๋‹ค.

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'

// ์ฝ”ํ‹€๋ฆฐ ์•ˆ๋“œ๋กœ์ด๋“œ ์ต์Šคํ…์…˜์„ ์ด ๋ชจ๋“ˆ์ด ์ ์šฉํ•œ๋‹ค.
apply plugin: 'kotlin-android-extensions'

android {
    ...
}

dependencies {
    ...
    compile "org.jetbrains.kotlin:kotlin-stdlib:${kotlinVersion}"
}

์ฝ”ํ‹€๋ฆฐ ์•ˆ๋“œ๋กœ์ด๋“œ ์ต์Šคํ…์…˜์€ ํ˜„์žฌ ์•กํ‹ฐ๋น„ํ‹ฐ, ํ”„๋ž˜๊ทธ๋จผํŠธ, ๋ฆฌ์‚ฌ์ดํด๋Ÿฌ๋ทฐ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋“ค ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ ˆ์ด์•„์›ƒ์— ํฌํ•จ๋œ ๋ทฐ๋ฅผ ํ”„๋กœํผํ‹ฐ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•˜๋ฉฐ, ๊ฐ ๋ทฐ์˜ ID๋ฅผ ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค. ๋ ˆ์ด์•„์›ƒ ๋‚ด ์„ ์–ธ๋œ ๋ทฐ๋ฅผ ํ”„๋กœํผํ‹ฐ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด, ์ฝ”ํ‹€๋ฆฐ ์•ˆ๋“œ๋กœ์ด๋“œ ์ต์Šคํ…์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” ํŠน๋ณ„ํ•œ import ๋ฌธ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค.

import kotlinx.android.synthetic.{sourceSet}.{layout}.*

// src/main/res/layout/activity_main.xml ๋ ˆ์ด์•„์›ƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ
import kotlinx.android.synthetic.main.activity_main.*

3.1.3 ์•กํ‹ฐ๋น„ํ‹ฐ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ

// activity_main ๋ ˆ์ด์•„์›ƒ์— ์žˆ๋Š” ๋ทฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ import ๋ฌธ
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        
        // ๋ทฐ ID๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์Šคํ„ด์Šค์— ๋ฐ”๋กœ ์ ‘๊ทผํ•ฉ๋‹ˆ๋‹ค.
        btn_submit.setOnClickListener {
            tv_message.text = "Hello, " + et_name.text.toString()
        }
    }
}

3.2 Anko

Anko๋Š” ์ฝ”ํ‹€๋ฆฐ ์–ธ์–ด์˜ ์ œ์ž‘์‚ฌ์ธ ์ ฏ๋ธŒ๋ ˆ์ธ์—์„œ ์ง์ ‘ ์ œ์ž‘ํ•˜์—ฌ ๋ฐฐํฌํ•˜๋Š” ์ฝ”ํ‹€๋ฆฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ, ์•ˆ๋“œ๋กœ์ด๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์— ์œ ์šฉํ•œ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•œ๋‹ค. Anko์—์„œ๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜์˜ ์„ฑ๊ฒฉ์— ๋”ฐ๋ผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋„ค ์ข…๋ฅ˜์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

  • Anko Commons
  • Anko Layouts
  • Anko SQLite
  • Anko Coroutines

3.2.1 Anko Commons

Anko Commons์€ ์•ˆ๋“œ๋กœ์ด๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ž‘์„ฑํ•  ๋•Œ ์ผ๋ฐ˜์ ์œผ๋กœ ์ž์ฃผ ๊ตฌํ˜„ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ฐ„ํŽธํ•˜๊ฒŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•œ๋‹ค. Anko Commons์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ด๋ฅผ ์‚ฌ์šฉํ•  ๋ชจ๋“ˆ์˜ ๋นŒ๋“œ ์Šคํฌ๋ฆฝํŠธ์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋œ๋‹ค.

// build.gradle
android {
    ...
}

dependencies {
    // Anko Commons ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ถ”๊ฐ€
    compile "org.jetbrains.anko:anko-commons:0.10.2"
    
    // appcompat-v7์šฉ Anko Commons ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ถ”๊ฐ€
    compile "org.jetbrains.anko:anko-appcompat-v7-commons:0.10.2"
    
    // support-v4์šฉ Anko Commons ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ถ”๊ฐ€
    compile "org.jetbrains.anko:anko-commons:0.10.2"
    
    ...
}
3.2.1.1 ํ† ์ŠคํŠธ ํ‘œ์‹œํ•˜๊ธฐ
// ๋‹ค์Œ ์ฝ”๋“œ์™€ ๋™์ผํ•œ ์—ญํ• ์„ ํ•œ๋‹ค.
// Toast.makeText(Context, "Hello, Kotlin!", Toast.LENGTH_SHORT).show();
toast("Hello, Kotlin!")

// Toast.makeText(Context, R.string.hello, Toast.LENGTH_SHORT).show();
toast(R.string.hello)
      
// Toast.makeText(Context, "Hello, Kotlin!", Toast.LENGTH_LONG).show();
longtoast("Hello, Kotlin!")
3.2.1.2 ๋‹ค์ด์–ผ๋กœ๊ทธ ์ƒ์„ฑ ๋ฐ ํ‘œ์‹œํ•˜๊ธฐ

arert() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด AlertDialog๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ† ์ŠคํŠธ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Context ํด๋ž˜์Šค ํ˜น์€ ์ด๋ฅผ ์ƒ์†ํ•˜๋Š” ํด๋ž˜์Šค(์•กํ‹ฐ๋น„ํ‹ฐ, ํ”„๋ž˜๊ทธ๋จผํŠธ) ๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

// ๋‹ค์ด์–ผ๋กœ๊ทธ์˜ ์ œ๋ชฉ๊ณผ ๋ณธ๋ฌธ์„ ์ง€์ •ํ•œ๋‹ค.
alert(title = "Message", message = "Let's learn Kotlin!") {
    // AlertDialog.Builder.setPositiveButton()
    positiveButton("Yes") {
        toast("Yay!")
    }
    ...    
}.show()

์ด๋ ‡๊ฒŒ Anko Commons ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ธํ…ํŠธ, ๋กœ๊ทธ ๋ฉ”์‹œ์ง€, ๋‹จ์œ„ ๋ณ€ํ™˜๋“ฑ ๋‹ค์–‘ํ•œ ๊ณณ์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

3.2.2 Anko Layouts

Anko Layouts๋Š” ์†Œ์Šค ์ฝ”๋“œ๋กœ ํ™”๋ฉด์„ ๊ตฌ์„ฑํ•  ๋•Œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์—ฌ๋Ÿฌ ํ•จ์ˆ˜๋“ค์„ ์ œ๊ณตํ•˜๋ฉฐ, ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด XML ๋ ˆ์ด์•„์›ƒ์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ํŽธ๋ฆฌํ•˜๊ฒŒ ์†Œ์Šค์ฝ”๋“œ๋กœ๋„ ํ™”๋ฉด์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. Anko Layout์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ด๋ฅผ ์‚ฌ์šฉํ•  ๋ชจ๋“ˆ์˜ ๋นŒ๋“œ์Šคํฌ๋ฆฝํŠธ์— ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋œ๋‹ค.

android {
    defaultConfig {
        // minSdkVersion์ด 15๋กœ ์„ค์ •๋˜์–ด ์žˆ๋‹ค.
        minSdkVersion 15
        targetSdkVersion 27
        ...
    }
    ...
}

dependencies {
    // minSdkVersion์— ๋งž์ถ”์–ด Anko Layouts ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
    compile "org.jetbrains.anko:anko-sdk15:0.10.2"
    ...
}
3.2.2.1 ์•กํ‹ฐ๋น„ํ‹ฐ์—์„œ DSL๋กœ ํ™”๋ฉด ๊ตฌ์„ฑํ•˜๊ธฐ
class MainActivity : AppcompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        
        // AnkoComponent์— ์ •์˜๋œ ๋ทฐ๋ฅผ ์•กํ‹ฐ๋น„ํ‹ฐ ํ™”๋ฉด์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.
        MainActivityUI().setContentView(this)
    }
}

// MainActivity์— ํ‘œ์‹œํ•  ํ™”๋ฉด์„ ๊ตฌ์„ฑํ•œ๋‹ค.
class MainActivityUI : AnkoComponent<MainActivity> {
    override fun createView(ui: AnkoContext<MainActivity>) = ui.apply {
        verticalLayout {
            padding = dip(12)
            
            textView("Enter Login Credentials")
            
            editText {
                hint = "E-mail"
            }
            
            editText {
                hint = "Password"
            }
            
            button("Submit")
        }
    }.view
}

์ถ”๊ฐ€๋กœ, ์•กํ‹ฐ๋น„ํ‹ฐ์—์„œ๋Š” AnkoComponent ์—†์ด ์ง์ ‘ ์•กํ‹ฐ๋น„ํ‹ฐ ๋‚ด์—์„œ DSL์„ ์‚ฌ์šฉํ•˜์—ฌ ํ™”๋ฉด์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

3.2.3 Anko SQLite

Anko SQLite๋Š” SQLite ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ์œ ์šฉํ•œ ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

์ž์„ธํ•œ ์ •๋ณด >> http://github.com/Kotlin/anko/wiki/Anko-SQLiteย 

3.2.4 Anko Coroutines

Anko Coroutines์€ ์ฝ”ํ‹€๋ฆฐ ์ฝ”๋ฃจํ‹ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(kotlinx.coroutines)์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

์ž์„ธํ•œ ์ •๋ณด >> http://github.com/Kotlin/anko/wiki/Anko-Coroutines

4. kotlin์„ ์‘์šฉํ•˜์ž - Todo ์•ฑ ๋งŒ๋“ค๊ธฐ

4.1 ๊ฐœ๋ฐœํ™˜๊ฒฝ ์„ค์ •

include kotlin support ์ฒดํฌ๋ฐ•์Šค๊ฐ€ ์ฒดํฌ๋œ ์ƒํƒœ๋กœ ์ƒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค๋ฉด ์ž๋™์œผ๋กœ ์ฝ”ํ‹€๋ฆฐ ํŒŒ์ผ์ด ๋งŒ๋“ค์–ด ์ง„๋‹ค.

์ฒดํฌํ•˜์ง€ ์•Š๊ณ  ๋งŒ๋“ค๋”๋ผ๋„ ์•„๋ž˜์™€ ๊ฐ™์ด ์„ค์ •ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

// build.gradle(Project ...)
...
dependencies {
        classpath 'com.android.tools.build:gradle:3.1.2'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
...
// build.gradle(Module: app)
...
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
...

dependencies {
	...
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
	...
}

์ฝ”ํ‹€๋ฆฐ ์–ธ์–ด ์˜จ๋ผ์ธ ์ปค๋ฎค๋‹ˆํ‹ฐ