์ด ๋ฌธ์„œ์˜ ์›๋ณธ์€ ์™ธ๋ถ€ ์œ„ํ‚ค์—์„œ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค.
 object HelloWorld extends App {
   println("Hello, World!")
 }

1. ๊ฐœ์š”2. ์ฃผ์š” ํŠน์ง•
2.1. ์‰ฌ์šด ์–ธ์–ด ํ™•์žฅ๊ณผ DSL
2.1.1. ์—ฐ์‚ฐ์ž2.1.2. ์•”๋ฌต2.1.3. ์ด๋ฆ„์œผ๋กœ ํ‰๊ฐ€(call-by-name evaluation)
2.2. ํŠธ๋ ˆ์ดํŠธ(trait)2.3. ์งง์€ ์†Œ์Šค
2.3.1. ์ƒ์„ฑ์ž, ์ƒ์†2.3.2. ๊ฒŒํ„ฐ/์„ธํ„ฐ ์ž๋™ ์ƒ์„ฑ2.3.3. ์‹ฑ๊ธ€ํ†ค2.3.4. ํƒ€์ž… ์ถ”๋ก 2.3.5. apply2.3.6. ๊ทธ ์™ธ ํŽธ์˜ ๋ฌธ๋ฒ•
2.4. ํŒจํ„ด ๋งค์นญ
2.4.1. unapply
2.5. ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด
2.5.1. ํ•จ์ˆ˜๋Š” ๊ฐ’์ด๋‹ค2.5.2. ๋ถˆ๋ณ€์„ฑ2.5.3. for comprehension2.5.4. ํƒ€์ž…ํด๋ž˜์Šค2.5.5. ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ƒํƒœ๊ณ„2.5.6. ์Šค์นผ๋ผ์—์„œ์˜ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๋Œ€ํ•œ ํ•œ๊ณ„
2.6. ์ž๋ฐ”์™€์˜ ์ƒํ˜ธ ํ˜ธํ™˜2.7. XML ์ง€์›
3. ๊ธฐํƒ€4. ๊ด€๋ จ ๋งํฌ5. ๊ด€๋ จ ๋ฌธ์„œ

1. ๊ฐœ์š”[ํŽธ์ง‘]


๋‹ค์ค‘ํŒจ๋Ÿฌ๋‹ค์ž„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ, ๊ฐ์ฒด์ง€ํ–ฅ ์–ธ์–ด์˜ ํŠน์„ฑ๊ณผ ํ•จ์ˆ˜ํ˜• ์–ธ์–ด์˜ ํŠน์„ฑ์„ ํ•จ๊ป˜ ๊ฐ€์ง„๋‹ค. JVM ์ƒ์—์„œ ๊ตฌ๋™๋˜๊ณ  Java์™€ ์ƒํ˜ธ ํ˜ธํ™˜์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์Šค์œ„์Šค ๋กœ์ž” ์—ฐ๋ฐฉ ๊ณต๊ณผ๋Œ€ํ•™๊ต(EPFL)์˜ ๋งˆํ‹ด ์˜ค๋”์Šคํ‚ค(Martin Odersky)๊ฐ€ ๊ฐœ๋ฐœํ–ˆ๋‹ค. ํŠธ์œ„ํ„ฐ, ๋งํฌ๋“œ์ธ ๋“ฑ์˜ ๊ธฐ์—…์—์„œ ํ™œ๋ฐœํ•˜๊ฒŒ ์‚ฌ์šฉ ์ค‘์ด์ง€๋งŒ, ๋ฉ”์ด์ € ์–ธ์–ด์˜ ์ž๋ฆฌ๋Š” ์•„๋‹ˆ๋‹ค. ๋งˆ์ด๋„ˆ ์ค‘์—์„œ ๋ฉ”์ด์ €์ธ ์ •๋„.

Scala๋ผ๋Š” ๋ช…์นญ์€ ์ดํƒˆ๋ฆฌ์•„์–ด๋กœ ๊ณ„๋‹จ์„ ๋œปํ•˜๊ธฐ๋„ ํ•˜์ง€๋งŒ[1], Scalable Language์—์„œ ๋”ฐ์˜จ ๊ฒƒ์ด๊ธฐ๋„ ํ•˜๋‹ค. ํ›„์ž์˜ ์ด์œ ๋กœ scala๋Š” ํ•œ๊ตญ์—์„œ ์ด๋ฅด๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด '์Šค์นผ๋ผ (skah-lah)'๋ผ๊ณ  ์ฝ์œผ๋ผ ๋งˆํ‹ด ์˜ค๋”์Šคํ‚ค๊ฐ€ ๊ณต์ธํ–ˆ์ง€๋งŒ, ์˜์–ด๊ถŒ์—์„œ๋Š” '์Šค์ผ€์ผ๋Ÿฌ (skay-lah)' ๋ผ๊ณ  ์ž์ฃผ ๋ถ€๋ฅด๋Š” ๋ชจ์–‘์ด๋‹ค.

์—ฌ๋‹ด์œผ๋กœ, Pascal ์–ธ์–ด๋ฅผ ๋งŒ๋“  Niklaus Wirth ๊ต์ˆ˜๋Š” ETH(Eidgenรถssische Technische Hochschule) Zรผrich ์— ์žฌ์งํ•  ๋‹น์‹œ Martin Odersky๋ฅผ ์ง€๋„ํ–ˆ๊ณ , Odersky ๋Š” ์ด ์—ฐ๊ตฌ์‹ค์—์„œ ๋ฐ•์‚ฌํ•™์œ„๋ฅผ ๋ฐ›์•˜๋‹ค. ์ดํ›„ Odersky๊ฐ€ EPFL์— ๊ต์ˆ˜๋กœ ์žฌ์งํ•˜๋ฉด์„œ ํ•จ์ˆ˜ํ˜• ์–ธ์–ด์™€ ํ•จ๊ป˜ Java์˜ ๊ธฐ๋Šฅ ํ™•์žฅ์— ๋Œ€ํ•œ ์—ฐ๊ตฌ ๋„์ค‘ ํƒ„์ƒํ•œ ์–ธ์–ด๊ฐ€ Scala๋‹ค. ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ก ์„ ์ œ๋Œ€๋กœ ์—ฐ๊ตฌํ•œ ์‚ฌ๋žŒ์ด ๋งŒ๋“ค์–ด์„œ ๊ทธ๋Ÿฐ์ง€ ๋งค์šฐ ๊ฐ•๋ ฅํ•˜๋‚˜, ๊ทธ ๋งŒํผ ์ž˜ ๊ณต๋ถ€ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ƒ๊ฐ๋ณด๋‹ค ์‰ฝ์ง€ ์•Š๋‹ค.

Stack Overflow์˜ 2018๋…„ ๊ฐœ๋ฐœ์ž ์„ค๋ฌธ์— ๋”ฐ๋ฅด๋ฉด, ๋ฏธ๊ตญ์—์„œ ์–ธ์–ด๋ณ„ ํ‰๊ท  ์—ฐ๋ด‰ 1์œ„๋ผ๊ณ  ํ•œ๋‹ค. (์ „์„ธ๊ณ„ ๊ธฐ์ค€์œผ๋กœ๋Š” 7์œ„) ์–ธ์–ด๋ณ„ ์—ฐ๋ด‰ ํ•ญ๋ชฉ์ด ์ƒ๊ธด 2016๋…„ ์ด๋ž˜๋กœ ๋ฏธ๊ตญ์—์„œ๋Š” ์ญ‰ 1์œ„๋ฅผ ์œ ์ง€ํ•˜๊ณ  ์žˆ๋‹ค.

2. ์ฃผ์š” ํŠน์ง•[ํŽธ์ง‘]

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

2.1. ์‰ฌ์šด ์–ธ์–ด ํ™•์žฅ๊ณผ DSL[ํŽธ์ง‘]

์–ธ์–ด ์ด๋ฆ„์ด ๊ดœํžˆ Scalable[2] Launguage์ธ ๊ฒŒ ์•„๋‹ˆ๋‹ค. ์‰ฝ๊ฒŒ ์–ธ์–ด๋ฅผ ํ™•์žฅํ•˜์—ฌ ๋„๋ฉ”์ธ ํŠนํ™” ์–ธ์–ด(Domain Specific Launguage;DSL)์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ์Šค์นผ๋ผ์—์„œ๋Š” DSL ์ œ์ž‘์„ ์–ธ์–ด ์ฐจ์›์—์„œ ์ž‘์ •ํ•˜๊ณ  ๋ฐ€์–ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— DSL ์ œ์ž‘์ด ์ ์€ ์†Œ์Šค๋กœ๋„ ์šฉ์ดํ•˜๋ฉฐ DSL๊ณผ ์˜ค๋ฆฌ์ง€๋„ ์Šค์นผ๋ผ๋ฅผ ์„ž์–ด ์“ฐ๊ธฐ๋„ ์‰ฌ์›Œ DSL ์‚ฌ์šฉ๋„ ์–ด๋ ต์ง€ ์•Š๋‹ค[3]. DSL ์ •์˜์˜ ๋‹จ์ ์ธ ์˜ˆ๋กœ BASIC ๋ฌธ๋ฒ•์„ ์ •์˜ํ•œ BAYSICK ์ด ์žˆ๋‹ค. #

