Michel Schinz, Philipp Haller ์ง์. ์ดํฌ์ข ([email protected]) ์ฎ๊น.
์์ํ๋ฉด์
์ด ๋ฌธ์๋ Scala ์ธ์ด์ ๊ทธ ์ปดํ์ผ๋ฌ์ ๋ํด ๊ฐ๋จํ ์๊ฐํ๋ค. ์ด๋ ์ ๋์ ํ๋ก๊ทธ๋๋ฐ ๊ฒฝํ์ด ์์ผ๋ฉฐ Scala๋ฅผ ํตํด ๋ฌด์์ ํ ์ ์๋์ง๋ฅผ ๋น ๋ฅด๊ฒ ๋ฐฐ์ฐ๊ณ ์ถ์ ์ฌ๋๋ค์ ์ํด ๋ง๋ค์ด ์ก๋ค. ์ฌ๊ธฐ์๋ ๋ ์๊ฐ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ, ํนํ Java์ ๋ํ ์ง์์ ๊ฐ์ง๊ณ ์๋ค๊ณ ๊ฐ์ ํ๋ค.
์ฒซ ๋ฒ์งธ ์์
์ฒซ๋ฒ์งธ ์์ ๋ก ํํ ์ฐ์ด๋ Hello world ํ๋ก๊ทธ๋จ์ ์ฌ์ฉํ์. ์ด ํ๋ก๊ทธ๋จ์ ๊ทธ๋ค์ง ๋ฉ์ง์ง๋ ์์ง๋ง ์ธ์ด์ ๋ํ ๋ง์ ์ง์ ์์ด๋ Scala ์ธ์ด๋ฅผ ๋ค๋ฃจ๋๋ฐ ํ์ํ ๋๊ตฌ๋ค์ ์ฌ์ฉ๋ฒ์ ์ฝ๊ฒ ๋ณด์ฌ ์ค ์ ์๋ค. ์๋๋ฅผ ๋ณด์:
object HelloWorld {
def main(args: Array[String]): Unit = {
println("Hello, world!")
}
}
์๋ฐ ํ๋ก๊ทธ๋๋จธ๋ค์ ์ด ํ๋ก๊ทธ๋จ์ ๊ตฌ์กฐ๊ฐ ์ต์ ํ ๊ฒ์ด๋ค.
ํ๋ก๊ทธ๋จ์ ๋ฌธ์์ด ๋ฐฐ์ด ํ์
์ ๋ช
๋ น์ค ์ธ์๋ฅผ ๋ฐ๋ ์ด๋ฆ์ด main
์ธ
ํจ์ ํ๋๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ์ด ํจ์์ ๊ตฌํ์ ํ๋์ ๋ ๋ค๋ฅธ ํจ์ ํธ์ถ๋ก
์ด๋ฃจ์ด์ ธ ์๋๋ฐ ๋ฏธ๋ฆฌ ์ ์ ๋ ํจ์ println
์ ์ด๋์ ๊ฐ ๋ง์ด ๋ณธ
๋ฐ๋ก ๊ทธ ํ์ ๋ฉ์์ง๋ฅผ ๋๊ฒจ์ฃผ์ด ํธ์ถ ํ๋ค. main
ํจ์๋ ๊ฐ์ ๋๋ ค์ฃผ์ง
์๊ธฐ ๋๋ฌธ์ ๋ฆฌํด ํ์
์ ์ ์ธ ํ ํ์๊ฐ ์๋ค.
์๋ฐ ํ๋ก๊ทธ๋๋จธ๋ค์๊ฒ ์ต์ํ์ง ์์ ๋ถ๋ถ์ main
ํจ์๋ฅผ ๊ฐ์ธ๊ณ
์๋ object
์ ์ธ์ผ ๊ฒ์ด๋ค. ์ด ์ ์ธ์ ์ฑ๊ธํด ๊ฐ์ฒด๋ฅผ ์์ฑํ๋๋ฐ,
์ด๋ ํ๋์ ์ธ์คํด์ค๋ง์ ๊ฐ์ง๋ ํด๋์ค๋ผ ํ ์ ์๋ค. ๋ฐ๋ผ์ ์์ ์ ์ธ์
HelloWorld
๋ผ๋ ํด๋์ค์ ์ญ์ HelloWorld
๋ผ๊ณ ์ด๋ฆ
๋ถ์ธ ์ด ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ํจ๊ป ์ ์ ํ๋ ๊ฒ์ด๋ค. ์ด ์ธ์คํด์ค๋ ์ฒ์
์ฌ์ฉ ๋ ๋์ ํ์์ ๋ฐ๋ผ ๋ง๋ค์ด ์ง๋ค.
๋๋ํ ๋
์๋ค์ ์ด๋ฏธ ๋์น์ฑ๊ฒ ์ง๋ง ์์ ์์ ์์ main
ํจ์๋
static
์ด ์๋๋ค. Scala์๋ ์ ์ ๋ฉค๋ฒ(ํจ์๋ ํ๋๋ )๋ผ๋ ๊ฐ๋
์ด
์์ ์กด์ฌํ์ง ์๋๋ค. ํด๋์ค์ ์ผ๋ถ๋ก ์ ์ ๋ฉค๋ฒ๋ฅผ ์ ์ํ๋ ๋์ ์ Scala
ํ๋ก๊ทธ๋๋จธ๋ค์ ์ ์ ์ด๊ธฐ ์ํ๋ ๋ฉค๋ฒ๋ค์ ์ฑ๊ธํด ๊ฐ์ฒด์์ ์ ์ธํ๋ค.
์์ ๋ฅผ ์ปดํ์ผ ํ๊ธฐ
์์ ๋ฅผ ์ปดํ์ผ ํ๊ธฐ ์ํ์ฌ Scala ์ปดํ์ผ๋ฌ์ธ scalac
๋ฅผ ์ฌ์ฉํ๋ค.
scalac
๋ ๋๋ถ๋ถ์ ์ปดํ์ผ๋ฌ๋ค๊ณผ ๋น์ทํ๊ฒ ๋์ํ๋ค. ์์คํ์ผ๊ณผ ํ์์
๋ฐ๋ผ ๋ช๊ฐ์ ์ต์
๋ค์ ์ธ์๋ก ๋ฐ์ ํ๊ฐ ๋๋ ์ฌ๋ฌ๊ฐ์ ์ค๋ธ์ ํธ ํ์ผ์
์์ฑํ๋ค. scalac
๊ฐ ์์ฑํ๋ ์ค๋ธ์ ํธ ํ์ผ์ ํ์ค์ ์ธ Java ํด๋์ค
ํ์ผ์ด๋ค.
์์ ์์ ํ๋ก๊ทธ๋จ์ HelloWorld.scala
๋ผ๋ ์ด๋ฆ์ผ๋ก ์ ์ฅํ๋ค๋ฉด,
์๋์ ๋ช
๋ น์ผ๋ก ์ปดํ์ผ ํ ์ ์๋ค (๋ถ๋ฑํธ >
๋ ์ ํ๋กฌํํธ์ด๋ฏ๋ก
ํจ๊ป ์
๋ ฅํ์ง ๋ง๊ฒ) :
> scalac HelloWorld.scala
์ด์ ํ์ฌ ๋๋ ํ ๋ฆฌ์ ๋ช๊ฐ์ ํด๋์ค ํ์ผ์ด ์์ฑ๋๋ ๊ฒ์ ํ์ธ ํ ์ ์๋ค.
๊ทธ ์ค์ ํ๋๋ HelloWorld.class
์ด๋ฉฐ scala
๋ช
๋ น์ ํตํด ๋ฐ๋ก ์คํ
๊ฐ๋ฅํ ํด๋์ค๋ฅผ ํฌํจํ๊ณ ์๋ค. ๋ค์ ์ฅ์ ๋ณด์.
์์ ๋ฅผ ์คํํ๊ธฐ
์ผ๋จ ์ปดํ์ผ ๋๋ฉด Scala ํ๋ก๊ทธ๋จ์ scala
๋ช
๋ น์ ํตํด ์คํ ํ ์ ์๋ค.
์ฌ์ฉ๋ฒ์ Java ํ๋ก๊ทธ๋จ์ ์คํ ํ ๋ ์ฌ์ฉํ๋ java
๋ช
๋ น๊ณผ ๋งค์ฐ ๋น์ทํ๋ฉฐ
๋์ผํ ์ต์
์ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค. ์์ ์์ ๋ ์๋์ ๋ช
๋ น์ผ๋ก ์คํ ํ ์ ์์ผ๋ฉฐ
์์ํ๋๋ก์ ๊ฒฐ๊ณผ๊ฐ ๋์จ๋ค.
> scala -classpath . HelloWorld
Hello, world!
์๋ฐ์ ํจ๊ป ์ฌ์ฉํ๊ธฐ
Scala์ ์ฅ์ ์ค ํ๋๋ Java ์ฝ๋์ ํจ๊ป ์ฌ์ฉํ๊ธฐ ์ฝ๋ค๋ ๊ฒ์ด๋ค.
์ฌ์ฉํ๊ณ ์ถ์ Java ํด๋์ค๋ฅผ ๊ฐ๋จํ ์ํฌํธ ํ๋ฉด ๋๋ฉฐ, java.lang
ํจํค์ง์ ๋ชจ๋ ํด๋์ค๋ ์ํฌํธ ํ์ง ์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉ ํ ์ ์๋ค.
์๋๋ Scala๊ฐ Java์ ์ผ๋ง๋ ์ ์ด์ธ๋ฆฌ๋์ง๋ฅผ ๋ณด์ฌ์ฃผ๋ ์์ ์ด๋ค. ์ฐ๋ฆฌ๋ ์๋ ์์ ์์ ํ์ฌ์ ๋ ์ง๋ฅผ ๊ตฌํ์ฌ ํน์ ๊ตญ๊ฐ์์ ์ฌ์ฉํ๋ ํ์์ผ๋ก ๋ณํ ํ ๊ฒ์ด๋ค. ์ด๋ฅผํ ๋ฉด ํ๋์ค(๋ถ์ด๋ฅผ ์ฌ์ฉํ๋ ์ค์์ค์ ์ผ๋ถ ์ง์ญ๋ ๋์ผํ ํ์์ ์ฌ์ฉํ๋ค)๋ผ ํ์.
Java์ ํด๋์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ Date
์ DateFormat
๊ณผ ๊ฐ์
๊ฐ๋ ฅํ ์ ํธ๋ฆฌํฐ ํด๋์ค๋ฅผ ๊ฐ์ง๊ณ ์๋ค. Scala๋ Java์ ์์ฐ์ค๋ฝ๊ฒ
์๋ก๋ฅผ ํธ์ถ ํ ์ ์์ผ๋ฏ๋ก, ๋์ผํ ์ญํ ์ ํ๋ Scala ํด๋์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ
๊ตฌํํ๊ธฐ ๋ณด๋ค๋ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๊ธฐ๋ฅ์ ๊ฐ์ง Java ํจํค์ง๋ฅผ ๊ฐ๋จํ ์ํฌํธํ์ฌ
์ด์ฉํ์.
import java.util.{Date, Locale}
import java.text.DateFormat._
object FrenchDate {
def main(args: Array[String]): Unit = {
val now = new Date
val df = getDateInstance(LONG, Locale.FRANCE)
println(df format now)
}
}
Scala์ ์ํฌํธ ๊ตฌ๋ฌธ์ Java์ ๊ทธ๊ฒ๊ณผ ๋งค์ฐ ๋น์ทํด ๋ณด์ด์ง๋ง ์ฌ์ค ์ข ๋
๊ฐ๋ ฅํ๋ค. ์ ์์ ์ ์ฒซ๋ฒ์งธ ์ค๊ณผ ๊ฐ์ด ์ค๊ดํธ๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ์ ํจํค์ง์์
์ฌ๋ฌ๊ฐ์ ํด๋์ค๋ฅผ ์ ํ์ ์ผ๋ก ๋ถ๋ฌ ์ฌ ์ ์๋ค. Scala ์ํฌํธ ๊ตฌ๋ฌธ์
๋ ํ๊ฐ์ง ํน์ง์ ํจํค์ง๋ ํด๋์ค์ ์ํ ๋ชจ๋ ์ด๋ฆ๋ค์ ๋ถ๋ฌ ์ฌ ๊ฒฝ์ฐ
๋ณํ(*
) ๋์ ๋ฐ์ค(_
) ์ ์ฌ์ฉ ํ๋ค๋ ๊ฒ์ด๋ค. ๋ณํ๋ Scala์์
ํฉ๋ฒ์ ์ธ ์๋ณ์(ํจ์๋ช
๋ฑ์ ์ฌ์ฉ ๊ฐ๋ฅํ)๋ก ์ฌ์ฉ๋๋ค. ๋์ค์ ์์ธํ ์ดํด
๋ณผ ๊ฒ์ด๋ค.
๋ฐ๋ผ์ ๋๋ฒ์งธ ์ค์ ์ํฌํธ ๊ตฌ๋ฌธ์ DateFormat
ํด๋์ค์ ๋ชจ๋ ๋ฉค๋ฒ๋ฅผ
๋ถ๋ฌ์จ๋ค. ์ด๋ ๊ฒ ํจ์ผ๋ก์จ ์ ์ ํจ์ getDateInstance
์ ์ ์ ํ๋
LONG
์ด ๋ฐ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ๊ฒ ๋๋ค.
main
ํจ์ ์์์ ์ฒ์ ํ๋ ์ผ์ Java ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ํ
Date
ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ๊ฒ์ด๋ค. ์ด ์ธ์คํด์ค๋ ๊ธฐ๋ณธ์ ์ผ๋ก
ํ์ฌ์ ๋ ์ง๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ๋ค์์ผ๋ก ์ด์ ์ ๋ถ๋ฌ์จ ์ ์ ํจ์
getDateInstance
๋ฅผ ํตํด ๋ ์ง ํ์์ ๊ฒฐ์ ํ๊ณ , ํ๋์ค์ ๋ง์ถฐ์ง
DateFormat
์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ์ฌ ํ์ฌ์ ๋ ์ง๋ฅผ ์ถ๋ ฅํ๋ค. ์ด
๋ง์ง๋ง ์ค์ Scala ๋ฌธ๋ฒ์ ์ฌ๋ฏธ์๋ ํน์ฑ์ ๋ณด์ฌ์ค๋ค. ์ค์ง ํ๋์ ์ธ์๋ฅผ
๊ฐ๋ ํจ์๋ ๋ง์น ์ดํญ์ฐ์ฐ์ ๊ฐ์ ๋ฌธ๋ฒ์ผ๋ก ํธ์ถ ๊ฐ๋ฅํ๋ค. ์ด ์ด์ผ๊ธฐ๋ ๊ณง
์๋์ ํํ์์ด:
df format now
์๋ ํํ์๊ณผ ๋์ผํ ์๋ฏธ๋ฅผ ๊ฐ์ง ๋ค๋ ๊ฒ์ด๋ค. ๊ทธ์ ์ข ๋ ๊ฐ๋จํ๊ฒ ํํ ๋์์ ๋ฟ์ด๋ค.
df.format(now)
์ด๋ฌํ ํน์ฑ์ ๊ทธ์ ๋ณ๊ฒ ์๋ ๋ฌธ๋ฒ์ ์ผ๋ถ ์ธ๊ฒ ์ฒ๋ผ ๋ณด์ด์ง๋ง ์ฌ๋ฌ ๊ณณ์์ ์ค์ํ๊ฒ ์ฌ์ฉ ๋๋ค. ๊ทธ์ค์ ํ๋๊ฐ ๋ค์ ์ฅ์ ๋์์๋ค.
์ด๋ฒ ์ฅ์์๋ Java์ Scala๊ฐ ์ผ๋ง๋ ์์ฐ์ค๋ฝ๊ฒ ์๋ก ๋ น์๋๋์ง์ ๋ํด ๋ฐฐ์ ๋ค. ์ด๋ฒ ์ฅ์๋ ๋ํ๋์ง ์์์ง๋ง, Scala ์์์ Java์ ํด๋์ค๋ค์ ์์๋ฐ๊ณ Java์ ์ธํฐํ์ด์ค๋ค์ ๋ฐ๋ก ๊ตฌํํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค.
๋ชจ๋ ๊ฒ์ ๊ฐ์ฒด๋ค
Scala๋ ์์ํ ๊ฐ์ฒด์งํฅ์ ์ธ์ด์ด๋ค. ์ด ๋ง์ ๊ณง ์ซ์์ ํจ์๋ฅผ ํฌํจํ
๋ชจ๋ ๊ฒ์ด ๊ฐ์ฒด๋ผ๋ ๊ฒ์ด๋ค. ์ด๋ฌํ ๋ฉด์์ Scala๋ Java์ ๋ค๋ฅด๋ค.
Java์์๋ ๊ธฐ๋ณธ์ ์ธ ํ์
(boolean
์ด๋ int
๋ฐ์)๊ณผ ์ฐธ์กฐ ๊ฐ๋ฅํ
ํ์
์ด ๋ถ๋ฆฌ๋์ด ์์ผ๋ฉฐ, ํจ์๋ฅผ ๊ฐ๊ณผ ๋์ผํ๊ฒ ๋ค๋ฃฐ ์๋ ์๋ค.
์ซ์๋ ํ๋์ ๊ฐ์ฒด๋ค
์ซ์๋ ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์ ํจ์๋ค์ ํฌํจํ๊ณ ์๋ค. ์ฌ์ค ์๋์ ๊ฐ์ ํํ์์:
1 + 2 * 3 / x
์ค์ง ํจ์ ํธ์ถ๋ก๋ง ์ด๋ฃจ์ด์ ธ ์๋ค. ์ฐ๋ฆฌ๊ฐ ์ด์ ์ฅ์์ ๋ณด์๋ฏ์ด, ์์ ํํ์์ ์๋์ ํํ์๊ณผ ๋์ผํ๋ค.
1.+(2.*(3)./(x))
์์ ํํ์์ฒ๋ผ +
, *
๋ฑ์ Scala์์ ํฉ๋ฒ์ ์ธ ์๋ณ์์ด๋ค.
ํจ์๋ง์ ๊ฐ์ฒด๋ค
Java ํ๋ก๊ทธ๋๋จธ๋ค์๊ฒ๋ ๋๋ผ์ด ์ผ์ด๊ฒ ์ง๋ง Scala์์๋ ํจ์๋ ์ญ์ ๊ฐ์ฒด์ด๋ค. ๋ฐ๋ผ์ ํจ์์ ํจ์๋ฅผ ์ธ์๋ก ๋๊ธฐ๊ฑฐ๋, ํจ์๋ฅผ ๋ณ์์ ์ ์ฅํ๊ฑฐ๋, ํจ์๊ฐ ํจ์๋ฅผ ๋ฆฌํดํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค. ์ด์ฒ๋ผ ํจ์๋ฅผ ๊ฐ๊ณผ ๋์ผํ๊ฒ ๋ค๋ฃจ๋ ๊ฒ์ ๋งค์ฐ ํฅ๋ฏธ๋ก์ด ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์์ธ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ํต์ฌ ์์ ์ค ํ๋์ด๋ค.
ํจ์๋ฅผ ๊ฐ๊ณผ ๊ฐ์ด ๋ค๋ฃจ๋ ๊ฒ์ด ์ ์ฉํจ์ ๋ณด์ด๊ธฐ ์ํด ์์ฃผ ๊ฐ๋จํ ์์ ๋ฅผ ๋ ๋ค. ์ด๋ ํ ํ๋์ ๋งค์ด ์ํํ๋ ํ์ด๋จธ ํจ์๋ฅผ ์๊ฐํด ๋ณด์. ์ํ ํ ํ๋์ ์ด๋ป๊ฒ ๋๊ฒจ ์ฃผ์ด์ผ ํ ๊น? ๋ ผ๋ฆฌ์ ์ผ๋ก ์๊ฐํ๋ค๋ฉด ํจ์๋ฅผ ๋๊ฒจ ์ฃผ์ด์ผ ํ๋ค. ํจ์๋ฅผ ์ ๋ฌํ๋ ์ด๋ฐ ์ข ๋ฅ์ ์ํฉ์ ๋ง์ ํ๋ก๊ทธ๋๋จธ๋ค์๊ฒ ์ต์ ํ ๊ฒ์ด๋ค. ๋ฐ๋ก ์ ์ ์ธํฐํ์ด์ค ์ฝ๋์์ ์ด๋ค ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์์ ๋ ๋ถ๋ฆด ์ฝ๋ฐฑ ํจ์๋ฅผ ๋ฑ๋กํ๋ ๊ฒ ๋ง์ด๋ค.
์๋ ํ๋ก๊ทธ๋จ์์ ํ์ด๋จธ ํจ์์ ์ด๋ฆ์ oncePerSecond
์ด๋ค. ์ด ํจ์๋
์ฝ๋ฐฑ ํจ์๋ฅผ ์ธ์๋ก ๋ฐ๋๋ค. ์ธ์๋ก ๋ฐ๋ ํจ์์ ํ์
์ () => Unit
์ธ๋ฐ,
์ด ํ์
์ ์ธ์๋ฅผ ๋ฐ์ง ์๊ณ ์๋ฌด ๊ฒ๋ ๋๋ ค์ฃผ์ง ์๋ ๋ชจ๋ ํจ์๋ฅผ ๋ปํ๋ค
(Unit
ํ์
์ C/C++์์ void
์ ๋น์ทํ๋ค). ์ด ํ๋ก๊ทธ๋จ์ ๋ฉ์ธ ํจ์๋
์ด ํ์ด๋จธ ํจ์๋ฅผ ํ๋ฉด์ ๋ฌธ์ฅ์ ์ถ๋ ฅํ๋ ๊ฐ๋จํ ์ฝ๋ฐฑํจ์๋ฅผ ์ธ์๋ก ํธ์ถํ๋ค.
๊ฒฐ๊ตญ ์ด ํ๋ก๊ทธ๋จ์ด ํ๋ ์ผ์ ์ผ์ด์ ํ๋ฒ์ฉ โtime flies like an arrowโ๋ฅผ
ํ๋ฉด์ ์ถ๋ ฅํ๋ ๊ฒ์ด ๋๋ค.
object Timer {
def oncePerSecond(callback: () => Unit): Unit = {
while (true) { callback(); Thread sleep 1000 }
}
def timeFlies(): Unit = {
println("time flies like an arrow...")
}
def main(args: Array[String]): Unit = {
oncePerSecond(timeFlies)
}
}
์ฐ๋ฆฌ๋ ๋ฌธ์์ด์ ํ๋ฉด์ ์ถ๋ ฅํ๊ธฐ ์ํ์ฌ Scala์ ์ ์๋ println
์ ์ฌ์ฉ
ํ์๋ค. ์ด ํจ์๋ Java์์ ํํ ์ฌ์ฉํ๋ System.out
์ ์ ์๋ ๊ฒ๊ณผ
๋ค๋ฅด๋ค.
์ด๋ฆ์๋ ํจ์
์ด ํ๋ก๊ทธ๋จ์ ์ดํดํ๊ธฐ ์ฝ์ง๋ง ์กฐ๊ธ ๋ ๋ค๋ฌ์ ์๋ ์๋ค.
ํจ์ timeFlies
๋ ์ค์ง ํจ์ oncePerSecond
์ ์ธ์๋ก
๋๊ฒจ์ง๊ธฐ ์ํด ์ ์ ๋์๋ค๋ ๊ฒ์ ์ฃผ๋ชฉํ์. ์ด๋ฌํ ํ๋ฒ๋ง ์ฌ์ฉ๋๋
ํจ์์ ์ด๋ฆ์ ๋ถ์ฌ ์ค๋ค๋ ๊ฒ์ ํ์ ์๋ ์ผ์ผ ์ ์๋ค. ๋ ํ๋ณตํ
๋ฐฉ๋ฒ์ oncePerSecond
์ ํจ์๊ฐ ์ ๋ฌ ๋๋ ๊ทธ ์๊ฐ ์ด ํจ์๋ฅผ
์์ฑํ๋ ๊ฒ์ด๋ค. Scala์์ ์ ๊ณตํ๋ ๋ฌด๋ช
ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด
๋๋ค. ๋ฌด๋ช
ํจ์๋ ๋ง ๊ทธ๋๋ก ์ด๋ฆ์ด ์๋ ํจ์์ด๋ค. ํจ์ timeFlies
๋์ ์ ๋ฌด๋ช
ํจ์๋ฅผ ์ฌ์ฉํ ์๋ก์ด ๋ฒ์ ์ ํ์ด๋จธ ํ๋ก๊ทธ๋จ์ ์๋์ ๊ฐ๋ค:
object TimerAnonymous {
def oncePerSecond(callback: () => Unit): Unit = {
while (true) { callback(); Thread sleep 1000 }
}
def main(args: Array[String]): Unit = {
oncePerSecond(() =>
println("time flies like an arrow..."))
}
}
main
ํจ์ ์์ ์ค๋ฅธ์ชฝ ํ์ดํ =>
๊ฐ ์๋ ๊ณณ์ด ๋ฌด๋ช
ํจ์์ด๋ค.
์ค๋ฅธ์ชฝ ํ์ดํ๋ ํจ์์ ์ธ์์ ํจ์์ ๋ด์ฉ์ ๋ถ๋ฆฌ ํด์ฃผ๋ ์ญํ ์ ํ๋ค. ์
์์ ์์ ์ธ์์ ๋ฆฌ์คํธ๋ ๋น์ด์๋ค. ํ์ดํ์ ์ผ์ชฝ์ ๋ณด๋ฉด ๋น ๊ดํธ๋ฅผ ๋ณผ ์
์๋ค. ํจ์์ ๋ด์ฉ์ timeFlies
์ ์ผ์นํ๋ค.
ํด๋์ค์ ๋ํ์ฌ
์ง๊ธ๊น์ง ๋ณด์๋ฏ Scala๋ ๊ฐ์ฒด์งํฅ์ ์ธ์ด์ด๋ฉฐ ํด๋์ค์ ๊ฐ๋ ์ด ์กด์ฌํ๋ค. (์ด๋ค ๊ฐ์ฒด์งํฅ ์ธ์ด๋ ํด๋์ค์ ๊ฐ๋ ์ด ์กด์ฌํ์ง ์๋๋ค. ๋น์ฐํ๊ฒ๋ Scala๋ ์ด๋ค์ ์ํ์ง ์๋๋ค.) Scala์ ํด๋์ค ์ ์๋ Java์ ํด๋์ค ์ ์์ ์ ์ฌํ๋ค. ํ๊ฐ์ง ์ค์ํ ์ฐจ์ด์ ์ Scala ํด๋์ค์ ๊ฒฝ์ฐ ํ๋ผ๋ฏธํฐ๋ค์ ๊ฐ์ง ์ ์๋ค๋ ๊ฒ์ธ๋ฐ ์๋ ๋ณต์์ ์์ ์ ์ ๋ํ๋ ์๋ค:
class Complex(real: Double, imaginary: Double) {
def re() = real
def im() = imaginary
}
์ด ๋ณต์์ ํด๋์ค๋ ๋๊ฐ์ ์ธ์๋ฅผ ๋ฐ๋๋ค. ํ๋๋ ๋ณต์์์ ์ค์ ๋ถ๋ถ์ด๊ณ
๋ค๋ฅธ ํ๋๋ ๋ณต์์์ ํ์ ๋ถ๋ถ์ ํด๋นํ๋ ๊ฐ์ด ๋๋ค. ์ด ์ธ์๋ค์
Complex
ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑ ํ ๋ ์ด์ฒ๋ผ ๋ฐ๋์ ์ ๋ฌ ๋์ด์ผ
ํ๋ค: new Complex(1.5, 2.3)
. ํด๋์ค๋ re
์ im
๋ผ๋
๋ ํจ์๋ฅผ ๊ฐ์ง๊ณ ์๋๋ฐ ๊ฐ๊ฐ์ ํจ์๋ฅผ ํตํด ๋ณต์์๋ฅผ ๊ตฌ์ฑํ๋ ํด๋น ๋ถ๋ถ์
๊ฐ์ ์ป์ ์ ์๋ค.
์ด ๋ ํจ์์ ๋ฆฌํดํ์
์ ๋ช
์์ ์ผ๋ก ๋ํ๋ ์์ง ์๋ค๋ ์ฌ์ค์ ์ฃผ๋ชฉํ์.
์ปดํ์ผ๋ฌ๋ ์ด ํจ์๋ค์ ์ค๋ฅธํธ์ ๋ณด๊ณ ๋ ๋ค Double
ํ์
์ ๋ฆฌํด
ํ๋ค๊ณ ์๋์ผ๋ก ์ ์ถํด ๋ธ๋ค.
ํ์ง๋ง ์ปดํ์ผ๋ฌ๊ฐ ์ธ์ ๋ ์ด๋ ๊ฒ ํ์ ์ ์ ์ถํด ๋ผ ์ ์๋ ๊ฒ์ ์๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ถํํ๊ฒ๋ ์ด๋ค ๊ฒฝ์ฐ ์ด๋ฌํ ํ์ ์ ์ถ๊ฐ ๊ฐ๋ฅํ๊ณ ์ด๋ค ๊ฒฝ์ฐ ๋ถ๊ฐ๋ฅ ํ์ง์ ๊ดํ ๋ช ํํ ๊ท์น๋ ์กด์ฌํ์ง ์๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ด๋ฌํ ์ํฉ์ ๋ณ ๋ฌธ์ ๊ฐ ๋์ง ์๋๋ค. ์๋ํ๋ฉด ๋ช ์์ ์ผ๋ก ์ฃผ์ด์ง์ง ์์ ํ์ ์ ๋ณด๋ฅผ ์ปดํ์ผ๋ฌ๊ฐ ์๋์ผ๋ก ์ ์ถ ํด ๋ผ ์ ์๋ ๊ฒฝ์ฐ ์ปดํ์ผ ์ ์๋ฌ๊ฐ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ณด Scala ํ๋ก๊ทธ๋๋จธ๋ค์ ์ํ ํ๊ฐ์ง ๋ฐฉ๋ฒ์, ์ฃผ๋ณ์ ๋ณด๊ณ ์ฝ๊ฒ ํ์ ์ ์ ์ถ ํด ๋ผ ์ ์๋ ๊ฒฝ์ฐ ์ผ๋จ ํ์ ์ ์ธ์ ์๋ตํ๊ณ ์ปดํ์ผ๋ฌ๊ฐ ๋ฐ์ ๋ค์ด๋์ง ํ์ธํ๋ ๊ฒ์ด๋ค. ์ด๋ ๊ฒ ๋ช๋ฒ์ ๋ฐ๋ณตํ๊ณ ๋๋ฉด ํ๋ก๊ทธ๋๋จธ๋ ์ธ์ ํ์ ์ ์๋ตํด๋ ๋๊ณ ์ธ์ ๋ช ์์ ์ผ๋ก ์จ์ฃผ์ด์ผ ํ๋์ง ๊ฐ์ ์ก๊ฒ ๋๋ค.
์ธ์ ์๋ ํจ์
ํจ์ re
์ im
์ ์ฌ์ํ ๋ฌธ์ ๋ ๊ทธ๋ค์ ํธ์ถํ๊ธฐ ์ํด ํญ์
๋ค์ ๋น ๊ดํธ๋ฅผ ๋ถ์ฌ ์ฃผ์ด์ผ ํ๋ค๋ ๊ฒ์ด๋ค. ์๋๋ฅผ ๋ณด์:
object ComplexNumbers {
def main(args: Array[String]): Unit = {
val c = new Complex(1.2, 3.4)
println("imaginary part: " + c.im())
}
}
์ค์ ๋ถ๋ถ๊ณผ ํ์ ๋ถ๋ถ์ ์ ๊ทผ ํ ๋์ ๋ง์น ๊ทธ๋ค์ด ํ๋์ธ ๊ฒ ์ฒ๋ผ ํจ์
๋ง์ง๋ง์ ๋น ๊ดํธ๋ฅผ ๋ถ์ด์ง ์์ ์ ์๋ค๋ฉด ๋์ฑ ์ข๊ฒ ๋ค. ๋๋ผ์ง ๋ง์๋ผ,
Scala๋ ์ด๋ฌํ ๊ธฐ๋ฅ์ ์๋ฒฝํ๊ฒ ์ ๊ณตํ๋ค. ๊ทธ์ ์ธ์๋ฅผ ์ ์ธํ๊ณ
ํจ์๋ฅผ ์ ์ํ๋ฉด ๋๋ค. ์ด๋ฐ ์ข
๋ฅ์ ํจ์๋ ์ธ์๊ฐ 0๊ฐ์ธ ํจ์์๋ ๋ค๋ฅธ๋ฐ,
์ธ์๊ฐ 0๊ฐ์ธ ํจ์๋ ๋น ๊ดํธ๊ฐ ๋ฐ๋ผ ๋ถ๋ ๋ฐ๋ฉด ์ด ํจ์๋ ์ ์ ํ ๋๋
์ฌ์ฉ ํ ๋๋ ์ด๋ฆ ๋ค์ ๊ดํธ๋ฅผ ๋ถ์ด์ง ์๋๋ค. ์ฐ๋ฆฌ๊ฐ ์์ ์ ์ํ
Complex
ํด๋์ค๋ ์๋์ ๊ฐ์ด ๋ค์ ์ธ ์ ์๋ค:
class Complex(real: Double, imaginary: Double) {
def re = real
def im = imaginary
}
์์๊ณผ ์ฌ์ ์
๋ชจ๋ Scala์ ํด๋์ค๋ค์ ํญ์ ์์ ํด๋์ค๋ก๋ถํฐ ์์๋๋ค. ๋ง์ฝ
Complex
์์ ์ฒ๋ผ ์์ ํด๋์ค๊ฐ ์กด์ฌํ์ง ์์ ๊ฒฝ์ฐ๋
๋ฌต์์ ์ผ๋ก scala.AnyRef
๋ฅผ ์์ํ๋ค.
Scala์์๋ ๋ฌผ๋ก ์์ ํด๋์ค์ ์ ์๋ ํจ์๋ฅผ ์ค๋ฒ๋ผ์ด๋ ํ๋ ๊ฒ๋
๊ฐ๋ฅํ๋ค. ๊ทธ๋ฌ๋ ์๋ํ์ง ์๋ ์ค์๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํ์ฌ ๋ค๋ฅธ ํจ์๋ฅผ
์ค๋ฒ๋ผ์ด๋ ํ๋ ํจ์๋ override
์ง์์๋ฅผ ๊ผญ ์ ์ด์ฃผ์ด์ผ ํ๋ค.
์๋ฅผ ๋ค๋ฉด, ์ฐ๋ฆฌ์ Complex
ํด๋์ค์ ๋ํด Object
๋ก ๋ถํฐ
์์๋ toString
ํจ์๋ฅผ ์ฌ์ ์ ํ๋ ๋ฒ์ ์๋์ ๊ฐ๋ค:
class Complex(real: Double, imaginary: Double) {
def re = real
def im = imaginary
override def toString() =
"" + re + (if (im >= 0) "+" else "") + im + "i"
}
์ผ์ด์ค ํด๋์ค ๊ทธ๋ฆฌ๊ณ ํจํด ๋งค์นญ
ํ๋ก๊ทธ๋จ์ ์์ฃผ ๋ฑ์ฅํ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ ์ค์ ํ๋๋ ํธ๋ฆฌ์ด๋ค. ์ธํฐํ๋ฆฌํฐ์ ์ปดํ์ผ๋ฌ๋ ํํ ํธ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ด๋ถ ํํ์ ์ ์ฅํ๊ณ , XML ๋ฌธ์๋ ํธ๋ฆฌ์ด๋ฉฐ, ๋ ๋-๋ธ๋ ํธ๋ฆฌ์ ๊ฐ์ ์ ์ฅ๊ตฌ์กฐ๋ค๋ ํธ๋ฆฌ์ ๊ธฐ๋ฐ์ ๋๊ณ ์๋ค.
์์ ๊ณ์ฐ๊ธฐ ํ๋ก๊ทธ๋จ์ ํตํด Scala์์ ์ด๋ฌํ ํธ๋ฆฌ๋ค์ ์ด๋ป๊ฒ
ํํํ๊ณ ๋ค๋ฃจ๋์ง์ ๋ํด ์์ ๋ณด์. ์ด ํ๋ก๊ทธ๋จ์ ๋ชฉํ๋ ๋ํ๊ธฐ์
์์์ธ ์ ์ ๊ทธ๋ฆฌ๊ณ ๋ณ์๋ก ์ด๋ฃจ์ด์ง ๊ฐ๋จํ ์ฐ์ ํํ์์ ๋ค๋ฃจ๋ ๊ฒ์ด๋ค.
์๋ฅผ ๋ค๋ฉด, 1+2
๋ (x+x)+(7+y)
๊ฐ์ ์๋ค ๋ง์ด๋ค.
์ฒ์์ผ๋ก, ์ฐ๋ฆฌ๋ ํด๋น ์ฐ์ ํํ์๋ค์ ์ด๋ป๊ฒ ํํ ํ ์ง ๊ฒฐ์ ํด์ผ ํ๋ค. ๊ฐ์ฅ ์์ฐ์ค๋ฌ์ด ๋ฐฉ๋ฒ์ ํธ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค. ๋ ธ๋๋ ์ฐ์ฐ(์ฌ๊ธฐ์๋ ๋ง์ )์ด ๋ ๊ฒ์ด๊ณ , ๋ฆฌํ๋ ๊ฐ(์ฌ๊ธฐ์๋ ์์ ๋๋ ๋ณ์)๊ฐ ๋๊ฒ ๋ค.
Java์๋ค๋ฉด ํธ๋ฆฌ๋ฅผ ๋ํ๋ด๊ธฐ ์ํด, ํธ๋ฆฌ์ ๋ํ ์ถ์ ์์ ํด๋์ค์ ๋ ธ๋์ ๋ฆฌํ ๊ฐ๊ฐ์ ๋ํ ์ค์ ํ์ ํด๋์ค๋ค์ ์ ์ ํ์ ๊ฒ์ด๋ค. ํจ์ํ ์ธ์ด์๋ค๋ฉด ๊ฐ์ ๋ชฉ์ ์ผ๋ก ๋์์ ๋ฐ์ดํฐ ํ์ ์ ์ฌ์ฉ ํ์ ๊ฒ์ด๋ค. Scala๋ ์ผ์ด์ค ํด๋์ค๋ผ ํ๋ ์ด ๋ ์ฌ์ด์ ์ด๋์ฏค์ ๋์ฌ ์ง ์ ์๋ ์ฅ์น๋ฅผ ์ ๊ณตํ๋ค. ์ฐ๋ฆฌ ์์ ์ ํธ๋ฆฌ ํ์ ์ ์ ์ํ๊ธฐ ์ํด ์ด ์ฅ์น๊ฐ ์ด๋ป๊ฒ ์ฌ์ฉ ๋๋์ง ์๋์์ ์ค์ ์ ์ธ ์๋ฅผ ๋ณด์:
abstract class Tree
case class Sum(l: Tree, r: Tree) extends Tree
case class Var(n: String) extends Tree
case class Const(v: Int) extends Tree
ํด๋์ค Sum
, Var
๊ทธ๋ฆฌ๊ณ Const
๊ฐ ์ผ์ด์ค ํด๋์ค๋ก
์ ์ธ๋์๋ค๋ ๊ฒ์ ์ด๋ค์ด ์ฌ๋ฌ๊ฐ์ง ๋ฉด์์ ์ผ๋ฐ์ ์ธ ํด๋์ค์ ๋ค๋ฅด๋ค๋
์๋ฏธ์ด๋ค:
- ์ธ์คํด์ค๋ฅผ ์์ฑ ํ ๋
new
ํค์๋๋ฅผ ์๋ต ํ ์ ์๋ค. ๋ค๋ฅธ ๋ง๋ก,new Const(5)
๋ผ ์ฐ๋ ๋์Const(5)
๋ผ ์ฐ๋ฉด ๋๋ค. - ์์ฑ์ ํ๋ผ๋ฏธํฐ๋ค์ ๋ํ getter ํจ์๊ฐ ์๋์ผ๋ก ์ ์๋๋ค. ๋ค๋ฅธ ๋ง๋ก,
ํด๋์ค
Const
์ ์ธ์คํด์คc
์ ์๋ ์์ฑ์ ํ๋ผ๋ฏธํฐv
์ ๊ฐ์c.v
๋ก ์ ๊ทผ ๊ฐ๋ฅํ๋ค. - ํจ์
equals
์hashCode
๋ ๊ณต์ง๋ก ์ ๊ณต๋๋ค. ์ด ํจ์๋ค์ ๋ ํผ๋ฐ์ค์ ๋์ผํจ ๋ณด๋ค ๊ตฌ์กฐ์ ๋์ผํจ์ ํ์ธ ํ๋๋ก ๊ตฌํ๋์ด ์๋ค. ๋ค๋ฅธ ๋ง๋ก, ์์ฑ ๋ ๊ณณ์ด ๋ค๋ฅด๋๋ผ๋ ๊ฐ๊ฐ์ ์์ฑ์ ํ๋ผ๋ฏธํฐ ๊ฐ์ด ๊ฐ๋ค๋ฉด ๊ฐ์ ๊ฒ์ผ๋ก ์ฌ๊ธด๋ค. - ํจ์
toString
์ ๋ํ ๊ธฐ๋ณธ์ ๊ตฌํ์ด ์ ๊ณต๋๋ค. ์ด ๊ธฐ๋ณธ์ ์ธ ๊ตฌํ์ โ๊ฐ์ด ์์ฑ ๋ ๋โ์ ํํ๋ฅผ ์ถ๋ ฅํ๋ค. ์๋ฅผ ๋ค์ดx+1
์ ํธ๋ฆฌ ํํ ์ ์ถ๋ ฅ ํ๋ค๋ฉดSum(Var(x),Const(1))
์ด ๋๋ค. - ์ผ์ด์ค ํด๋์ค๋ค์ ์ธ์คํด์ค๋ ํจํด ๋งค์นญ์ ํตํด ๋ฐ๋ก ์ฌ์ฉ ๋ ์ ์๋ค. ์์ธํ ๋ด์ฉ์ ์๋์์ ๋ค๋ฃฌ๋ค.
์ฐ์ ํํ์์ ๋ํ๋ผ ์ ์๋ ๋ฐ์ดํฐ ํ์
์ ์ ์ ํ์ผ๋ฏ๋ก ์ด์ ๊ทธ๊ฒ๋ค์
๊ณ์ฐ ํ ์ฐ์ฐ์๋ค์ ์ ์ ํ ์ฐจ๋ก๋ค. ์ผ๋จ, ์ด๋ค ํ๊ฒฝ์์์ ํํ์์
๊ณ์ฐ ํด์ฃผ๋ ํจ์๋ถํฐ ์์ํ์. ํ๊ฒฝ์ ๊ฐ๊ฐ์ ๋ณ์๋ง๋ค ์ฃผ์ด์ง ๊ฐ๋ค์ ์ ์ฅ
ํด ๋๋ ๊ณณ์ด๋ค. ์ปดํจํฐ์์ ๋ฉ๋ชจ๋ฆฌ์ ์ญํ ๊ณผ ๋น์ท ํ๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค.
์๋ฅผ ๋ค์ด, ๋ณ์ x
์ 5
๊ฐ ์ ์ฅ๋ ํ๊ฒฝ({ x -> 5 }
)์์ ํํ์
x+1
์ ๊ณ์ฐํ๋ฉด ๊ฒฐ๊ณผ๋ก 6
์ด ๋์จ๋ค.
ํ๊ฒฝ์ ์ด๋ป๊ฒ ํํํ๋๊ฒ ์ข์๊น? ๊ฐ๋จํ ์๊ฐํ๋ฉด, ํด์ฌ ํ
์ด๋ธ ๊ฐ์
๋ ๊ฐ์ ๋ฌถ์ด์ฃผ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉ ํ ์ ์๊ฒ ๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ ์ด๋ฌํ
๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ชฉ์ ์ผ๋ก ํจ์๋ฅผ ์ง์ ์ฌ์ฉ ํ ์๋ ์๋ค! ๊ฐ๋ง ์๊ฐํด
๋ณด๋ฉด ํ๊ฒฝ์ด๋ผ๋ ๊ฒ์ ๋ณ์๋ช
์์ ๊ฐ์ผ๋ก ๊ฐ๋ ํจ์์ ์ง๋์ง ์๋๋ค.
์์์ ์ฌ์ฉํ ํ๊ฒฝ { x -> 5 }
์ Scala๋ก ๊ฐ๋จํ ์๋์ ๊ฐ์ด
์ด๋ค:
{ case "x" => 5 }
์ด ๋ฌธ๋ฒ์ ํจ์๋ฅผ ์ ์ํ๋ค. ์ด ํจ์๋ ๋ฌธ์์ด "x"
๊ฐ ์ธ์๋ก ๋ค์ด
์์ ๋ ์ ์ 5
๋ฅผ ๋๋ ค์ฃผ๊ณ , ๋ค๋ฅธ ๋ชจ๋ ๊ฒฝ์ฐ์ ์์ธ๋ฅผ ๋ฐ์์ํค๋ ํจ์์ด๋ค.
๊ณ์ฐํ๋ ํจ์๋ฅผ ์์ฑํ๊ธฐ ์ ์ ํ๊ฒฝ ํ์
์ ์ด๋ฆ์ ๋ถ์ฌ ์ฃผ๋ ๊ฒ์ด ์ข๊ฒ ๋ค.
๋ฌผ๋ก ํญ์ ํ๊ฒฝ ํ์
์ผ๋ก String => Int
๋ฅผ ์ฌ์ฉํด๋ ๋์ง๋ง ๋ณด๊ธฐ ์ข์
์ด๋ฆ์ ๋ถ์ด๋ ๊ฒ์ ํ๋ก๊ทธ๋จ์ ๋ ์ฝ๊ธฐ์ ๋ช
๋ฃํ๊ณ ๋ณ๊ฒฝ์ ์ ์ฐํ๊ฒ ํด ์ค๋ค.
Scala์์๋ ์๋์ ๊ฐ์ด ํ ์ ์๋ค:
type Environment = String => Int
์ด์ ๋ถํฐ ํ์
Environment
๋ String
์์ Int
๋ก ๊ฐ๋
ํจ์ ํ์
์ ๋ค๋ฅธ ์ด๋ฆ์ด๋ค.
์ง๊ธ๋ถํฐ ๊ณ์ฐํ๋ ํจ์๋ฅผ ์ ์ํ์. ๊ฐ๋ ์ผ๋ก ๋ฐ์ง๋ฉด ๋งค์ฐ ๊ฐ๋จํ๋ค: ๋ ํํ์์ ํฉ์ ๊ฐ ํํ์์ ๊ฐ์ ๊ตฌํ์ฌ ๋ํ ๊ฒ์ด๋ค. ๋ณ์์ ๊ฐ์ ํ๊ฒฝ์์ ๋ฐ๋ก ๊ฐ์ ธ ์ฌ ์ ์๊ณ , ์์์ ๊ฐ์ ์์ ์์ฒด์ด๋ค. ์ด๊ฒ์ Scala๋ก ๋ํ๋ด๋ ๊ฒ์ ์ด๋ ต์ง ์๋ค:
def eval(t: Tree, env: Environment): Int = t match {
case Sum(l, r) => eval(l, env) + eval(r, env)
case Var(n) => env(n)
case Const(v) => v
}
์ด ๊ณ์ฐ ํจ์๋ ํธ๋ฆฌ t
์ ๋ํด ํจํด ๋งค์นญ์ ์ํํจ์ผ๋ก์จ
๋์ํ๋ค. ์์ ํจ์ ์ ์๋ ์ง๊ด์ ์ผ๋ก๋ ์ดํดํ๊ธฐ ์ฝ๋ค:
- ์ฒ์์ผ๋ก
t
๊ฐSum
์ธ์ง ํ์ธํ๋ค. ๋ง์ฝ ๋ง๋ค๋ฉด ์ผ์ชฝ ์๋ธํธ๋ฆฌ๋ฅผ ์๋ก์ด ๋ณ์l
์ ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ๋ฅผ ์๋ก์ด ๋ณ์r
์ ํ ๋น ํ๋ค. ๊ทธ๋ฆฌ๊ณ ํ์ดํ๋ฅผ ๋ฐ๋ผ ํ์ดํ์ ์ค๋ฅธํธ์ผ๋ก ๊ณ์ฐ์ ์ด์ด ๋๊ฐ๋ค. ํ์ดํ์ ์ค๋ฅธํธ์์๋ ํ์ดํ์ ์ผํธ์์ ํ ๋น๋ ๋ณ์l
๊ณผr
์ ์ฌ์ฉ ํ๋ค. - ์ฒซ๋ฒ์งธ ํ์ธ์ด ์ฑ๊ณตํ์ง ๋ชปํ๋ฉด ํธ๋ฆฌ๋
Sum
์ด ์๋๋ผ๋ ์ด์ผ๊ธฐ์ด๋ค. ๋ค์์ผ๋ก๋t
๊ฐVar
์ธ์ง ํ์ธํ๋ค. ๋ง์ฝ ๋ง๋ค๋ฉดVar
๋ ธ๋ ์์ ํฌํจ๋ ์ด๋ฆ์ ๋ณ์n
์ ํ ๋นํ๋ค. ๊ทธ๋ฆฌ๊ณ ํ์ดํ์ ์ค๋ฅธ์ชฝ์ผ๋ก ์งํํ๋ค. - ๋๋ฒ์งธ ํ์ธ ์ญ์ ์คํจํ๋ฉด
t
๋Sum
๋Var
๋ ์๋๋ผ๋ ๋ป์ด๋ค. ์ด์ ๋Const
์ ๋ํด ํ์ธ ํด๋ณธ๋ค. ๋ง์ฝ ๋ง๋ค๋ฉดConst
๋ ธ๋ ์์ ๊ฐ์ ๋ณ์v
์ ํ ๋นํ๊ณ ํ์ดํ์ ์ค๋ฅธ์ชฝ์ผ๋ก ์งํํ๋ค. - ๋ง์ง๋ง์ผ๋ก ๋ชจ๋ ํ์ธ์ด ์คํจํ๋ฉด ํจํด ๋งค์นญ์ด ์คํจ ํ์์ ์๋ฆฌ๋
์์ธ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค. ์ด๋ฌํ ์ํฉ์ ํ์ธ ํ ๊ฒ ์ธ์
Tree
์ ํ์ ํด๋์ค๊ฐ ๋ ์กด์ฌ ํ ๊ฒฝ์ฐ ์ผ์ด๋๋ค.
ํจํด ๋งค์นญ์ ๊ธฐ๋ณธ์ ์ธ ์์ด๋์ด๋ ๋์์ด ๋๋ ๊ฐ์ ์ฌ๋ฌ๊ฐ์ง ๊ด์ฌ์๋ ํจํด์ ๋ํด ์์๋๋ก ๋ง์ถฐ ๋ณธ ํ, ๋ง๋ ๊ฒ์ด ์์ผ๋ฉด ๋ง์ ๊ฐ ์ค ๊ด์ฌ ์๋ ๋ถ๋ถ์ ๋ํด ์๋กญ๊ฒ ์ด๋ฆ ๋ถ์ด๊ณ , ๊ทธ ์ด๋ฆ ๋ถ์ธ ๋ถ๋ถ์ ์ฌ์ฉํ๋ ์ด๋ ํ ์์ ์ ์งํํ๋ ๊ฒ์ด๋ค.
๊ฐ์ฒด์งํฅ์ ์๋ จ๋ ํ๋ก๊ทธ๋๋จธ๋ผ๋ฉด ์ eval
์ ํด๋์ค Tree
์
๊ทธ ํ์ ํด๋์ค์ ๋ํ ๋ฉค๋ฒ ํจ์๋ก ์ ์ํ์ง ์์๋์ง ๊ถ๊ธ ํ ๊ฒ์ด๋ค.
์ฌ์ค ๊ทธ๋ ๊ฒ ํ ์๋ ์์๋ค. Scala๋ ์ผ๋ฐ์ ์ธ ํด๋์ค ์ฒ๋ผ ์ผ์ด์ค ํด๋์ค์
๋ํด์๋ ํจ์ ์ ์๋ฅผ ํ์ฉํ๋ค. ํจํด ๋งค์นญ์ ์ฌ์ฉํ๋๋ ๋ฉค๋ฒ ํจ์๋ฅผ
์ฌ์ฉํ๋๋๋ ์ฌ์ฉ์์ ์ทจํฅ์ ๋ฌ๋ฆฐ ๋ฌธ์ ๋ค. ํ์ง๋ง ํ์ฅ์ฑ์ ๊ดํด ์์ฌํ๋
์ค์ํ ์ ์ด ์๋ค:
- ๋ฉค๋ฒ ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋จ์ง
Tree
์ ๋ํ ํ์ ํด๋์ค๋ฅผ ์๋กญ๊ฒ ์ ์ ํจ์ผ๋ก ์๋ก์ด ๋ ธ๋๋ฅผ ์ถ๊ฐํ๊ธฐ ์ฝ๋ค. ๋ฐ๋ฉด์ ํธ๋ฆฌ์ ๋ํ ์๋ก์ด ์ฐ์ฐ์ ์ถ๊ฐํ๋ ์์ ์ด ๊ณ ๋๋ค. ์๋ก์ด ์ฐ์ฐ์ ์ถ๊ฐํ๊ธฐ ์ํด์๋Tree
์ ๋ชจ๋ ํ์ ํด๋์ค๋ฅผ ๋ณ๊ฒฝํด์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค. - ํจํด ๋งค์นญ์ ์ฌ์ฉํ๋ฉด ์ํฉ์ด ๋ฐ๋๊ฐ ๋๋ค. ์๋ก์ด ๋ ธ๋๋ฅผ ์ถ๊ฐํ๋ ค๋ฉด ํธ๋ฆฌ์ ๋ํด ํจํด ๋งค์นญ์ ์ํํ๋ ๋ชจ๋ ํจ์๋ค์ ์๋ก์ด ๋ ธ๋๋ ๊ณ ๋ คํ๋๋ก ๋ณ๊ฒฝํด์ผ ํ๋ค. ๋ฐ๋ฉด์ ์๋ก์ด ์ฐ์ฐ์ ์ถ๊ฐํ๋ ๊ฒ์ ์ฝ๋ค. ๊ทธ๋ฅ ์๋ก์ด ๋ ๋ฆฝ์ ์ธ ํจ์๋ฅผ ๋ง๋ค๋ฉด ๋๋ค.
ํจํด ๋งค์นญ์ ๋ํด ์ข ๋ ์์๋ณด๊ธฐ ์ํด, ์ฐ์ ํํ์์ ๋ํ ๋ ๋ค๋ฅธ ์ฐ์ฐ์ ์ ์ ํด๋ณด์. ์ด๋ฒ ์ฐ์ฐ์ ์ฌ๋ณผ ์ถ์ถ์ด๋ค. ํธ๋ฆฌ์์ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ํน์ ๋ณ์๋ง 1๋ก ํ์ํ๋ ์ผ์ด๋ค. ๋ ์๋ ์๋ ๊ท์น๋ง ๊ธฐ์ตํ๋ฉด ๋๋ค:
- ๋ํ๊ธฐ ํํ์์์์ ์ฌ๋ณผ ์ถ์ถ์ ์ข๋ณ๊ณผ ์ฐ๋ณ์ ์ฌ๋ณผ์ ์ถ์ถํ์ฌ ๋ํ ๊ฒ๊ณผ ๊ฐ๋ค.
- ๋ณ์
v
์ ๋ํ ์ฌ๋ณผ ์ถ์ถ์v
๊ฐ ์ฐ๋ฆฌ๊ฐ ์ถ์ถํ๊ธฐ ์ํ๋ ์ฌ๋ณผ๊ณผ ๊ด๋ จ์ด ์๋ค๋ฉด 1์ด ๋๊ณ ๊ทธ ์ธ์ ๊ฒฝ์ฐ 0์ด ๋๋ค. - ์์์ ๋ํ ์ฌ๋ณผ ์ถ์ถ ๊ฐ์ 0์ด๋ค.
์ด ๊ท์น๋ค์ ๊ฑฐ์ ๊ทธ๋๋ก Scala ์ฝ๋๊ฐ ๋๋ค.
def derive(t: Tree, v: String): Tree = t match {
case Sum(l, r) => Sum(derive(l, v), derive(r, v))
case Var(n) if (v == n) => Const(1)
case _ => Const(0)
}
์์ ํจ์๋ ํจํด ๋งค์นญ์ ๊ดํ ๋ ๊ฐ์ง ์๋ก์ด ๊ธฐ๋ฅ์ ์๊ฐํ๋ค.
์ฒซ ๋ฒ์งธ๋ก, case
ํํ์ ๊ฐ๋๋ฅผ ๊ฐ์ง ์ ์๋ค. ๊ฐ๋๋
if
ํค์๋ ๋ค์ ์ค๋ ํํ์์ ๋ปํ๋ ๋ง๋ก ํจํด ๋งค์นญ์ ์ถ๊ฐ์ ์ธ
์กฐ๊ฑด์ ๋ถ์ฌํ๋ค. ๊ฐ๋๊ฐ ์ฐธ์ด ๋์ง ์์ผ๋ฉด ํจํด ๋งค์นญ์ ์ฑ๊ณตํ์ง ๋ชปํ๋ค.
์ฌ๊ธฐ์๋, ๋งค์นญ ๋ ๋ณ์์ ์ด๋ฆ์ด ์ฐ๋ฆฌ๊ฐ ์ถ์ถํ๋ ์ฌ๋ณผ v
์ ๊ฐ์
๋๋ง ์์ 1์ ๋ฆฌํดํจ์ ๋ณด์ฅํ๋ ์ฉ๋๋ก ์ฌ์ฉ๋๋ค. ๋ ๋ฒ์งธ ์๋ก์ด ๊ธฐ๋ฅ์
์์ผ๋์นด๋์ด๋ค. ๋ฐ์ค ๋ฌธ์ _
๋ก ์ฐ๋ฉฐ, ๋ชจ๋ ๊ฐ๊ณผ ๋งค์น ๋๊ณ
๋ฐ๋ก ์ด๋ฆ์ ๋ถ์ด์ง ์๋๋ค.
ํจํด ๋งค์นญ์ ๋ฐ์ด๋ ๊ธฐ๋ฅ๋ค์ ๋ชจ๋ ์ดํด๋ณด์ง๋ ๋ชปํ์ง๋ง, ๋ฌธ์๋ฅผ ๋๋ฌด
์ง๋ฃจํ๊ฒ ๋ง๋ค์ง ์๊ธฐ ์ํ์ฌ ์ด์ฏค์์ ๋ฉ์ถ๊ธฐ๋ก ํ๋ค. ์ด์ ์์์ ์ ์ํ
๋ ๊ฐ์ ์์ ํจ์๊ฐ ์ค์ ๋ก ๋์ํ๋ ๋ชจ์ต์ ๋ณด์. ์ฐ์ ํํ์
(x+x)+(7+y)
์ ๋ํด ๋ช๊ฐ์ง์ ์ฐ์ฐ์ ์คํํ๋ ๊ฐ๋จํ main
ํจ์๋ฅผ
๋ง๋ค๊ธฐ๋ก ํ๋ค. ์ฒซ๋ฒ์งธ๋ก ํ๊ฒฝ { x -> 5, y -> 7 }
์์
๊ทธ ๊ฐ์ ๊ณ์ฐ ํ ๊ฒ์ด๊ณ , ๋ค์์ผ๋ก x
์ y
์ ๋ํ ์ฌ๋ณผ ์ถ์ถ์ ์ํ ํ
๊ฒ์ด๋ค.
def main(args: Array[String]): Unit = {
val exp: Tree = Sum(Sum(Var("x"),Var("x")),Sum(Const(7),Var("y")))
val env: Environment = { case "x" => 5 case "y" => 7 }
println("Expression: " + exp)
println("Evaluation with x=5, y=7: " + eval(exp, env))
println("Derivative relative to x:\n " + derive(exp, "x"))
println("Derivative relative to y:\n " + derive(exp, "y"))
}
์ด ํ๋ก๊ทธ๋จ์ ์คํํ๋ฉด, ์์๋ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๋ค:
Expression: Sum(Sum(Var(x),Var(x)),Sum(Const(7),Var(y)))
Evaluation with x=5, y=7: 24
Derivative relative to x:
Sum(Sum(Const(1),Const(1)),Sum(Const(0),Const(0)))
Derivative relative to y:
Sum(Sum(Const(0),Const(0)),Sum(Const(0),Const(1)))
์ถ๋ ฅ์ ์ดํด ๋ณด๋ฉด ์ฌ๋ณผ ์ถ์ถ์ ๊ฒฐ๊ณผ๊ฐ ์ฌ์ฉ์์๊ฒ ์ข ๋ณต์กํ๋ค๋ ์๊ฐ์ด ๋ ๋ค. ํจํด ๋งค์นญ์ ์ฌ์ฉํ์ฌ ์ด ๊ฒฐ๊ณผ๋ฅผ ๋จ์ํ ํ๋ ํจ์๋ฅผ ์ ์ํ๋ ๊ฒ์ ์ฌ๋ฏธ์๋ ๋ฌธ์ ์ด๋ค(์๊ฐ๋ณด๋ค ๋ณต์กํ๊ธฐ๋ ํ๋ค). ๋ ์๋ค์๊ฒ ์ฐ์ต๋ฌธ์ ๋ก ๋จ๊ฒจ๋๊ฒ ๋ค.
ํธ๋ ์์ ๋ํ์ฌ
Scala ํด๋์ค์์๋ ์์ ํด๋์ค์์ ์ฝ๋๋ฅผ ์์ ๋ฐ๋ ๊ฒ ๋ฟ๋ง์ด ์๋๋ผ, ํ๋ ๋๋ ์ฌ๋ฌ๊ฐ์ ํธ๋ ์(trait)์์ ์ฝ๋๋ฅผ ๋ถ๋ฌ ์ฌ ์ ์๋ ๋ฐฉ๋ฒ๋ ์๋ค.
Java ํ๋ก๊ทธ๋๋จธ๋ค์ด ํธ๋ ์์ ์ดํดํ๋ ๊ฐ์ฅ ์ฌ์ด ๊ธธ์ ์ฝ๋๋ฅผ ๊ฐ์ง ์ ์๋ ์ธํฐํ์ด์ค๋ผ๊ณ ์๊ฐํ๋ ๊ฒ์ด๋ค. Scala์์ ์ด๋ค ํด๋์ค๊ฐ ํธ๋ ์์ ์์ํ๋ฉด, ๊ทธ ํด๋์ค๋ ํธ๋ ์์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํด์ผ๋ง ํ๊ณ ๋์์ ํธ๋ ์์ด ๊ฐ์ง ๋ชจ๋ ์ฝ๋๋ค์ ๊ฐ์ ธ์ค๊ฒ ๋๋ค.
ํธ๋ ์์ ์ ์ฉํจ์ ๋ณด์ด๊ธฐ ์ํด ๊ฐ์ฒด๋ค์ ์์๋ฅผ ๋ถ์ด๋ ๊ณ ์ ์ ์ธ ์์ ํ๋๋ฅผ
๋ค์ด๋ณด๊ธฐ๋ก ํ์. ์์๊ฐ ์๋ ๊ฐ์ฒด๋ค์ ์ ๋ ฌ๋ฌธ์ ์ฒ๋ผ ์ฃผ๋ก ๊ทธ๋ค ์ฌ์ด์ ๋น๊ต๊ฐ
ํ์ ํ ๊ฒฝ์ฐ ์ ์ฉํ๋ค. Java์์๋ ๋น๊ต๊ฐ๋ฅํ ๊ฐ์ฒด๋ค์ด Comparable
์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๊ฒ ๋๋ค. Scala์์๋ ์ด Comparable
์ ํธ๋ ์์ผ๋ก
์ ์ํ์ฌ ๋ ๋์ ํ๋ก๊ทธ๋จ ๋์์ธ์ ์ ๊ณต ํ ์ ์๋ค. ์ฌ๊ธฐ์๋ ์ด๋ฅผ
Ord
๋ผ ๋ถ๋ฅผ ๊ฒ์ด๋ค.
๊ฐ์ฒด๋ฅผ ๋น๊ต ํ ๋, ์ฌ์ฏ๊ฐ์ ์๋ก ๋ค๋ฅธ ๊ด๊ณ๊ฐ ์ฃผ๋ก ์ฌ์ฉ ๋๋ค: ์๋ค, ์๊ฑฐ๋ ๊ฐ๋ค, ๊ฐ๋ค, ๊ฐ์ง ์๋ค, ํฌ๊ฑฐ๋ ๊ฐ๋ค, ํฌ๋ค. ํ์ง๋ง ์ด ์ฌ์ฏ๊ฐ๋ฅผ ์ผ์ผํ ๊ตฌํํ๋ ๊ฒ์ ์ง๋ฃจํ๊ณ ์๋ฏธ ์๋ ์ผ์ด ๋ ๊ฒ์ด๋ค. ๊ฒ๋ค๊ฐ ์ด์ค ๋ ๊ฐ์ง ๊ด๊ณ๋ง ์ ์ ๋์ด๋ ๋๋จธ์ง ๋ค๊ฐ์ง ๊ด๊ณ๋ฅผ ๊ณ์ฐ ํ ์ ์์ง ์์๊ฐ. ์๋ฅผ ๋ค์ด ๊ฐ๋ค์ ์๋ค๋ง ๊ฒฐ์ ํ ์ ์์ด๋ ๋๋จธ์ง ๊ด๊ณ์ ์ฐธ ๊ฑฐ์ง์ ์ฝ๊ฒ ํ๋จ ํ ์ ์๋ค. Scala์์๋ ์ด๋ฌํ ๋ ผ๋ฆฌ๋ค์ ํธ๋ ์์ ์ ์ ์์ ์ฐ์ํ๊ฒ ํํ ํด ๋ผ ์ ์๋ค:
trait Ord {
def < (that: Any): Boolean
def <=(that: Any): Boolean = (this < that) || (this == that)
def > (that: Any): Boolean = !(this <= that)
def >=(that: Any): Boolean = !(this < that)
}
์์ ์ ์๋ Java์ Comparable
์ธํฐํ์ด์ค์ ๊ฐ์ ์ญํ ์ ํ๋
Ord
๋ผ๊ณ ๋ถ๋ฆฌ๋ ์๋ก์ด ํ์
์ ๋ง๋ ๋ค. ์ด ์๋ก์ด ํ์
์๋
์ธ๊ฐ์ง์ ๊ด๊ณ์์ด ๊ธฐ๋ณธ์ ์ผ๋ก ๊ตฌํ์ด ๋์ด ์์ผ๋ฉฐ ์ด ๊ตฌํ์ ๋ชจ๋ ํ๋์
์ถ์ ํจ์๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค. ๋ชจ๋ ๊ฐ์ฒด์ ๋ํด ๊ธฐ๋ณธ์ ์ผ๋ก ์กด์ฌํ๋ ๊ฐ๋ค์
๊ฐ์ง ์๋ค์ ๋ํ ๊ด๊ณ์์ ๋น ์ ธ ์๋ค.
์์์ ์ฌ์ฉ๋ ํ์
Any
๋ Scala์ ์ต์์ ํ์
์ด๋ค. Java์
Object
ํ์
๊ณผ ๊ฐ์ผ๋, Int
, Float
๊ณผ ๊ฐ์ ๊ธฐ๋ณธ ํ์
์
์์ ํ์
์ด๋ผ๋ ์ ์์ ์ข ๋ ์ผ๋ฐํ ๋ ๋ฒ์ ์ด๋ผ ์๊ฐ ํ ์ ์๋ค.
๊ฐ์ฒด๋ฅผ ๋น๊ต ๊ฐ๋ฅํ๊ฒ ๋ง๋ค๊ธฐ ์ํด ์ ์ํด์ผ ํ ๊ฒ์ ๊ฐ๋ค์ ์๋ค ๋ฟ์ด๋ค.
๋๋จธ์ง๋ ์์ Ord
ํธ๋ ์์ ์ฝ์
ํ์ฌ ์ฒ๋ฆฌํ๋ค. ํ๋์ ์๋ก
๊ทธ๋ ๊ณ ๋ฆฌ๋ ฅ์ ๋ ์ง๋ฅผ ๋ํ๋ด๋ Date
ํด๋์ค๋ฅผ ๋ง๋ค์ด ๋ณด์.
์ด ๋ ์ง๋ ์ ์์ธ ๋ , ์, ๋
์ผ๋ก ๊ตฌ์ฑ ๋๋ค. ์ผ๋จ ์๋์ฒ๋ผ ๋ง๋ ๋ค:
class Date(y: Int, m: Int, d: Int) extends Ord {
def year = y
def month = m
def day = d
override def toString(): String = s"$year-$month-$day"
์ฌ๊ธฐ์ ์ค์ํ ๋ถ๋ถ์ ํด๋์ค ์ด๋ฆ๊ณผ ํ๋ผ๋ฏธํฐ ๋ค์ ๋ฐ๋ผ์ค๋
extends Ord
์ ์ธ์ด๋ค. ์ด ์ ์ธ์ Date
ํด๋์ค๊ฐ Ord
ํธ๋ ์์ ์์ํจ์ ๋ปํ๋ค.
๋ค์์ผ๋ก Object
์์ ์์๋ equals
ํจ์๋ฅผ ์ฌ์ ์ ํ์ฌ
๊ฐ๊ฐ์ ์ผ, ์, ๋
์ ๋น๊ตํ์ฌ ๊ฐ์์ ์ฌ๋ฐ๋ฅด๊ฒ ํ๋จํ๋๋ก ํ๋ค.
equals
์ ๊ธฐ๋ณธ ์ ์๋ ์ธ๋ชจ๊ฐ ์๋ค. ์๋ํ๋ฉด Java์ ๊ฐ์ด
๊ธฐ๋ณธ์ ์ธ equals
๋ ๋ฌผ๋ฆฌ์ ์ฃผ์๋ฅผ ๋น๊ตํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ต์ข
์ ์ธ
์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค:
override def equals(that: Any): Boolean =
that.isInstanceOf[Date] && {
val o = that.asInstanceOf[Date]
o.day == day && o.month == month && o.year == year
}
์ด ํจ์๋ ๋ฏธ๋ฆฌ ์ ์๋ ํจ์์ธ isInstanceOf
์ asInstanceOf
๋ฅผ
์ฌ์ฉํ๋ค. ์ฒซ๋ฒ์งธ isInstanceOf
๋ Java์ instanceof
์ฐ์ฐ์์
๋์ผํ ์ผ์ ํ๋ค. ํจ์๊ฐ ํธ์ถ ๋ ๊ฐ์ฒด๊ฐ ํจ์์ ์ธ์๋ก ๋ค์ด์จ ํ์
์
์ธ์คํด์ค์ด๋ฉด ์ฐธ์ ๋ฆฌํดํ๋ค. ๋๋ฒ์งธ asInstanceOf
๋ Java์ ์บ์คํธ
์ฐ์ฐ์์ ๋์ผํ๋ค. ํธ์ถ ๋ ๊ฐ์ฒด๊ฐ ์ธ์๋ก ๋ค์ด์จ ํ์
์ ์ธ์คํด์ค์ด๋ฉด ๊ทธ๋ ๊ฒ
์ฌ๊ฒจ์ง๋๋ก ๋ณํํ๊ณ ์๋๋ผ๋ฉด ClassCastException
์ ๋ฐ์์ํจ๋ค.
์๋ ๋ง์ง๋ง์ผ๋ก ์ ์๋ ํจ์๋ ์์์ ํ๋จํ๋ ํจ์์ด๋ค. ์ฌ๊ธฐ์๋
error
๋ผ๋ ๋ ๋ค๋ฅธ ๋ฏธ๋ฆฌ ์ ์๋ ํจ์๊ฐ ์ฐ์๋๋ฐ, ์ด ํจ์๋
์ฃผ์ด์ง ์๋ฌ ๋ฉ์์ง์ ํจ๊ป ์์ธ๋ฅผ ๋ฐ์ ์ํค๋ ์ญํ ์ ํ๋ค.
def <(that: Any): Boolean = {
if (!that.isInstanceOf[Date])
error("cannot compare " + that + " and a Date")
val o = that.asInstanceOf[Date]
(year < o.year) ||
(year == o.year && (month < o.month ||
(month == o.month && day < o.day)))
}
์ด๊ฑธ๋ก Date
ํด๋์ค์ ์ ์๊ฐ ์์ฑ๋์๋ค. ์ด ํด๋์ค์ ์ธ์คํด์ค๋
๋ ์ง๋ก๋ ๋๋ ๋น๊ต๊ฐ๋ฅํ ์ด๋ค ๊ฐ์ฒด๋ก๋ ์ฌ๊ฒจ์ง ์ ์๋ค. ์ด๋ค์ ์์์
์ธ๊ธํ ์ฌ์ฏ๊ฐ์ง ๋น๊ต์ฐ์ฐ์ ๋ชจ๋ ๊ฐ์ง๊ณ ์๋๋ฐ, equals
์ <
๋
Date
ํด๋์ค์ ์ ์ ์์ ์ง์ ๊ตฌํ๋์ด ์๊ณ ๋๋จธ์ง๋ Ord
ํธ๋ ์์์ ์์ ๋ฐ์ ๊ฒ์ด๋ค.
ํธ๋ ์์ ์ฌ๊ธฐ์ ์๋ก ๋ ๊ฒฝ์ฐ ์ธ์๋ ๋ฌผ๋ก ๋ค์ํ๊ฒ ์ฌ์ฉ ๋ ์ ์๋ค. ํ์ง๋ง ๋ค์ํ ๊ฒฝ์ฐ๋ค์ ๋ํ์ฌ ๊น๊ฒ ๋ค๋ฃจ๋ ์ผ์ ์ด ๋ฌธ์์ ๋ฒ์ ๋ฐ์ด๋ค.
์ ๋ค๋ฆญํจ
์ด ํํ ๋ฆฌ์ผ์์ ๋ค๋ฃฐ Scala์ ๋ง์ง๋ง ํน์ง์ ์ ๋ค๋ฆญํจ์ด๋ค. Java ํ๋ก๊ทธ๋๋จธ๋ค์ Java์ ์ ๋ค๋ฆญ ์ง์์ด ๋ถ์กฑํ๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ ์ฌ๋ฌ๊ฐ์ง ๋ฌธ์ ์ ๋ค์ ๋ํด ์ ์๊ณ ์์ ๊ฒ์ด๋ค. ์ด ๋ฌธ์ ์ ๋ค์ Java 1.5์์ ๋ค๋ค์ก๋ค.
์ ๋ค๋ฆญํจ์ด๋ ์ฝ๋๋ฅผ ํ์
์ ๋ํ์ฌ ํ๋ผ๋ฏธํฐํ ํ ์ ์๋ ๋ฅ๋ ฅ์ด๋ค.
์ดํด๋ฅผ ๋๊ธฐ ์ํด ํ๋์ ์๋ฅผ ๋ค์ด ๋ณด์. ์ฐ๊ฒฐ ๋ฆฌ์คํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์์ฑํ๋
ํ๋ก๊ทธ๋๋จธ๋ ๋ฆฌ์คํธ์ ์์ ํ์
์ ๋๋์ฒด ๋ฌด์์ผ๋ก ํด์ผ ํ ์ง ๊ณ ๋ฏผ์
๋น ์ง๊ฒ ๋๋ค. ์ด ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ ์๋ก ๋ค๋ฅธ ๋ง์ ์ํฉ์์ ์ฌ์ฉ ๋ ์ ์๊ธฐ
๋๋ฌธ์ ์์์ ํ์
์ด ๋ฐ๋์ Int
๋๋ ๋ฐ๋์ Double
์ด ๋
๊ฒ์ด๋ผ ๋ฏธ๋ฆฌ ๊ฒฐ์ ํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๋ค. ์ด๋ ๊ฒ ๊ฒฐ์ ํด ๋๋ ์ผ์ ์์ ํ
์์์ ์ด๋ฉฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฌ์ฉ์ ์์ด ํ์ ์ด์์ ์ฌํ ์ ์ฝ์ผ๋ก ์์ฉ
ํ๋ค.
Java ํ๋ก๊ทธ๋๋จธ๋ ์ด์ฉ ์ ์์ด Object
๋ฅผ ์ฌ์ฉํ๊ณค ํ๋ค.
Object
๋ ๋ชจ๋ ๊ฐ์ฒด์ ์์ ํ์
์ด๊ธฐ ๋๋ฌธ์ด๋ค. ํ์ง๋ง ์ด๋ฐ ๋ฐฉ๋ฒ์
์ด์์ ์ด์ง ์๋ค. int
, long
, float
๋ฑ๊ณผ ๊ฐ์
๊ธฐ๋ณธ ํ์
์ ๋ํด ๋์ํ์ง ์์ผ๋ฉฐ, ์ฐ๊ฒฐ ๋ฆฌ์คํธ์์ ์์๋ฅผ ๊ฐ์ ธ ์ฌ ๋๋ง๋ค
๋ง์ ๋์ ํ์
์บ์คํธ๋ค์ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ง์ ์ฝ์
ํด ์ฃผ์ด์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
Scala๋ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ์ ๋ค๋ฆญ ํด๋์ค์ ์ ๋ค๋ฆญ ํจ์๋ฅผ ์ง์ํ๋ค. ์์ ๋ก ํจ๊ป ์ดํด๋ณด์. ์์ ๋ ๋ ํผ๋ฐ์ค๋ผ๋ ๊ฐ๋จํ ์ ์ฅ๊ตฌ์กฐ ํด๋์ค์ด๋ค. ์ด ํด๋์ค๋ ๋น์ด์๊ฑฐ๋ ๋๋ ์ด๋ค ํ์ ์ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๊ฐ ๋๋ค.
class Reference[T] {
private var contents: T = _
def set(value: T) { contents = value }
def get: T = contents
}
ํด๋์ค Reference
๋ ํ์
T
์ ๋ํด ํ๋ผ๋ฏธํฐํ ๋์ด์๋ค.
ํ์
T
๋ ๋ ํผ๋ฐ์ค์ ์์ ํ์
์ด๋ค. ์ด ํ์
์ ํด๋์ค ๋ด๋ถ
์ฌ๋ฌ ๊ณณ์์ ๋ํ๋๋๋ฐ, contents
๋ณ์์ ํ์
์ผ๋ก, set
ํจ์์ ์ธ์ ํ์
์ผ๋ก, ๊ทธ๋ฆฌ๊ณ get
ํจ์์ ๋ฆฌํด ํ์
์ผ๋ก ์ฌ์ฉ ๋๋ค.
์์ ์ฝ๋ ์ํ์ Scala์์ ํ๋ ๋ณ์๋ฅผ ๋ง๋๋ ๋ด์ฉ์ด๋ฏ๋ก ๋ฐ๋ก ์ค๋ช
์ด
ํ์ ์๋ค. ํ๊ฐ์ง ํฅ๋ฏธ๋ก์ด ์ ์ด ์๋ค๋ฉด ๋ณ์์ ์ด๊ธฐ๊ฐ์ด _
๋ก ์ฃผ์ด์ ธ
์๋ค๋ ๊ฒ์ธ๋ฐ, ์ฌ๊ธฐ์ _
๋ ๊ธฐ๋ณธ๊ฐ์ ๋ปํ๋ค. ๊ธฐ๋ณธ๊ฐ์ ์ ํ์
์
๋ํด์ 0, Boolean
ํ์
์ ๋ํด์ false
, Unit
ํ์
์ ๋ํด ()
, ๊ทธ๋ฆฌ๊ณ ๋ชจ๋ ๊ฐ์ฒด ํ์
์ ๋ํด null
์ด๋ค.
Reference
ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ํ์
ํ๋ผ๋ฏธํฐ T
์ ๋ํด ์ ๋นํ
ํ์
์ ์ง์ ํด ์ฃผ์ด์ผ ํ๋ค. ์ด ํ์
์ ๋ ํผ๋ฐ์ค ์์ ๋ค์ด๊ฐ ์์์
ํ์
์ด ๋๋ค. ์๋ฅผ ๋ค์ด, ์ ์ ๊ฐ์ ์ ์ฅ ํ ์ ์๋ ๋ ํผ๋ฐ์ค๋ฅผ ์์ฑํ๊ณ
์ฌ์ฉํ๊ธฐ ์ํด์๋ ๋ค์๊ณผ ๊ฐ์ด ์ด๋ค:
object IntegerReference {
def main(args: Array[String]): Unit = {
val cell = new Reference[Int]
cell.set(13)
println("Reference contains the half of " + (cell.get * 2))
}
}
์ ์์ ์์ ๋ณด๋ฏ get
ํจ์์ ๋ฆฌํด๊ฐ์ ์ ์์ฒ๋ผ ์ฌ์ฉํ๊ธฐ ์ํด
๋ฐ๋ก ์บ์คํ
์ด ํ์ํ์ง ์๋ค. ์ฌ๊ธฐ์ ์ ์๋ ๋ ํผ๋ฐ์ค๋ ์ ์๋ฅผ ํฌํจํ๋๋ก
์ ์ธ์ด ๋์ด ์์ผ๋ฏ๋ก ์ ์ ์ธ์ ๋ค๋ฅธ ๊ฒ์ ๋ฃ์ ์ ์๋ค.
๋ง์น๋ฉฐ
์ฐ๋ฆฌ๋ ์ง๊ธ๊น์ง Scala ์ธ์ด์ ๊ฐ๋ตํ ์๊ฐ์ ๋ช๊ฐ์ง์ ์์ ๋ฅผ ์ดํด ๋ณด์๋ค. ํฅ๋ฏธ๊ฐ ์๊ฒผ๋ค๋ฉด Tour of Scala๋ ํจ๊ป ์ฝ์ด๋ณด์. ๋ ์์ค ๋๊ณ ๋ค์ํ ์์ ๋ฅผ ๋ง๋ ์ ์๋ค. ํ์ ํ ๋๋ง๋ค Scala Language Specification์ ์ฐธ๊ณ ํ๋ ๊ฒ๋ ์ข๋ค.