์ด ๋ฌธ์์ ์๋ณธ์ ์ธ๋ถ ์ํค์์ ๊ฐ์ ธ์์ต๋๋ค.
object HelloWorld extends App { println("Hello, World!") }
1. ๊ฐ์2. ์ฃผ์ ํน์ง
2.1. ์ฌ์ด ์ธ์ด ํ์ฅ๊ณผ DSL2.2. ํธ๋ ์ดํธ(trait)2.3. ์งง์ ์์ค
3. ๊ธฐํ4. ๊ด๋ จ ๋งํฌ5. ๊ด๋ จ ๋ฌธ์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 ์ง์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. ๋ถ๋ณ์ฑ[ํธ์ง]
์ค์นผ๋ผ๋ฅผ ์ฒ์ ๋ฐฐ์ฐ๋ ์ฌ๋๋ค์ ๋์์ผ๋ก ํ๋ ๋ง์ ์์ ์์ ๋ณ์ ์ ์ธ์ ๊ธฐ๋ณธ ๋ฐฉ์์
ํ์ง๋ง ๋ณ์๊ฐ ํ๋ฒ ์ ์ธ๋ ์ดํ์ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค์ง ๋ชปํ๊ฒ ํ๋ ๊ฒ๋ง์ผ๋ก๋ ์ถฉ๋ถํ ๋ถ๋ณ์ฑ์ ์ ๊ณตํด์ฃผ์ง๋ ์๋๋ค.
์๋ฅผ ๋ค์ด,
์ ๋ถ๊ฐ๋ฅํ์ง๋ง
์ ๊ฐ๋ฅํ๋ค.[16]
์ด๋ฌํ ๊ฒฐ์ ์ ๋ณด์ํ๊ธฐ ์ํด, ์ค์นผ๋ผ์ ๋ด์ฅ ์ฝ๋ ์ ์
์ค์นผ๋ผ์์๋ ํด๋์ค ์์์๋ ๋๋๋ก์ด๋ฉด
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๋ฌธ์ ํ์ฉ์ ๋ํ ์์. 56๋ถ์ผ๋ก ๊ฝค ๊ธธ๊ณ , ์์ด์์ ์ฃผ์
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. ์๋ธํ์ดํ ์ง์์ผ๋ก ์ธํด ์ ์ญ ํ์ ์ถ๋ก ์ด ๋ถ๊ฐ๋ฅํ๊ณ , ์ง์ญ ํ์ ์ถ๋ก ๋ง์ด ๊ฐ๋ฅํ๋ค.
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)์์๋ ์ง์ ์ค๋จ์ด ์์ ๋์ด ์๋ค.
๊ทธ๋ฌ๋ ํ์ฌ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ Semi-structured Document ๋ฅผ ์ํ ์ฌ์ค์์ ํ์ค์ JSON ์ด๋ฉฐ, ์ด ๋๋ฌธ์ ์ Scala ๊ฐ XML ์ ๋ฌธ๋ฒ ์์ค์์ ์ง์ํ๋์ง ์์ํ ์ ์๋ค. ์ด์ ๋ํด ํ ๋ฐํํ์์ ๋ฐํ Scala ์ ์๋ฒ์ง Martin Odersky ๊ต์์ ๋๋ต์ "Scala ๋ฅผ ์ฒ์ ๋ง๋ค ๋น์์๋ XML ์ด ์ ๋๊ฐ ์ค ์์๋ค." ์๋ค. ์ฐธ๊ณ ๋ก 2000๋ ๋ ์ด์ค๋ฐ์๋ ์ด์ ๋ง ๋ฑ์ฅํ๋ XML ์ ๋ํ ๊ด์ฌ๊ณผ ์ด๊ธฐ๊ฐ ์ง๊ธ๊ณผ ๋ฌ๋ฆฌ ๋๋จํ์ผ๋ฏ๋ก Odersky ๊ต์๊ฐ ์ ๋ ๊ฒ ํ๋จํ ๊ฒ๋ ๋ฌด๋ฆฌ๋ ์๋๋ค.
์ค์นผ๋ผ 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 ์ํฌํธ๊ฐ ์ข์ ํธ์ด๋ค.
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์ ๊ทธ๋ฅ ์ฌ์ฉํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค.
์น ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ฉ ํ๋ ์์ํฌ๋ก 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++ ๋ฑ)์๋ ๋ฌ๋ฆฌ ์ฑ
์ด ์๋๋ผ ์น ๋ฌธ์์ด๋ค.