2.1.1. ์—ฐ์‚ฐ์ž[ํŽธ์ง‘]

์Šค์นผ๋ผ์—์„œ๋Š” ์ž๋ฐ”์—์„  ๋ถˆ๊ฐ€๋Šฅํ–ˆ๋˜ ์‹๋ณ„์ž๋ช…[4]์„ ์‹๋ณ„์ž์— ๋ถ™์ผ ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด +๋ผ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์ •์˜ํ•˜๋ฉด first.+(second)๊ฐ™์€ ์‹์ด ์œ ํšจํ•ด์ง„๋‹ค. ์—ฌ๊ธฐ์— ๋”ํ•ด ์Šค์นผ๋ผ์—์„  a.f(b)๋ฅผ a f b์˜ ํ˜•ํƒœ๋กœ ์“ธ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— first + second๋„ ์œ ํšจํ•˜๋‹ค. ์ด๋Ÿฐ ์‹์œผ๋กœ ์ž๋ฐ”์—์„  ๋ถˆ๊ฐ€๋Šฅํ–ˆ๋˜ ์—ฐ์‚ฐ์ž ์˜ค๋ฒ„๋กœ๋”ฉ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. [5]

2.1.2. ์•”๋ฌต[ํŽธ์ง‘]

์•”๋ฌต์ ์œผ๋กœ ์–ด๋–ค ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฅธ ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๊ฒƒ์„ ์ด์šฉํ•ด์„œ ์œ„์ž„์„ ํŽธํ•˜๊ฒŒ ๋งŒ๋“ค์–ด ์›๋ž˜ ํƒ€์ž…์— ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์• ์ดˆ์— ์žˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ž๋ฐ”์˜ BigInteger๋ฅผ ์‚ฌ์šฉํ•˜๋ ค ํ•˜๋Š”๋ฐ .add()๋“ฑ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์•”๋ฌต ๋ณ€ํ™˜์„ ์ด์šฉํ•ด์„œ ๋ณด์กฐ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๋ฉด BigInteger์— + ๋“ฑ์˜ ์—ฐ์‚ฐ์ž๋ฅผ ์ ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ๋˜ํ•œ ์•”๋ฌต์ ์œผ๋กœ ๋ฉ”์†Œ๋“œ ์ธ์ž์— ์“ฐ์ผ ๊ฐ’์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค[6]. ๋ณ„ ์ƒ๊ฐ ์—†์ด ์“ฐ๋˜ ๋ฉ”์†Œ๋“œ์˜ ์ •์˜๋ฅผ ์‚ดํŽด๋ณด๋ฉด ๋“ฃ๋„ ๋ณด๋„ ๋ชปํ•œ ์ธ์ž ๋ช‡๊ฐœ๊ฐ€ ๋ถ™์–ด์žˆ๋Š” ๊ฒƒ์„ ๊ฐ€๋” ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

2.1.3. ์ด๋ฆ„์œผ๋กœ ํ‰๊ฐ€(call-by-name evaluation)[ํŽธ์ง‘]

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

2.2. ํŠธ๋ ˆ์ดํŠธ(trait)[ํŽธ์ง‘]

์–ผํ• ๋ณด๋ฉด ํด๋ž˜์Šค๋Š” ์•„๋‹Œ๋ฐ ์ƒ์†[7]์„, ๊ทธ๊ฒƒ๋„ ์—ฌ๋Ÿฌ ๋ฒˆ ํ•  ์ˆ˜ ์žˆ๋Š” ์ ์—์„œ ์ž๋ฐ” ์ธํ„ฐํŽ˜์ด์Šค์™€ ๋น„์Šทํ•ด ๋ณด์ผ ์ˆ˜๋„ ์žˆ๋‹ค. ์‹ค์ œ๋กœ ์ž๋ฐ” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์Šค์นผ๋ผ์—์„œ๋Š” ํŠธ๋ ˆ์ดํŠธ๋กœ ์ธ์‹ํ•˜๋ฉฐ, ๊ทธ๋ƒฅ ํŠธ๋ ˆ์ดํŠธ๋ฅผ ์ž๋ฐ” ์ธํ„ฐํŽ˜์ด์Šค์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•ด๋„ ์ข‹๋‹ค. ํ•˜์ง€๋งŒ ํŠธ๋ ˆ์ดํŠธ๋Š” ์ž๋ฐ” ์ธํ„ฐํŽ˜์ด์Šค์™€๋Š” ๋‹ฌ๋ฆฌ[8] ๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„์„ ๋‹ด๊ณ  ์žˆ์œผ๋ฉฐ[9], ๋ฏน์Šค์ธ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Server extends Logger๋ผ๋Š” ํด๋ž˜์Šค๊ฐ€ ์žˆ๋‹ค๊ณ  ์ณ๋ณด์ž. Server์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค ๋•Œ, Server extends FileLogger๋ผ๊ณ  ์„ ์–ธํ•˜๋ฉด ํŒŒ์ผ๋กœ ๋กœ๊น…ํ•˜๋ฉฐ, Server extends NetworkLogger๋ผ๊ณ  ํ•˜๋ฉด ๋„คํŠธ์›Œํฌ๋กค ํ†ตํ•ด ๋กœ๊ทธ๋ฅผ ๋‚จ๊ธด๋‹ค. ์•„๋‹ˆ๋ฉด Server extends FileLogger with NetworkLogger๋ผ๊ณ  ํ•˜๋ฉด ํŒŒ์ผ๊ณผ ๋„คํŠธ์›Œํฌ์— ๋ชจ๋‘ ๋กœ๊ทธ๋ฅผ ๋‚จ๊ธธ ์ˆ˜ ์žˆ๋‹ค(๋ฌผ๋ก  ์ƒ์‘ํ•˜๋Š” FileLogger์™€ NetworkLogger๋Š” ๋ฏธ๋ฆฌ ์ž‘์„ฑํ•ด๋‘์–ด์•ผ ํ•œ๋‹ค.). ์ฆ‰ AOP๋ฅผ ์–ธ์–ด ์ฐจ์›์—์„œ ์ง€์›ํ•œ๋‹ค. ๋˜ํ•œ ์ž๋ฐ” ์ธํ„ฐํŽ˜์ด์Šค์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์€ ๋ฉ”์†Œ๋“œ๋Š” ์ƒ์†ํ•˜๋Š” ์ชฝ์—์„œ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ํŠธ๋ ˆ์ดํŠธ๋ฅผ ์ถ”์ƒ ํด๋ž˜์Šค ๊ธ‰์œผ๋กœ ๋งŒ๋“ค์–ด ๋†“๊ณ  ๋ฏน์Šค์ธ์œผ๋กœ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์ด๋Ÿฐ์‹์œผ๋กœ ์ธํ„ฐํŽ˜์ด์Šค์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ์‹ค์€ ๋ฏน์Šค์ธํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“ˆ์ด๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค. ํŠธ๋ ˆ์ดํŠธ๋ฅผ ๋ชจ๋“ˆ๋กœ ์“ฐ๊ฒŒ ๋˜๋ฉด with์œผ๋กœ ํŠธ๋ ˆ์ดํŠธ๋ฅผ ์ญ‰ ์Œ“๊ฒŒ ๋˜๋Š”๋ฐ, ์—ฌ๊ธฐ์„œ ์ฐฉ์•ˆํ•ด์„œ ์ด๋Ÿฐ ๋ฐฉ์‹์„ ์ผ€์ดํฌ ํŒจํ„ด์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

2.3. ์งง์€ ์†Œ์Šค[ํŽธ์ง‘]

์ž๋ฐ”์˜ ์žฅํ™ฉํ•จ์ด ๋งŽ์ด ๊ฐœ์„ ๋˜์—ˆ๋‹ค.

2.3.1. ์ƒ์„ฑ์ž, ์ƒ์†[ํŽธ์ง‘]

ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž, ์Šˆํผํด๋ž˜์Šค ์ƒ์†, ์Šˆํผํด๋ž˜์Šค ์ƒ์„ฑ์ž ํ˜ธ์ถœ์ด ํด๋ž˜์Šค ์„ ์–ธ๊ณผ ์œตํ•ฉ(...)๋˜์—ˆ๋‹ค. ๋ณดํ†ต class ํด๋ž˜์Šค๋ช…(์ธ์ž1,์ธ์ž2,...) extends ์Šˆํผํด๋ž˜์Šค๋ช…(์ธ์ž1, ์ธ์ž2, ...){...}์˜ ํ˜•ํƒœ๊ฐ€ ๋œ๋‹ค. ํด๋ž˜์Šค๋ช… ์˜†์˜ ์ธ์ž ๋ชฉ๋ก์€ ๊ธฐ๋ณธ ํด๋ž˜์Šค ์ƒ์„ฑ์ž์˜ ์ธ์ž ๋ชฉ๋ก์ด๋ฉฐ, ์Šˆํผํด๋ž˜์Šค๋ช… ์˜†์˜ ์ธ์ž ๋ชฉ๋ก์€ ํ˜ธ์ถœํ•  ์Šˆํผํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž์— ํ•ด๋‹นํ•˜๋Š” ์ธ์ž ๋ชฉ๋ก์ด๋‹ค. ์ด ์™ธ์— ์ƒ์„ฑ์ž๋ฅผ ์˜ค๋ฒ„๋กœ๋”ฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋ณด์กฐ ์ƒ์„ฑ์ž๋ฅผ ์ถ”๊ฐ€๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ์ž๋ฐ”์™€๋Š” ๋‹ฌ๋ฆฌ ๋ณด์กฐ ์ƒ์„ฑ์ž์˜ ์ด๋ฆ„์€ ๋ฌด์กฐ๊ฑด this์ด๋‹ค. ์œ„ ํ˜•ํƒœ์—์„œ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž์˜ ๋ณธ๋ฌธ์ด ์–ด๋””์žˆ๋‚˜ ๊ถ๊ธˆํ•  ์ˆ˜๋„ ์žˆ๋Š”๋ฐ, ํด๋ž˜์Šค ๋ณธ๋ฌธ ์ „์ฒด๊ฐ€ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž์˜ ๋ณธ๋ฌธ์ด ๋œ๋‹ค๋Š” ๊ตฌ์„ฑ์ด๋‹ค.

2.3.2. ๊ฒŒํ„ฐ/์„ธํ„ฐ ์ž๋™ ์ƒ์„ฑ[ํŽธ์ง‘]

ํ•„๋“œ๋ฅผ ์„ ์–ธํ•˜๋ฉด ๊ทธ ํ•„๋“œ์— ๋”ฐ๋ผ[10] ๋‚ด๋ถ€์ ์œผ๋กœ ๊ฒŒํ„ฐ/์„ธํ„ฐ๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค. "๊ฐ์ฒด.ํ•„๋“œ"์ด๋‚˜ "๊ฐ์ฒด.ํ•„๋“œ=๊ฐ’"์œผ๋กœ ๊ฒŒํ„ฐ์™€ ์„ธํ„ฐ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค. ์ž๋™ ์ƒ์„ฑ๋œ ๊ฒŒํ„ฐ์™€ ์„ธํ„ฐ๋Š” ๋ช…์‹œ์ ์œผ๋กœ ์˜ค๋ฒ„๋ผ์ด๋“œ ๊ฐ€๋Šฅํ•˜๋‹ค. ๋‹จ, ๋‚ด๋ถ€์ ์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” ๊ฒŒํ„ฐ/์„ธํ„ฐ๋Š” ์ž๋ฐ” ์Šคํƒ€์ผ[11]์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž๋ฐ” ์ชฝ์—์„œ ์‰ฝ๊ฒŒ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋ ค๋ฉด @BeanProperty ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

2.3.3. ์‹ฑ๊ธ€ํ†ค[ํŽธ์ง‘]

object ํ‚ค์›Œ๋“œ๋กœ ์‹ฑ๊ธ€ํ†ค ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค[12]. ๋˜ํ•œ ์Šค์นผ๋ผ์—๋Š” ์ž๋ฐ”์˜ static์— ๋Œ€์‘ํ•˜๋Š” ํ‚ค์›Œ๋“œ๊ฐ€ ์—†๊ณ  ํด๋ž˜์Šค์™€ ๊ฐ™์€ ์ด๋ฆ„์˜ ์˜ค๋ธŒ์ ํŠธ(์ปดํŒจ๋‹ˆ์–ธ ์˜ค๋ธŒ์ ํŠธ)๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ๋•Œ๋ฌธ์— ์ž๋ฐ”์—์„œ๋ผ๋ฉด ํ•œ ํด๋ž˜์Šค ์•ˆ์— ์กด์žฌํ–ˆ์„ ์ •์  ์ฝ”๋“œ์™€ ํด๋ž˜์Šค ์ฝ”๋“œ๊ฐ€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ถ„๋ฆฌ๋œ๋‹ค. ์‹ฑ๊ธ€ํ†ค์„ ์›ํด๋ฆญ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋„ ์žฅ์ ์ด์ง€๋งŒ static์„ ์ผ์ผ์ด ๋ถ™์ด์ง€ ์•Š์•„๋„ ๋˜๋Š” ๊ฒƒ๋„ ์‚ฌ์†Œํ•œ ์žฅ์ ์ด๋‹ค.

2.3.4. ํƒ€์ž… ์ถ”๋ก [ํŽธ์ง‘]

๋ณ€์ˆ˜์˜ ํƒ€์ž…, ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’์˜ ํƒ€์ž… ๋“ฑ์„ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ถ”๋ก ํ•ด์ค€๋‹ค. ๋ณ„ ๊ฑฐ ์•„๋‹Œ ๊ฒƒ ๊ฐ™์•„ ๋ณด์—ฌ๋„ ์ฝ”๋“œ ์–‘์ด ์ค„์–ด๋“œ๋Š” ๋ฐ ํฐ ๊ณต์—ฌ๋ฅผ ํ•œ๋‹ค. ์ž๋ฐ”์—์„œ Person p=new Person();์ด๋ผ๊ณ  ์ผ๋˜ ๊ฒƒ์„ ์ƒ๊ฐํ•ด๋ณด์ž.[13] ์Šค์นผ๋ผ์—์„œ๋Š” ๊ฐ™์€ ํƒ€์ž… ์ด์•ผ๊ธฐ๋ฅผ ๋‘๋ฒˆ ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค. ํ•จ์ˆ˜ ๋ฐ˜ํ™˜๊ฐ’ ์ถ”๋ก ์€ ์‚ฌ์‹ค ์˜์‹์ ์œผ๋กœ๋Š” ๊ฑฐ์˜ ์“ฐ์ด์ง€ ์•Š๋Š”๋‹ค. ์žฌ๊ท€์—์„œ๋Š” ์ถ”๋ก ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์žฌ๊ท€๊ฐ€ ์•„๋‹ˆ๋”๋ผ๋„ ํด๋ž˜์Šค์˜ public ํ•จ์ˆ˜์—์„œ๋Š” ํƒ€์ž…์„ ๋ช…์‹œํ•˜๋Š” ๊ฒŒ ๊ด€ํ–‰์ด๊ธฐ ๋•Œ๋ฌธ. ํ•จ์ˆ˜ ๋ฐ˜ํ™˜๊ฐ’ ์ถ”๋ก ์ด ๋น›์„ ๋ฐœํ•  ๋•Œ๋Š” ์ต๋ช… ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ์ด๋‹ค.

2.3.5. apply[ํŽธ์ง‘]

apply๋Š” C++์—์„œ () ์—ฐ์‚ฐ์ž๋ฅผ ์˜ค๋ฒ„๋กœ๋“œํ•˜๋Š” ๊ฒƒ์„ ๋– ์˜ฌ๋ฆฌ๋ฉด ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐฐ์—ด์„ ์ž„์˜ ์ฐธ์กฐํ•  ๋•Œ ์ž๋ฐ”๋Š” ๋ฐฐ์—ด์ด ํŠน์ˆ˜ ๊ฐ์ฒด๋กœ์„œ []์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์Šค์นผ๋ผ์—์„œ๋Š” ๋ฐฐ์—ด๋„ ๋ณดํ†ต ๊ฐ์ฒด ์ทจ๊ธ‰์„ ๋ฐ›์œผ๋ฉฐ ๋Œ€์‹  apply๊ฐ€ ๊ตฌํ˜„๋˜์–ด ์žˆ์–ด ()๋กœ ์ž„์˜ ์œ„์น˜๋ฅผ ์ฐธ์กฐ ๊ฐ€๋Šฅํ•˜๋‹ค. ๋˜ํ•œ ์ปดํŽ˜๋‹ˆ์–ธ ์˜ค๋ธŒ์ ํŠธ์— apply๋ฅผ ๊ตฌํ˜„ํ•ด๋‘๋ฉด ์ƒ์„ฑ์ž ๋Œ€์šฉ์œผ๋กœ๋„ ์“ธ ์ˆ˜ ์žˆ๋Š”๋ฐ, ๋ฐฐ์—ด ๋“ฑ์„ ์ค‘์ฒฉํ•  ๋•Œ new๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๋˜๋ฏ€๋กœ ํŽธ๋ฆฌํ•˜๋‹ค. ์‹ฌ์ง€์–ด๋Š” ์‚ฌ์‹ค ํ•จ์ˆ˜ ๊ฐ์ฒด๋„ apply๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ๋‹ค(...).

2.3.6. ๊ทธ ์™ธ ํŽธ์˜ ๋ฌธ๋ฒ•[ํŽธ์ง‘]

์ต๋ช… ํ•จ์ˆ˜์— ๋Œ€ํ•œ ํŽธ์˜ ๋ฌธ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด (a,b)=>a+b๋ผ๋Š” ์ต๋ช… ํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ณ ๋ณด์ž. ์ด๊ฒƒ๋งŒ์œผ๋กœ๋„ ์ต๋ช… ํด๋ž˜์Šค์— ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์— ๋น„ํ•ด ์ถฉ๋ถ„ํžˆ ์งง์ง€๋งŒ, _+_๋ผ๋Š” ๋‹จ ์„ธ๊ธ€์ž๋กœ, ๊ทธ๊ฒƒ๋„ ๊ฐ€๋…์„ฑ์ด ๋งค์šฐ ๋†’๊ฒŒ ์ถ•์•ฝํ•˜๋Š” ๊ฒŒ ๊ฐ€๋Šฅํ•˜๋‹ค.

2.4. ํŒจํ„ด ๋งค์นญ[ํŽธ์ง‘]

๊ตณ์ด ๋”ฐ์ง€์ž๋ฉด ์ž๋ฐ”์˜ switch~case๋ฌธ์— ๋Œ€์‘ํ•œ๋‹ค. ๊ฒ‰์œผ๋กœ ๋ณด์ด๋Š” ์ฐจ์ด์ ์€ fall-through[14]๊ฐ€ ์—†๋‹ค๋Š” ์  ์ •๋„์ง€๋งŒ, ๊ฐ€๋“œ์™€ unapply ๋ฉ”์†Œ๋“œ์™€ ์—ฐ๊ณ„๋˜์–ด switch๋ฌธ๋ณด๋‹ค ๋ณต์žกํ•˜๊ฒŒ ์‹คํ–‰๋œ๋‹ค. ์‚ฌ์‹ค์ƒ unapply๊ฐ€ ์—†์œผ๋ฉด ๋ณ„ ๊ฑฐ ์—†๋Š” ๊ทธ๋ƒฅ ์‹œ์ฒด๊ฐ€ ๋œ๋‹ค.

2.4.1. unapply[ํŽธ์ง‘]

unapply๋Š” ์ด๋ฆ„์ฒ˜๋Ÿผ apply์˜ ๋ฐ˜๋Œ€์ธ๋ฐ, apply์ฒ˜๋Ÿผ ๊ด„ํ˜ธ ์•ˆ์— ๋ชฉ๋ก์„ ์ง‘์–ด๋„ฃ์œผ๋ฉด ๊ทธ ์•ˆ์— ๊ฐ’์„ ์ง‘์–ด๋„ฃ๋Š”๋‹ค. ์ฆ‰ ๋””์ŠคํŠธ๋Ÿญ์ฒ˜๋ง(destructuring)์„ ์†์‰ฝ๊ฒŒ ํ•˜๊ฒŒ ํ•ด ์ค€๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์กฐ๊ธˆ ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ์ด๊ธฐ๋Š” ํ•˜์ง€๋งŒ, ("namu","๋‚˜๋ฌด์œ„ํ‚ค")๋ผ๋Š” ์ˆœ์„œ์Œ์ด t๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์„ ์–ธ๋˜์–ด ์žˆ์„ ๋•Œ, (key, val)=t๋ผ๊ณ  ์จ ๋„ฃ์œผ๋ฉด key์™€ val์— ๊ฐ๊ฐ "namu"์™€ "๋‚˜๋ฌด์œ„ํ‚ค"๊ฐ€ ๋“ค์–ด๊ฐ„๋‹ค. ์ด ์˜ˆ์ œ์ฒ˜๋Ÿผ ๋‹จ๋…์œผ๋กœ ์“ฐ์ผ ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ๋ณดํ†ต์€ ํŒจํ„ด ๋งค์นญ์—์„œ ๊ตฌ์กฐ๋ฅผ ๋ถ„ํ•ดํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•œ๋‹ค.

2.5. ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด[ํŽธ์ง‘]

์Šค์นผ๋ผ๋Š” ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ž˜ ์ง€์›ํ•œ๋‹ค.

2.5.1. ํ•จ์ˆ˜๋Š” ๊ฐ’์ด๋‹ค[ํŽธ์ง‘]


val increment = (i: Int) => i + 1

ํ•จ์ˆ˜ํ˜• ์–ธ์–ด์˜ ๊ธฐ๋ณธ ํŠน์ง•์ธ๋ฐ, ํ•จ์ˆ˜๋„ ์ผ๋ฐ˜์ ์œผ๋กœ '๋ฐ์ดํ„ฐ'๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” Int๋‚˜ String ํƒ€์ž…์˜ ๊ฐ’๋“ค๊ณผ ๋™์ผํ•œ ์ทจ๊ธ‰์„ ๋ฐ›๋Š”๋‹ค. ๋˜ํ•œ, ์Šค์นผ๋ผ์—์„œ ๋ชจ๋“  ๊ฐ’์€ ๊ฐ์ฒด์ด๋ฏ€๋กœ ํ•จ์ˆ˜๋„ ๊ฐ์ฒด์ด๋‹ค.[15] ์Šค์นผ๋ผ์—๋Š” ์ธ์ž์˜ ๊ฐฏ์ˆ˜์— ๋”ฐ๋ผ Function0๋ถ€ํ„ฐ Function22๊นŒ์ง€์˜ ํด๋ž˜์Šค๊ฐ€ ๊ธฐ๋ณธ์œผ๋กœ ์ •์˜๋˜์–ด ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ•จ์ˆ˜๋„ ๋‹ค๋ฅธ ๊ฐ’์ฒ˜๋Ÿผ ๋ณ€์ˆ˜์— ๋‹ด๊ธฐ๊ณ , ์ธ์ž๋กœ ๋„˜์–ด๊ฐ€๊ณ , ๊ฐ’์œผ๋กœ ๋ฐ˜ํ™˜๋  ์ˆ˜ ์žˆ๋‹ค. ํ•จ์ˆ˜ ๋ฆฌํ„ฐ๋Ÿด๋„ ์ง€์›๋œ๋‹ค. 1์ด Int ํƒ€์ž…์˜ ๋ฆฌํ„ฐ๋Ÿด์ด๊ณ  "์•ˆ๋…• ์„ธ๊ณ„!"๊ฐ€ Stringํƒ€์ž…์˜ ๋ฆฌํ„ฐ๋Ÿด์ด๋“ฏ์ด, (i: Int) => i + 1 ๋„ Function1[Int, Int]ํƒ€์ž…์˜ ๋ฆฌํ„ฐ๋Ÿด์ด๋‹ค. ์š”์ƒˆ ์ž์ฃผ ๋“ค์„ ์ˆ˜ ์žˆ๋Š” ๊ทธ ๋žŒ๋‹ค์‹ ๋งž๋‹ค.

2.5.2. ๋ถˆ๋ณ€์„ฑ[ํŽธ์ง‘]

์Šค์นผ๋ผ๋ฅผ ์ฒ˜์Œ ๋ฐฐ์šฐ๋Š” ์‚ฌ๋žŒ๋“ค์„ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ๋งŽ์€ ์„œ์ ์—์„œ ๋ณ€์ˆ˜ ์„ ์–ธ์˜ ๊ธฐ๋ณธ ๋ฐฉ์‹์€ val๋กœ ๊ฐ€๋ฅด์นœ๋‹ค. val๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ๊ทธ ๋ณ€์ˆ˜๊ฐ€ ๋”์ด์ƒ ์œ ํšจํ•˜์ง€ ์•Š๊ฒŒ ๋  ๋•Œ ๊นŒ์ง€ ๊ทธ ๊ฐ’์„ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ๋ช…๋ นํ˜• ์–ธ์–ด์—์„œ ์ž์ฃผ ๋ณด์ด๋Š” ์žฌ ๋Œ€์ž…์ด ๊ฐ€๋Šฅํ•œ ๋ณ€์ˆ˜๋Š” var๋กœ ์„ ์–ธํ•ด์•ผ ํ•œ๋‹ค.

ํ•˜์ง€๋งŒ ๋ณ€์ˆ˜๊ฐ€ ํ•œ๋ฒˆ ์„ ์–ธ๋œ ์ดํ›„์— ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค์ง€ ๋ชปํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋Š” ์ถฉ๋ถ„ํ•œ ๋ถˆ๋ณ€์„ฑ์„ ์ œ๊ณตํ•ด์ฃผ์ง€๋Š” ์•Š๋Š”๋‹ค. val๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜๋Š” ์—†์ง€๋งŒ, ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ๊ฐ์ฒด์˜ ์ƒํƒœ๊ฐ€ ๋ฐ”๋€Œ๋Š” ๊ฒƒ์€ ๋ง‰์ง€ ๋ชปํ•œ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด,

val arr = Array(1, 2, 3, 4, 5)
arr = Array(1, 2, 3) //๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒƒ์€ ๊ธˆ์ง€

์€ ๋ถˆ๊ฐ€๋Šฅํ•˜์ง€๋งŒ

val arr = Array(1, 2, 3, 4, 5)
arr(0) = 0 //๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ๊ฐ์ฒด์˜ ์ƒํƒœ๊ฐ€ ๋ฐ”๋€Œ๋Š” ๊ฒƒ์€ ํ—ˆ์šฉ

์€ ๊ฐ€๋Šฅํ•˜๋‹ค.[16]

์ด๋Ÿฌํ•œ ๊ฒฐ์ ์„ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด, ์Šค์นผ๋ผ์˜ ๋‚ด์žฅ ์ฝœ๋ ‰์…˜์€ mutable(๊ฐ€๋ณ€)๊ณผ immutable(๋ถˆ๋ณ€)์œผ๋กœ ๋‚˜๋‰˜์–ด์ ธ ์žˆ๊ณ , ๋ถˆ๋ณ€ ์ฝœ๋ ‰์…˜์—๋Š” ์›์†Œ์— ๋Œ€ํ•œ ์žฌ๋Œ€์ž…์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ๋”ฐ๋ผ์„œ ๋ณ€๊ฒฝ์„ ์œ„ํ•ด์„œ๋Š” ๋ณ€๊ฒฝ๋œ ์ƒˆ๋กœ์šด ์ฝœ๋ ‰์…˜์„ ๋ฆฌํ„ดํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ์œ„์—์„œ ๋“  ์˜ˆ์‹œ์ธ Array๋Š” ๊ฐ€๋ณ€ ์ฝœ๋ ‰์…˜์ด์ง€๋งŒ[17], ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž„ํฌํŠธ๋˜๋Š” ์Šค์นผ๋ผ์˜ ๊ณ ์œ  ์ฝœ๋ ‰์…˜๋“ค(List๋‚˜ Vector ๋“ฑ)์€ ๋ถˆ๋ณ€์ด ๊ธฐ๋ณธ๊ฐ’์ด๋‹ค.

์Šค์นผ๋ผ์—์„œ๋Š” ํด๋ž˜์Šค ์•ˆ์—์„œ๋„ ๋˜๋„๋ก์ด๋ฉด var๋ฅผ ์“ฐ์ง€ ์•Š๋„๋ก ๊ถŒ์žฅํ•œ๋‹ค.

2.5.3. for comprehension[ํŽธ์ง‘]

์Šค์นผ๋ผ์˜ for - yield๋ฌธ์€ Haskell์˜ do ์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง„ ๊ฒƒ์œผ๋กœ, ๋ฃจํ”„์™€๋Š” ์ „ํ˜€ ๋‹ค๋ฅธ ์„ฑ์งˆ์˜ ๊ฒƒ์ด๋‹ค(์Šค์นผ๋ผ๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ์—๋Š” ๊ฑฐ๋ถ€๊ฐ์„ ์ ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด for์„ ๊ฐ€์ง€๊ณ  ๋ฃจํ”„ํ•˜๋Š” ๊ฒƒ๋ถ€ํ„ฐ ๋ฐฐ์šฐ๊ธด ํ•œ๋‹ค). for - yield ๋ฌธ์€ ๋ชจ๋‚˜๋“œ๋ฅผ ์œ„ํ•œ ๋ฌธ๋ฒ•์œผ๋กœ, ์ค‘์ฒฉ๋œ flatMap๊ณผ map, ๊ทธ๋ฆฌ๊ณ  filter (์ •ํ™•ํžˆ ๋งํ•˜๋ฉด withFilter) ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ์„ ๊น”๋”ํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. ๋ชจ๋‚˜๋“œ๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋‹ค ๋ณด๋ฉด ์–ธ์–ด ๋‚ด๋ถ€์˜ ์ผ์ข…์˜ ๋ฏธ๋‹ˆ ์–ธ์–ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ  ์ž‘์„ฑํ•˜๊ฒŒ ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.

For๋ฌธ์˜ ํ™œ์šฉ์— ๋Œ€ํ•œ ์˜์ƒ. 56๋ถ„์œผ๋กœ ๊ฝค ๊ธธ๊ณ , ์˜์–ด์ž„์— ์ฃผ์˜

2.5.4. ํƒ€์ž…ํด๋ž˜์Šค[ํŽธ์ง‘]

OOP์˜ ์„œ๋ธŒํƒ€์ดํ•‘์ด ์•„๋‹ˆ๋ผ, ํƒ€์ž…ํด๋ž˜์Šค๋ฅผ ํ†ตํ•œ ๋‹คํ˜•์„ฑ์„ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ง€์›ํ•˜๋Š” ๋ช‡ ์•ˆ ๋˜๋Š” ์ •์ ํƒ€์ž… ์–ธ์–ด ์ค‘ ํ•˜๋‚˜์ด๋‹ค.[18] ์ด ์ค‘์—์„œ๋„ ์„œ๋ธŒํƒ€์ดํ•‘๊ณผ ํƒ€์ž…ํด๋ž˜์Šค๊ฐ€ ๋™์‹œ์— ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ง€์›๋˜๋Š” ์–ธ์–ด๋Š” ์Šค์นผ๋ผ๊ฐ€ ์œ ์ผํ•˜๋‹ค(์Šค์นผ๋ผ๊ฐ€ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ์ด์œ  ์ค‘ ํฐ ๋ถ€๋ถ„์„ ์ฐจ์ง€ํ•œ๋‹ค).

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

2.5.5. ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ƒํƒœ๊ณ„[ํŽธ์ง‘]

์Šค์นผ๋ผ์˜ ๋ชจ๊ธฐ์—…(?)์ธ Lightbend์˜ ๋„๊ตฌ๋“ค์ด(Play, Akka ๋“ฑ) ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์˜์—ญ๊ณผ ์ž๋ฐ”์™€์˜ ํ˜ธํ™˜์„ฑ์„ ํƒ€๊ฒŸ์œผ๋กœ ํ•œ๋‹ค๋ฉด Typelevel ํ”„๋กœ์ ํŠธ์˜ ๋„๊ตฌ๋“ค์€ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํฌํ•จํ•ด, ์Šค์นผ๋ผ ์ปดํŒŒ์ผ๋Ÿฌ์˜ ๋Šฅ๋ ฅ์„ ๊ทนํ•œ์œผ๋กœ ๋Œ์–ด๋‚ธ ํƒ€์ž… ์•ˆ์ •์„ฑ์— ์ดˆ์ ์„ ๋‘”๋‹ค. ๋”ฐ๋ผ์„œ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜๊ฒŒ ๋˜๋ฉด scalaz์™€ cats๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ž์ฃผ ๋ณด๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.

2.5.6. ์Šค์นผ๋ผ์—์„œ์˜ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๋Œ€ํ•œ ํ•œ๊ณ„[ํŽธ์ง‘]

1. JVM์ด TCO๋ฅผ ๋ฏธ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋งŽ์€ ๊ฒฝ์šฐ์— ํŠธ๋žจํด๋ฆฐ์„ ํ†ตํ•ด ์•ˆ์ •์„ฑ์„ ํ™•๋ณดํ•˜์ง€๋งŒ, ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•ด์ง€๊ณ , ์Šคํƒ์ด ์•„๋‹ˆ๋ผ ํž™์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์ƒ ์บ์‹œ๋ฏธ์Šค๊ฐ€ ํ•„์—ฐ์ ์ด๋ผ ์„ฑ๋Šฅ์ด ํ•˜๋ฝํ•œ๋‹ค.
2. ์„œ๋ธŒํƒ€์ดํ•‘ ์ง€์›์œผ๋กœ ์ธํ•ด ์ „์—ญ ํƒ€์ž…์ถ”๋ก ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ณ , ์ง€์—ญ ํƒ€์ž…์ถ”๋ก ๋งŒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
3. ํƒ€์ž…ํด๋ž˜์Šค ์ธ์ฝ”๋”ฉ์— ๋Œ€ํ•œ ์–ธ์–ด ์ž์ฒด์ ์ธ ๋‚ด์žฅ ๊ธฐ๋Šฅ์ด ์—†๋‹ค.
4. ์•”๋ฌต์ ์ธ ์š”์†Œ๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋ฉด ์ปดํŒŒ์ผ ์‹œ๊ฐ„์ด ๋Š˜์–ด๋‚œ๋‹ค.
5. Haskell๋ณด๋‹ค ํƒ€์ˆ˜๊ฐ€ ๋งŽ๋‹ค.
6. Haskell ๋“ฑ์ด ์ง€์›ํ•˜๋Š” ๋ช‡๋ช‡ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค. Kind polymorphism ๋“ฑ.[19]
7. ํ•จ์ˆ˜๋“ค์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ์ปค๋ฆฌ์ž‰(Currying)์ด ๋œ ์ƒํƒœ๊ฐ€ ์•„๋‹ˆ๋‹ค.

2.6. ์ž๋ฐ”์™€์˜ ์ƒํ˜ธ ํ˜ธํ™˜[ํŽธ์ง‘]

์Šค์นผ๋ผ์—์„œ ๋ณ„๋‹ค๋ฅธ ์ ˆ์ฐจ ์—†์ด ์ž๋ฐ” ์ฝ”๋“œ๋ฅผ 100% ๊ฐ€์ ธ๋‹ค ์“ธ ์ˆ˜ ์žˆ๋‹ค.[20] ์›ํ•˜๋Š” ์ž๋ฐ” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ์œผ๋ฉด sbt์—์„œ ๋ถˆ๋Ÿฌ์˜ค๊ฒŒ ํ•˜๋ฉด ๋œ๋‹ค. ์ž๋ฐ”์—์„œ ์Šค์นผ๋ผ ์ฝ”๋“œ๋ฅผ ๊ทธ๋Œ€๋กœ ์“ธ ์ˆœ ์—†๋Š”๋ฐ, ์ปดํŒŒ์ผ ๊ฒฐ๊ณผ๋ฌผ์€ ์ž๋ฐ” ๋ฐ”์ดํŠธ์ฝ”๋“œ์ง€๋งŒ ์Šค์นผ๋ผ์—์„œ ์ •์˜ํ•œ ์—ฐ์‚ฐ์ž, apply ๋“ฑ์„ ์ž๋ฐ”์—์„œ๋Š” (๋‹น์—ฐํžˆ) ์Šค์นผ๋ผ์—์„œ ์“ฐ๋˜ ์‹์œผ๋กœ ์“ธ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋ช…์‹œ์ ์œผ๋กœ ๋ฐ”๋€ ์ด๋ฆ„์œผ๋กœ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ธด ํ•˜์ง€๋งŒ, ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ฐ€๋…์„ฑ์ด ์•ˆ๋“œ๋กœ๋ฉ”๋‹ค๋กœ ๊ฐ€๋ฏ€๋กœ ์Šค์นผ๋ผ ์ชฝ์—์„œ ์ž๋ฐ” ์Šคํƒ€์ผ๋กœ ์ธํ„ฐํŽ˜์ด์Šค ๊ณ„์ธต์„ ๊น”์ž.

2.7. XML ์ง€์›[ํŽธ์ง‘]

XML ๋ฆฌํ„ฐ๋Ÿด์„ ์ง€์›ํ•œ๋‹ค. ์ฆ‰ XML ๋ฌธ์„œ๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๊ณ  ์‹ถ์œผ๋ฉด ์Šค์นผ๋ผ ์†Œ์Šค ๋‚ด์— XML์„ ํ•˜๋“œ์ฝ”๋”ฉํ•˜๋Š” ํ–‰์œ„๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. ๋˜ํ•œ XML ๋ฆฌํ„ฐ๋Ÿด ๋‚ด์—์„œ ์Šค์นผ๋ผ ์ฝ”๋“œ๋ฅผ ์ง‘์–ด๋„ฃ์–ด ๋™์ ์œผ๋กœ XML์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.[21] ๋˜ํ•œ XPath ํƒ์ƒ‰์„ ์ง€์›ํ•ด์„œ XML ํŒŒ์‹ฑ์ด ์‰ฝ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ํ˜„์žฌ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” Semi-structured Document ๋ฅผ ์œ„ํ•œ ์‚ฌ์‹ค์ƒ์˜ ํ‘œ์ค€์€ JSON ์ด๋ฉฐ, ์ด ๋•Œ๋ฌธ์— ์™œ Scala ๊ฐ€ XML ์„ ๋ฌธ๋ฒ• ์ˆ˜์ค€์—์„œ ์ง€์›ํ•˜๋Š”์ง€ ์˜์•„ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด์— ๋Œ€ํ•ด ํ•œ ๋ฐœํ‘œํšŒ์—์„œ ๋ฐํžŒ Scala ์˜ ์•„๋ฒ„์ง€ Martin Odersky ๊ต์ˆ˜์˜ ๋Œ€๋‹ต์€ "Scala ๋ฅผ ์ฒ˜์Œ ๋งŒ๋“ค ๋‹น์‹œ์—๋Š” XML ์ด ์ž˜ ๋‚˜๊ฐˆ ์ค„ ์•Œ์•˜๋‹ค." ์˜€๋‹ค. ์ฐธ๊ณ ๋กœ 2000๋…„๋Œ€ ์ดˆ์ค‘๋ฐ˜์—๋Š” ์ด์ œ ๋ง‰ ๋“ฑ์žฅํ–ˆ๋˜ XML ์— ๋Œ€ํ•œ ๊ด€์‹ฌ๊ณผ ์—ด๊ธฐ๊ฐ€ ์ง€๊ธˆ๊ณผ ๋‹ฌ๋ฆฌ ๋Œ€๋‹จํ–ˆ์œผ๋ฏ€๋กœ Odersky ๊ต์ˆ˜๊ฐ€ ์ €๋ ‡๊ฒŒ ํŒ๋‹จํ•œ ๊ฒƒ๋„ ๋ฌด๋ฆฌ๋Š” ์•„๋‹ˆ๋‹ค. JSX๋ฅผ ์ƒ๊ฐํ•˜๋ฉด ๊ทธ๋ ‡๊ฒŒ๊นŒ์ง€ ํ‹€๋ฆฐ๊ฒƒ๋„ ์•„๋‹ˆ๋‹ค

์Šค์นผ๋ผ 3(Dotty)์—์„œ๋Š” ์ง€์› ์ค‘๋‹จ์ด ์˜ˆ์ •๋˜์–ด ์žˆ๋‹ค.

3. ๊ธฐํƒ€[ํŽธ์ง‘]

์ปดํŒŒ์ผ ์–ธ์–ด[22]์ด๋ฉฐ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๊ฐ€ ๋”ฐ๋กœ ์žˆ๋Š” ๊ฒƒ๋„ ์•„๋‹Œ๋ฐ๋„ REPL[23]์„ ์ง€์›ํ•œ๋‹ค. ์›๋ฆฌ๊ฐ€ ๋ญ”๊ฐ€ ํ•˜๋ฉด ์ž…๋ ฅโ†’์ปดํŒŒ์ผโ†’์‹คํ–‰โ†’์ถœ๋ ฅ์˜ ๊ณผ์ •์„ ๊ฑฐ์นœ๋‹ค. (์‚ฌ์‹ค REPL์˜ ์›์กฐ์ธ LISP ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋„ ์ด๋ ‡๊ฒŒ ๋™์ž‘ํ•œ๋‹ค) ์Šค์นผ๋ผ๋Š” ๊ทธ๋ ‡๊ฒŒ ๋А๋ฆฐ ํŽธ์€ ์•„๋‹ˆ๋ผ ์ปดํŒŒ์ผ๊นŒ์ง€ ํ•ด๋„ ์›ฌ๋งŒํผ ๊ธด ์†Œ์Šค๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด(์‚ฌ์‹ค ๊ทธ๋งŒํผ ๊ธด ์†Œ์Šค๋ฅผ REPL์— ๋„ฃ๋Š” ๊ฒŒ ์ด์ƒํ•˜์ง€๋งŒ) ์ฒด๊ฐ๋˜์ง„ ์•Š์ง€๋งŒ, ์ด ๋•Œ๋ฌธ์— ์›น์ด๋‚˜ ์•ˆ๋“œ๋กœ์ด๋“œ ๋“ฑ์œผ๋กœ ์Šค์นผ๋ผ REPL์„ ํฌํŒ…ํ•˜๊ธฐ๋Š” ๋งค์šฐ ๊ท€์ฐฎ๋‹ค์–ด๋ ต๋‹ค. ๋ผ์ด๋ฒŒ(?) ์–ธ์–ด์ธ Clojure๋Š” ํƒœ์ƒ์ด ์Šคํฌ๋ฆฝํŠธ ์–ธ์–ด๋ผ ์•ˆ๋“œ๋กœ์ด๋“œ REPL๊นŒ์ง€ ๋‚˜์˜ค๋Š”๋ฐ๋„ ์Šค์นผ๋ผ๋Š” ์†Œ์‹์ด ์—†๋‹ค.[24]

IDE๋Š” ์ดํด๋ฆฝ์Šค[25]์™€ ์ดํด๋ฆฝ์Šค ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐœ๋ฐœ๋œ ScalaIDE๊ฐ€ ์žˆ์ง€๋งŒ, Scala ์ง€์›์„ ์ •์‹์œผ๋กœ ํ•ด์ฃผ๋Š” IntelliJ IDEA์˜ ์‚ฌ์šฉ๋„๊ฐ€ ๋” ๋†’๋‹ค.[26] ์• ์ดˆ์— ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€์—์„œ๋ถ€ํ„ฐ IntelliJ๋ฅผ ๊ถŒ์žฅํ•˜๊ณ  ์žˆ๋‹ค. ์ž๋ฐ”์˜ ์žฅํ™ฉํ•จ์ด ๋งŽ์ด ๊ฐœ์„ ๋˜์—ˆ๋‹ค์ง€๋งŒ import ๋ชฉ๋ก์€ ๋ฒ„ํ‹ธ ์ˆ˜๊ฐ€ ์—†์œผ๋‹ˆ ๋‚ ์ฝ”๋”ฉ์€ ์ถ”์ฒœํ•˜์ง€ ์•Š๋Š”๋‹ค. ํ…์ŠคํŠธ ์—๋””ํ„ฐ์—์„œ ์ž‘์—…ํ•˜๋ ค๋ฉด Metals๋ฅผ ํ™œ์šฉํ•ด๋ณด์ž. Metals๋Š” ๋ฒ ํƒ€ ๋ฒ„์ „์˜ LSP ์„œ๋ฒ„ ๊ตฌํ˜„์ฒด์ธ๋ฐ, ์‹ค ์‚ฌ์šฉ์— ํฐ ์ง€์žฅ์ด ์—†์„ ์ •๋„๋กœ๊นŒ์ง€ ๊ฐœ์„ ๋˜์—ˆ๋‹ค. Metals๋ฅผ ํ†ตํ•œ VSCode๋‚˜ Vim ์„œํฌํŠธ๊ฐ€ ์ข‹์€ ํŽธ์ด๋‹ค.
๋นŒ๋“œ ํˆด์€ Ant, Maven, Gradle์ด ์‚ผ๋ถ„ํ•˜๊ณ  ์žˆ๋Š” ์ž๋ฐ”์™€๋Š” ๋‹ฌ๋ฆฌ sbt๊ฐ€ ์‚ฌ์‹ค์ƒ ํ‘œ์ค€์ด๋ฉฐ, ๋‚˜๋จธ์ง€ ์ž๋ฆฌ๋Š” Maven๊ณผ Gradle์ด ์กฐ๊ธˆ์”ฉ ์ฐจ์ง€ํ•˜๊ณ  ์žˆ๋‹ค. ์›ฌ๋งŒํ•œ ์Šค์นผ๋ผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜ ๊ฐ€์ด๋“œ์—” ๋Œ€๋ถ€๋ถ„ sbt์—์„œ ์„ค์น˜ํ•˜๋Š” ๋ฒ•์ด ํฌํ•จ๋˜์–ด ์žˆ๋‹ค. build.sbt ํŒŒ์ผ์— ๋นŒ๋“œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š”๋ฐ, ์‚ฌ์‹ค sbt ํŒŒ์ผ๋„ ์•ฝ๊ฐ„์˜ ์•”๋ฌต์ ์ธ ์ •์˜๊ฐ€ ๋“ค์–ด๊ฐ„ ์Šค์นผ๋ผ DSL์ด๊ธฐ ๋•Œ๋ฌธ์— ์Šค์นผ๋ผ ์ฝ”๋“œ์˜ ๋Œ€๋ถ€๋ถ„์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ๋Œ€์‹  build.sbt ๋Œ€์‹  build.scala์„ ์“ด๋‹ค๋ฉด ์จ์•ผ ํ•  ์–‘์ด ๋Š˜์–ด๋‚˜์ง€๋งŒ ์ผ๋ฐ˜ ์Šค์นผ๋ผ ์ฝ”๋“œ์™€ ์™„์ „ ๋™์ผํ•˜๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์šฉ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ Play ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์žˆ๋‹ค. Play๋Š” ๋งŽ์€ ๊ธฐ์—…๋“ค์—๊ฒŒ ์ฑ„ํƒ๋˜์–ด ์•ˆ์ •์„ฑ์„ ์ž…์ฆ๋ฐ›์€ ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค.

ํ…Œ์ŠคํŒ… ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ScalaTest๊ฐ€ ํญ๋„“์€ ํ…Œ์ŠคํŠธ ์„ ํƒํญ[27]์œผ๋กœ ์ธํ•ด ๋„๋ฆฌ ์“ฐ์ธ๋‹ค. ScalaTest ์™ธ์—๋„ Spec2, Scalacheck ๋“ฑ์˜ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์žˆ๋‹ค. JUnit์„ ๊ทธ๋ƒฅ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

4. ๊ด€๋ จ ๋งํฌ[ํŽธ์ง‘]

5. ๊ด€๋ จ ๋ฌธ์„œ[ํŽธ์ง‘]

[1] ๋” ๋‚˜์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ ๋‚˜์•„๊ฐ€๋Š” ๊ณ„๋‹จ์˜ ์—ญํ• ์„ ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค. ๋ฌธ์„œ ์ƒ๋‹จ์˜ ๊ณต์‹ ๋กœ๊ณ ๋„ ๋กœ์ž” ์—ฐ๋ฐฉ ๊ณต๊ณผ๋Œ€ํ•™๊ต์˜, Scala๊ฐ€ ๊ฐœ๋ฐœ๋œ ๊ณณ์— ์žˆ๋Š” ๋‚˜์„ ํ˜• ๊ณ„๋‹จ์„ ํ˜•์ƒํ™”ํ•œ ๊ฒƒ์ด๋‹ค. #
[2] ํ™•์žฅ์ด ์šฉ์ดํ•œ
[3] ๋‹จ ์—ฐ์‚ฐ์ž ์šฐ์„ ์ˆœ์œ„ ๋ฌธ์ œ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ DSL ์ œ์ž‘ ์‹œ์— ๋ชจ์–‘ ์ข‹์•„๋ณด์ด๋Š” ๊ฒƒ๋งŒ ๊ณ ๋ฅด์ง€ ๋ง๊ณ  ์ ์ ˆํ•œ ์—ฐ์‚ฐ์ž๋ฅผ ๊ณจ๋ผ์•ผ ํ•œ๋‹ค.
[4] +,% ๋“ฑ.
[5] ++์™€ --๊ฐ€ ์Šค์นผ๋ผ์—๋Š” ์—†๋Š”๋ฐ, ์ด ๊ทœ์น™์˜ ์ผ๊ด€์„ฑ์„ ์œ„ํ•ด์„œ๋‹ค. ๊ฒจ์šฐ ํ•œ๊ธ€์ž ๋œ ํƒ€์ดํ•‘ํ•˜์ž๊ณ  ์˜ˆ์™ธ ์กฐํ•ญ์„ ๋งŒ๋“ค๊ธฐ๋Š” ์‹ซ์—ˆ๋‹ค๋Š” ๋“ฏ. ์‹ค์ œ๋กœ C++์—์„œ๋Š” ++/--์˜ ์˜ค๋ฒ„๋กœ๋”ฉ์ด ๊ฐ€๋Šฅํ•œ๋ฐ, ์ข€ ๋ณต์žกํ•˜๋‹ค. ์–ด์ฐจํ”ผ ํ•จ์ˆ˜ํ˜• ์„ฑ๊ฒฉ์ด ๊ฐ•ํ•ด์„œ ๊ณ ์ „์ ์ธ ๋ฃจํ”„๋ฌธ์„ ์“ธ ์ผ์ด ์ ์œผ๋ฏ€๋กœ ++/--์˜ ๋ถ€์žฌ๊ฐ€ ํฌ๊ฒŒ ๋А๊ปด์ง€์ง„ ์•Š์„ ๊ฒƒ์ด๋‹ค.
[6] ๋””ํดํŠธ ์ธ์ž์™€๋Š” ๋‹ค๋ฅด๋‹ค. ๋””ํดํŠธ ์ธ์ž๋Š” ๋ฉ”์†Œ๋“œ ์ •์˜์—์„œ ๊ฐ’์„ ์จ ๋†“๋Š” ๋ฐ˜๋ฉด ์•”๋ฌต ์ธ์ž๋Š” ๋ฉ”์†Œ๋“œ ์ •์˜์—์„  ์•”๋ฌต ์ธ์ž๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์„ ์–ธ๋งŒ ํ•˜๊ณ , ์™ธ๋ถ€ ๋ฒ”์œ„์—์„œ ๊ฐ’์„ ๋ฐ›์•„์˜จ๋‹ค
[7] ์ž๋ฐ”์™€๋Š” ๋‹ฌ๋ฆฌ, ์Šค์นผ๋ผ์—์„œ๋Š” ํŠธ๋ ˆ์ดํŠธ๋„ ๊ทธ๋ƒฅ extends ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
[8] ์ž๋ฐ” 7๊นŒ์ง€ ํ•œ์ •
[9] ๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„์ด ์žˆ๋Š”๋ฐ ๋‹ค์ค‘์ƒ์†์ด ๊ฐ€๋Šฅํ•˜๋ฉด ๋‹ค์ด์•„๋ชฌ๋“œ ๋ฌธ์ œ๊ฐ€ ์ผ์–ด๋‚  ์ง€๋„ ๋ชจ๋ฅธ๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ํŠธ๋ ˆ์ดํŠธ๋ฅผ ๋ฏน์Šค์ธํ•˜๋Š” ์ˆœ์„œ์— ๋”ฐ๋ผ ํ˜ธ์ถœ ๋ฉ”์†Œ๋“œ๊ฐ€ ๊ฒฐ์ •๋˜๋ฏ€๋กœ ๋ฌธ์ œ๋Š” ์—†๋‹ค.
[10] ์ˆ˜์ • ๋ถˆ๊ฐ€๋Šฅํ•œ val์ผ ๊ฒฝ์šฐ ์„ธํ„ฐ๋Š” ์ƒ์„ฑ๋˜์ง€ ์•Š๋Š”๋‹ค.
[11] ์ •ํ™•ํžˆ๋Š” ์ž๋ฐ”๋นˆ์ฆˆ ์Šคํƒ€์ผ. getXXX๋‚˜ setXXX ๊ผด์„ ๋งํ•œ๋‹ค.
[12] ๋ฌธ์„œ ์ƒ๋‹จ์˜ ์˜ˆ์ œ๊ฐ€ ๋ฐ”๋กœ ์ด ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
[13] ์ž๋ฐ” 10๋ถ€ํ„ฐ๋Š” var ํ‚ค์›Œ๋“œ๋กœ ํƒ€์ž… ์ถ”๋ก ์ด ๊ฐ€๋Šฅํ•ด์กŒ๋‹ค.
[14] case์—์„œ break;๊ฐ€ ์—†์œผ๋ฉด ๋‹ค์Œ case๋กœ ๋„˜์–ด๊ฐ€๋Š” ๊ฒƒ
[15] ์ฃผ์˜ํ•  ์ ์€ ๋ฉ”์†Œ๋“œ๋Š” ๊ฐ์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ. ์Šค์นผ๋ผ ๋‚ด์—์„œ๋Š” ๋ฉ”์†Œ๋“œ์™€ ํ•จ์ˆ˜๋Š” ์ „ํ˜€ ๋‹ค๋ฅธ ๊ฒƒ์ด๊ณ , Eta-expansion์„ ํ†ตํ•ด ๋ฉ”์†Œ๋“œ๊ฐ€ ํ•จ์ˆ˜๋กœ ๋ณ€ํ™˜๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์ง€๋งŒ ๋ณธ์งˆ์ ์ธ ์ฐจ์ด๋ฅผ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋ฉด ์ปดํŒŒ์ผ ์—๋Ÿฌ๋ฅผ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ์ž์„ธํ•œ ๊ฒƒ์€ ์—ฌ๊ธฐ ์ฐธ์กฐ.
[16] ์ด ๋ถ€๋ถ„์€ C++์˜ const์™€๋Š” ๋‹ค๋ฅด๊ณ , Java์˜ final๊ณผ ๋น„์Šทํ•˜๋‹ค.
[17] ์ž๋ฐ”์™€์˜ ์ƒํ˜ธํ˜ธํ™˜์„ ์œ„ํ•œ ๊ฒƒ
[18] ๋‹ค๋ฅธ ์–ธ์–ด๋กœ๋Š” Haskell, Rust ๋“ฑ์ด ์žˆ๋‹ค
[19] ์˜ˆ๋ฅผ ๋“ค๋ฉด TypeTag์˜ ํ‘œํ˜„์ด ์žˆ๋‹ค. TypeTag[int\] ์™€ TypeTag[list\] ๋ชจ๋‘ ์Šค์นผ๋ผ์— ์กด์žฌํ•˜์ง€๋งŒ ์ „์ž๋Š” Kind * โ†’ *, ํ›„์ž๋Š” Kind (* โ†’ *) โ†’ * ์ด๊ธฐ ๋•Œ๋ฌธ์— ์—„์—ฐํžˆ ๋‹ค๋ฅด๋‚˜, ํ˜„์žฌ ์Šค์นผ๋ผ์˜ ๋ฌธ๋ฒ•์œผ๋กœ๋Š” ์ด ๋‘˜์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌ๋ถ„/ํ‘œํ˜„ํ•ด๋‚ผ ๋ฐฉ๋ฒ•์ด ์—†๋‹ค. Dotty์—์„œ `AnyKind`๋ผ๋Š” ์ƒˆ๋กœ์šด ํƒ€์ž…์ด ์ถ”๊ฐ€๋  ์˜ˆ์ •.
[20] ๋ฌผ๋ก  ์ž๋ฐ” ์Šคํƒ€์ผ๋กœ. ์Šค์นผ๋ผ ์Šคํƒ€์ผ๋กœ ์ž๋ฐ” ์ฝ”๋“œ๋ฅผ ์“ฐ๊ณ  ์‹ถ๋‹ค๋ฉด ์ž‘์€ DSL์„ ๊ตฌ์ถ•ํ•˜๋ฉด ๋œ๋‹ค.
[21] XML ๋ฆฌํ„ฐ๋Ÿด ๋‚ด์— ์žˆ๋Š” ์Šค์นผ๋ผ ์ฝ”๋“œ ์•ˆ์— XML ๋ฆฌํ„ฐ๋Ÿด์„ ์ง‘์–ด๋„ฃ๊ณ ...ํ•˜๋Š” ๋ฌดํ•œ ๋ฃจํ”„๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.
[22] ๋ฌผ๋ก  ์ž๋ฐ” ๋ฐ”์ดํŠธ์ฝ”๋“œ๋กœ
[23] Read-Eval-Print-Loop. ์ž…๋ ฅ๋ฐ›์€ ๊ฒƒ์„ ์ฝ์€ ํ›„ ํ‰๊ฐ€(์‹คํ–‰)ํ•ด์„œ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์„ ๋ฐ˜๋ณตํ•˜๋Š” ์ž‘์—….
[24] ๋‹ค๋งŒ ์Šค์นผ๋ผ๊ฐ€ ์ด๋Ÿฐ ์ •์‹ ๋‚˜๊ฐ„ ์ง“์„ ํ•œ ๋•๋ถ„์— ์ž๋ฐ” 9์—์„œ๋„ JShell์ด๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ REPL์ด ์ถ”๊ฐ€๋  ์˜ˆ์ •์ด๋ฏ€๋กœ, ์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ๋„ ๋ณผ ์ˆ˜ ์žˆ์„์ง€๋„ ๋ชจ๋ฅธ๋‹ค.
[25] ๋ฌผ๋ก  ํ”Œ๋Ÿฌ๊ทธ์ธ ํ•„์š”
[26] JDK๋งŒ ๋ฏธ๋ฆฌ ์„ค์น˜๋˜์–ด ์žˆ์œผ๋ฉด ๋‚˜๋จธ์ง€ ํˆด์€ ๋ฒˆ๋“ค๋กœ ์„ค์น˜๋œ๋‹ค.
[27] ๊ธฐ๋ณธ์ ์œผ๋กœ BDD์ด๋ฉฐ, JUnit์‹ ํ…Œ์ŠคํŠธ๋ถ€ํ„ฐ spec์‹ ํ…Œ์ŠคํŠธ๊นŒ์ง€ ๋‹ค์–‘ํ•œ ํ…Œ์ŠคํŠธ ์Šคํƒ€์ผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
[28] ํ•œ๊ตญ์–ด ๋ฒˆ์—ญ
[29] ํŠธ์œ„ํ„ฐ ์‚ฌ ์ œ์ž‘.
[30] ์—ญ์‹œ ํŠธ์œ„ํ„ฐ ์‚ฌ์—์„œ ์ œ์ž‘ํ–ˆ๋‹ค. ๋‹ค๋ฅธ ์ดํŽ™ํ‹ฐ๋ธŒ ์‹œ๋ฆฌ์ฆˆ(์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”, ์ดํŽ™ํ‹ฐ๋ธŒ C++ ๋“ฑ)์™€๋Š” ๋‹ฌ๋ฆฌ ์ฑ…์ด ์•„๋‹ˆ๋ผ ์›น ๋ฌธ์„œ์ด๋‹ค.