1์ฃผ์ฐจ (1 ~ 5 Chapter)
Chapter 01 ํ์ฅ ๊ฐ๋ฅํ ์ธ์ด
์ค์นผ๋ผ(Scala) ๋ผ๋ ์ด๋ฆ์ ํ์ฅ ๊ฐ๋ฅํ ์ธ์ด(Scalable) ๋ผ๋ ๋ป์ด๋ค. ์ด๋ ๊ฒ ์ด๋ฆ์ ์ง์ ์ด์ ๋ ์ค์นผ๋ผ๋ฅผ ์ฌ์ฉ์์ ์๊ตฌ์ ๋ฐ๋ผ ์๋ ์ ์๋ ์ธ์ด๋ก ์ค๊ณํ๊ธฐ ๋๋ฌธ์ด๋ค.
scalable
์ ๊ท๋ชจ๋ฅผ ๋์ด๊ณ ์ค์ด๋๊ฒ ์์ ๋กญ๋ค๋ ๋ป์ด๋ฉฐ,
๋ณดํต ๊ท๋ชจ๊ฐ ๋์ด๋๊ฑฐ๋ ์ค์ด๋ค์ด๋ ์ฑ๋ฅ์ด๋ ๋น์ฉ์ด ์ ํ์ ์ผ๋ก ์ฆ๊ฐํ๋ค๋ ๋ป์ด๋ค.
์ค์นผ๋ผ๋ ๊ฐ์ฒด์งํฅ (Object Oriented) ๊ณผ ํจ์ํ (Functional) ํ๋ก๊ทธ๋๋ฐ ๊ฐ๋ ์ ์ ์ ํ์ ์ธ์ด (Statically Typed Language) ์ ํฉ์ณ๋์ ์ธ์ด์ด๋ค.
1.1 ์ฌ๋ฌ๋ถ์ ๋ง์์์ ์ ์ ์๋ผ๋๋ ์ธ์ด (a language that grows on you)
var captial = Map("US" -> "Washington", "France" -> "Paris")
capital += ("Japan" -> "Tokyo")
println(capital("France"))
์์ ๊ฐ์ด ๋์ ์์ค์ ๊ฐ๊ฒฐํ๊ณ , ๋ถํ์ํ ์ธ๋ฏธ์ฝ๋ก ์ด๋ ํ์ ์ง์ ์ผ๋ก ์ธํด ์ง์ ๋ถํ์ง ์๊ฒ ์ฝ๋ ์์ฑ์ด ๊ฐ๋ฅํ๋ค.
์ด๋ค์ ๊ณตํต์ ์ธ ํน์ง์ ์ฐ๊ด๋งต์ ์ธ์ด์์ค์์ ์ง์ํ๋ค๋ ์ ์ด๋ค.
์๋ก์ด ํ์ ์ ํค์๊ฐ๊ธฐ
์ค์นผ๋ผ๋ ์ค์นผ๋ผ๋ฅผ ์ฌ์ฉํ๋ ์ฌ๋๋ค์ด ํ์ฅํ๊ณ ๋ณ๊ฒฝํ ์ ์๋๋ก ์ค๊ณํ๋ค. (Growing a language)
def factorial(x: BigInt): BigInt =
if (x == 0)
1
else
x * factorial(x - 1)
factorial(30)
์ ํธ์ถํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ ์๋ค.
265252859812191058636308480000000
๋ฐํ ํ์
์ธ BigInt
๋ ๋ง์น ๋ด์ฅ ํ์
์ธ๊ฒ ์ฒ๋ผ ๋ณด์ด์ง๋ง ์ค์นผ๋ผ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ค์ด์๋ ํ๋ฒํ ํด๋์ค์ผ ๋ฟ์ด๋ค.
์๋ฅผ ๋ค์ด Java ์์ ์ง์ํ๋ BigInteger
๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํํ๋ ๊ฒ ์ด๋ค.
import java.math.BigInteger
def factorial(x: BigInteger): BigInteger =
if (x == BigInteger.ZERO)
BigInteger.ONE
else
x.multiply(factorial(x.subtract(BigInteger.ONE)))
์์ ๊ฐ์ ์ฝ๋๋ ๋ด์ฅํ์ ์ด ๊ทธ์ ๋ง๋ ๋ฉ์๋๋ ๊ธฐ๋ฅ์ ์ ๊ณตํด์ค์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ค์ํ ํ๊ฒฝ์์ ์ ์ฐํ๊ฒ ์ ์ฉํ๊ธฐ ์ด๋ ค์ธ ๊ฒ์ด๋ค.
๊ฐ๋ น ์ญ์ง์, ๋ณต์์, ์ ๋ฆฌ์, ์ ๋ขฐ๊ตฌ๊ฐ, ๋คํญ์ ๋ฑ์ ๋ชจ๋ ๊ธฐ๋ฅ์ ํ๋์ ์ธ์ด์์ ๋ชจ๋ ๊ฒ์ ์ ๊ณตํ๋ ๊ฒ์ ํ์ฅ์ฑ์ด ์ข์ง ์๋ค.
์ค์นผ๋ผ๋ ์ธ์ด๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์ํ๋๊ฒ ์ฒ๋ผ ์ฌ์ฉ์๊ฐ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ๊ณตํ๋ ๋ฐฉ์์ผ๋ก ์ฌ์ฉ์๊ฐ ํ์ํ ๋ฐฉํฅ์ผ๋ก ํ์ฅํ๊ณ ๊ณ ์น ์ ์๊ฒ ํ์ฉํ๋ค.
์๋ก์ด ์ ์ด ๊ตฌ์กฐ ํค์๊ฐ๊ธฐ
์ค์นผ๋ผ์ ํ์ฅ์ฑ ์์น์ ์ ์ด ๊ตฌ์กฐ์๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์ ์ฉ๋๋ค.
์ด๋ฌํ ํ์ ์ฑ์ ์กํฐ ๊ธฐ๋ฐ ๋์์ ํ๋ก๊ทธ๋๋ฐ (Actor-based concurrent programming) ์ค์นผ๋ผ API ์ธ ์์นด(Akka) ์์ ๋ณผ ์ ์๋ค.
๋์์ฑ ํ๋ก๊ทธ๋๋ฐ์ ์์ฑํ๋ ์ผ์ ๊ฝค ์ด๋ ค์ฐ๋ฉฐ ์๋ฐ์ ์ค๋ ๋ ๋ชจ๋ธ์ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ (Shared Memory) ์ ๋ฝ (Lock) ๊ธฐ๋ฐ์ผ๋ก ํ๋ฉฐ ์ฝ๋๋ฅผ ๋ณด๊ณ ๋
ผ๋ฆฌ์ ์ผ๋ก ์ถ๋ก ํ๊ธฐ๊ฐ ์ด๋ ต๋ค.
์ฝ๋์ ์จ์ด์๋ ๊ฒฝํฉ ์กฐ๊ฑด (race condition) ์ด๋ ๊ต์ฐฉ ์ํ (deadlock) ์ด ์๋ค๊ณ ํ์ ํ๊ธฐ๋ ์ด๋ ต๋ค.
์์ ํ ๋์์ ์ผ๋ญ (Erlang) ํ๋ก๊ทธ๋๋ฐ์์ ์ฌ์ฉํ๋ ์กํฐ ๊ฐ์ ๋ฉ์ธ์ง ์ ๋ฌ ์ํคํ ์ณ์ด๋ค.
๋ค์ ์ฝ๋๋ recipient ๋ผ๋ ์กํฐ์ ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ด๋ ๋ฌธ์ฅ์ด๋ค.
recipient ! msg
์ก์ ์ ๋น๋๊ธฐ์ (asynchronous) ์ด๋ฉฐ ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ธ ์กํฐ๋ ์์ ๊ฐ๊ฐ ๋ฉ์ธ์ง๋ฅผ ์์ ํ ๋ ๊น์ง ๊ธฐ๋ค๋ฆด ํ์ ์์ด ์ฆ์ ๋ค์ ์์ ์ ์งํํ ์ ์๋ค.
๋ชจ๋ ์กํฐ๋ ์ฐํธํจ (mailbox) ๊ฐ ์์ผ๋ฉฐ ์ฐํธํจ์ ๋์ฐฉํ ๋ฉ์ธ์ง๋ receive
๋ธ๋ญ์ ์ด์ฉํ์ฌ ์ฒ๋ฆฌํ๋ค.
def receive = {
case Msg1 => ... // Msg1์ ์ฒ๋ฆฌํจ
case Msg2 => ... // Msg2๋ฅผ ์ฒ๋ฆฌํจ
}
์ฃผ์ด์ง ์ฌ๋ฌ case ๋ฅผ ๋ง์กฑํ๋ ๋ฉ์ธ์ง๊ฐ ์ฐํธํจ์ ์์ ๊ฒฝ์ฐ ์กํฐ๋ ๋์์ ๋ฉ์ถ๊ฐ ๋ค์ ๋ฉ์ธ์ง๊ฐ ๋์ฐฉํ ๋ ๊น์ง ๊ธฐ๋ค๋ฆฐ๋ค.
๋ค์์ ์ฒดํฌ์ฌ (checksum) ๊ณ์ฐ ์๋น์ค๋ฅผ ๊ตฌํํ๋ ์์นด ์กํฐ๋ค.
class CheckSumActor extends Actor {
var sum = 0
def receive = {
case Data(byte) => sum += byte
case GetChecksum(requester) =>
val checksum = ~(sum & 0xFF) + 1
requester ! checksum
}
}
์ ์ฝ๋๋ receive
๋ธ๋ญ์ ์ ์ํ ํ
Data
๋ฉ์ธ์ง๋ฅผ ๋ฐ์ผ๋ฉด ๊ทธ ์์ ๋ค์ด์๋ ๋ฐ์ดํฐ (byte) ์ sum ๋ณ์๋ฅผ ๋ํ๋ค.
GetChecksum
๋ฉ์ธ์ง๋ฅผ ๋ฐ์ผ๋ฉด sum ์ ํ์ฌ๊ฐ์ ์ด์ฉํ์ฌ ์ฒดํฌ์ฌ์ ๊ณ์ฐํ ๋ค์ ์์ฒญํ requester
์๊ฒ requester ! checksum
์ด๋ผ๋ ์ก์ ๋ช
๋ น์ ์ฌ์ฉํ์ฌ ๊ฒฐ๊ด๊ฐ์ ์ ์กํ๋ค.
์ด ์ฝ๋์์ receive
๋ ๋ฉ์ธ์ง ์ก์ (!) ์ ์ค์นผ๋ผ๊ฐ ์ ๊ณตํ๋ ๋ด์ฅ ๊ธฐ๋ฅ์ด ์๋๋ผ ์กํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ ๊ณตํ๋ ๋ฉ์๋์ ๋ถ๊ณผํ๋ฉฐ, ์ค์นผ๋ผ ํ๋ก๊ทธ๋๋ฐ๊ณผ๋ ๋ณ๊ฐ์ ์ ์๋ ๋ฉ์๋๋ฅผ ๋์์ํค๋ ๊ฒ์ด๋ค.
์กํฐ ๋ชจ๋ธ์ด ๋ถ์ฐ ์ปดํจํ ์ ๊ตฌํํ๋๋ฐ ๋งค์ฐ ์ ์ ํ ๋๊ตฌ์ด์ง๋ง ์ด๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์๋ ๋ถ๊ตฌํ๊ณ ์ค์นผ๋ผ ์ธ์ด์ ํ๋์ธ๊ฒ์ฒ๋ผ ๋ณด์ด๋ฉฐ, ์ด๋ ๋ง์น ์ ์ด์ ๊ทธ ๊ธฐ๋ฅ์ ์๋ ์ธ์ด๊ฐ ์ง์ํ๋๊ฒ ์ฒ๋ผ ๋๋ผ๊ฒ ํ ์ ์๋ค.
1.2 ์ค์นผ๋ผ์ ํ์ฅ์ฑ์ด ๊ฐ๋ฅํ ์ด์
์ค์นผ๋ผ์ ํ์ฅ์ฑ์ ๊ฐ์ฅ ํฐ ์ํฅ์ ๋ผ์น๋ ์์ธ์ ๊ฐ์ฒด ์งํฅ๊ณผ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ์กฐํฉ์ด๋ค.
์ค์นผ๋ผ์์๋ ํจ์ซ๊ฐ๋ ๊ฐ์ฒด์ด๋ค.
์์์ ๋ณด์ฌ์ค ์กํฐ์ ๊ฐ๋
์ ํจ์์ ๊ฐ์ฒด๋ฅผ ํตํฉํ์ง ์์๋ค๋ฉด ๊ตฌํํ ์ ์์์ ๊ฒ์ด๋ค.
์ค์นผ๋ผ๋ ๊ฐ์ฒด์งํฅ์ ์ด๋ค
์ค์นผ๋ผ๋ ์์ํ ํํ์ ๊ฐ์ฒด์งํฅ ์ธ์ด์ด๋ค.
๋ชจ๋ ๊ฐ์ด ๊ฐ์ฒด์ด๋ฉฐ, ๋ชจ๋ ์ฐ์ฐ์ ๋ฉ์๋ ํธ์ถ์ด๋ค.
๊ฐ๋ น 1 + 2
๋ผ๊ณ ์ฐ๋ฉด, ์ค์ ๋ก๋ Int
ํด๋์ค๊ฐ ์ ์ํ +
๋ผ๋ ์ด๋ฆ์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ๊ฒ์ด๋ค.
์ค์นผ๋ผ์ ํธ๋ ์ดํธ (trait) ๋ฅผ ์ด์ฉํ๋ฉด ๋ฏน์ค์ธ (mixin) ์กฐํฉ์ ํตํ์ฌ ํด๋์ค์ ์ฌ๋ฌ๊ฐ์ง ์ธก๋ฉด์ ๊ฐ๊ฐ ๋ณ๋์ ํธ๋ ์ดํธ์ ์บก์ํ (encapsulate) ํ ์ ์๋ค.
ํธ๋ ์ดํธ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค์ค ์์์ ๊ณ ์ ์ ๋ฌธ์ ์ธ '๋ค์ด์๋ชฌ๋ ์์' ์ ํผํ ์ ์๋ค.
๋ค์ด์๋ชฌ๋ ์์
๋์ผํ ํด๋์ค๋ฅผ ์ฌ๋ฌ ๊ฒฝ๋ก๋ฅผ ํตํด ์ฌ๋ฌ๋ฒ ์์ํ๋ ๊ฒฝ์ฐ
Java ์์๋ ๋ค์ค ์์์ ์ง์ํ์ง ์์ผ๋ฉฐ C++ ๊ฐ์ ๊ฒฝ์ฐ์๋ ์ํฐํจํด์ผ๋ก ์ฌ์ฉ์ ์ง์ํ๋ค.
์ค์นผ๋ผ๋ ํจ์ํ์ด๋ค
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ๋๊ฐ์ง ์ฃผ์ ์์ด๋์ด์์ ๋ฐฉํฅ์ด ๊ฒฐ์ ๋๋ค.
1๊ธ ๊ณ์ธต (First Class) ์ด๋ค
ํจ์ํ ์ธ์ด์์์ ํจ์๋ ์ ์๋ ๋ฌธ์์ด๊ณผ ๋์ผํ ์๊ฒฉ์ ๊ฐ๋ ๊ฐ์ด๋ค.
์ด๋ ๋ค์๊ณผ ๊ฐ์ ํน์ฑ์ ๊ฐ๋๋ค.
- ํจ์๋ฅผ ๋ค๋ฅธ ํจ์์ ์ธ์๋ก ๋๊ธธ์ ์๋ค.
- ํจ์ ์์์ ๊ฒฐ๊ณผ๋ก ํจ์๋ฅผ ๋ฐํํ ์ ์๋ค.
- ํจ์๋ฅผ ๋ณ์์ ์ ์ฅํ ์ ์๋ค.
- ํจ์์์์ ํจ์๋ฅผ ์ ์ํ ์ ์๋ค.
ํ๋ก๊ทธ๋จ์ ์ ๋ ฅ๊ฐ์ ์ถ๋ ฅ๊ฐ์ผ๋ก ๋ณํํด์ผ ํ๋ฉฐ, ๋ฐ์ดํฐ๋ฅผ ๊ทธ ์๋ฆฌ์์ ๋ณ๊ฒฝํ์ง ๋ง์์ผ ํ๋ค๋ ์ ์ด๋ค
์๋ฅผ ๋ค๋ฉด s.replace(",", ":")
์ ์๋ก์ด ๋ฌธ์์ด ๊ฐ์ฒด๊ฐ ์๊ธฐ๋ฉฐ ๊ธฐ์กด s
์๋ ๋ค๋ฅด๋ค.
์ด๋ ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅ (immutable) ๊ณผ ๋ณ๊ฒฝ ๊ฐ๋ฅ (mutable) ์ ํน์ฑ๊ณผ๋ ์ ์ฌํ๋ฐ ๊ฐ ์ธ์ด์ ์ฑ๊ฒฉ๋ง๋ค ๋ค๋ฅด๋ค.
๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ ํจ์ํ ํ๋ก๊ทธ๋จ์ ์ด์ ์ค ํ๋์ด๋ค.
์ค์นผ๋ผ์ ๊ฒฝ์ฐ ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ก์จ ๋ฆฌ์คํธ, ํํ, ๋งต, ์งํฉ์ ์ ๊ณตํ๋ค.
๋ํ replace
์ ๊ฐ์ด ์์คํ
์ ๋ค๋ฅธ ์ํฅ์ ์ฃผ์ง ์๋ ๋ฉ์๋๋ฅผ ์ฐธ์กฐ ํฌ๋ช
(referentially transparent) ํ๋ค ํ๋ค.
ํจ์ํ ์ธ์ด๋ ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅํ ๋ฐ์ดํฐ์ ์ฐธ์กฐ ํฌ๋ช ํ ๋ฉ์๋๋ฅผ ์ฅ๋ คํ๋ค.
1.3 ์ ์ค์นผ๋ผ์ธ๊ฐ?
์ค์นผ๋ผ๋ ํ์ฅ์ฑ ๋ง๊ณ ๋ ๋ค์ ๋ค๊ฐ์ง ์ธก๋ฉด์ด ํน์ง์ ์ด๋ค.
- ํธํ์ฑ
- ๊ฐ๊ฒฐ์ฑ
- ๊ณ ์์ค ์ถ์ํ
- ๊ณ ๊ธ ์ ์ ํ์
์ค์นผ๋ผ๋ ํธํ์ฑ์ด ์ข๋ค
์ค์นผ๋ผ ํ๋ก๊ทธ๋จ์ JVM์ ๋ฐ์ดํธ ์ฝ๋๋ก ์ปดํ์ผ ๋๋ค.
์์ ํ ์ํธ์ด์ฉ์ฑ (interoperability) ์ ๋ ๋ค๋ฅธ ์ธก๋ฉด์ผ๋ก๋ ์ค์นผ๋ผ๊ฐ ์๋ฐ ํ์ ์ ์์ฃผ ๋ง์ด ์ฌ์ฌ์ฉํ๋ค๋ ์ ์ด๋ค.
์๋ฐ์ ํ์ ์ ์ฌ์ฌ์ฉํ๋ ๋ฟ๋ง์ด ์๋๋ผ ์ฌ์ ์ (redefinition) ํ์ฌ ์ฌ์ฉํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค.
์๋ฅผ ๋ค๋ฉด ์ค์นผ๋ผ ๋ฌธ์์ด์ ์์ ์ ์ ์๋ ๋ถ๋์์์ ์ผ๋ก ๋ฐ๊พธ๋ toInt
๋ toFloat
๋ฅผ ์ง์ํ๋ค.
์ค์นผ๋ผ์์๋ ์์์ ํ๋ณํ (implicit conversion) ์ ์ ์ํ ์ ์๋ค.
์ค์นผ๋ผ๋ ๊ฐ๊ฒฐํ๋ค
ํ๋ก๊ทธ๋จ์ ์ดํดํ๊ณ ์ฝ๊ธฐ ์ํ ๋ ธ๋ ฅ์ด ๋ ๋ค๊ณ , ๊ทธ์ ๋ฐ๋ฅธ ์ค๋ฅ๊ฐ๋ฅ์ฑ์ด ์ค์ด๋ ๋ค๋ ๊ฒ์ด๋ค.
class MyClass {
private int index;
private String name;
public MyClass(int index, String name) {
this.index = index;
this.name = name;
}
}
์ ์๋ฐ ์ฝ๋๋ฅผ ์๋์ ๊ฐ์ ์ค์นผ๋ผ ์ฝ๋๋ก ๋ฐ๊ฟ์ ์๋ค.
class MyClass(index: Int, name: String)
์ค์นผ๋ผ์ ํ์
์ถ๋ก (type inference) ์ ์ด๋ฐ ๊ฐ๊ฒฐ์ฑ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ๋ ๋ค๋ฅธ ์์์ด๋ค.
๋ฐ๋ณต์ ์ผ๋ก ํ์
์ ๋ณด๋ฅผ ์ธ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์, ํ๋ก๊ทธ๋จ์ด ๋ ์ด์์ ํ๊ณ ๋ ์ฝ๊ธฐ ์ข์์ง๋ค.
์ค์นผ๋ผ๋ ์ผ๋ฐ์ ์ธ ๋์๋ค์ ๋ฌถ์ด์ ๊ฐ๋ ฅํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ์ํ ์ ์๋ ๋๊ตฌ๋ฅผ ๋ง์ด ์ ๊ณตํ๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ ํด๋์ค์ ์ฌ๋ฌ ์ธก๋ฉด์ ๊ฐ๊ฐ ๋ณ๋์ ํธ๋ ์ดํธ์ ๋ถ๋ฆฌํด ๋ฃ์์ ์์ด ์ ์ฐํ๊ฒ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
์ค์นผ๋ผ๋ ๊ณ ์์ค์ด๋ค
์๋ ์ฝ๋๋ ์๋ฐ์์ ๋์๋๋ ๋ฌธ์์ด์ ๋๋ฌธ์๊ฐ ๋ค์ด์๋์ง ํ์ธํ๋ ์ฝ๋์ด๋ค.
boolean nameHasUpperCase = false;
for (int i = 0; i < name.length(); ++i) {
if (Character.isUpperCase(name.charAt(i))) {
nameHasUpperCase = true;
break;
}
}
์ ์ฝ๋๋ ์ค์นผ๋ผ๋ก ์๋์ ๊ฐ์ด ์ธ ์ ์๋ค.
val nameHashUpperCase = name.exists(_.isUpper)
๋ฌผ๋ก Java 8 ์ดํ๋ถํฐ๋ ๋๋ค (lambda) ์ ์คํธ๋ฆผ (stream) ์ ๋ํ ์ง์์ด ๋ค์ด๊ฐ๊ธฐ ๋๋ฌธ์ ์ค์นผ๋ผ์์๋ ๋น์ทํ ์ฐ์ฐ์ด ๊ฐ๋ฅํด์ก๋ค.
boolean nameHasUpperCase =
name.chars().anyMatch(
(int ch) -> Character.isUpperCase((char) ch)
)
์ด์ ๋ฒ์ ์ ๋นํ๋ฉด ์์ฒญ๋ ๊ฐ์ ์ด์ง๋ง Java 8 ์ฝ๋๋ ์ฌ์ ํ ์ค์นผ๋ผ ์ฝ๋๋ณด๋ค๋ ๋ฒ์ก์ค๋ฌ์ ๋ณด์ธ๋ค.
์ค์นผ๋ผ๋ ์ ์ ํ์ ์ธ์ด๋ค
์ค์นผ๋ผ๋ ์์ฃผ ์ง๋ณด์ ์ธ ์ ์ ํ์ ์์คํ (static type system) ์ ๊ฐ์ง ์ธ์ด๋ก์จ ๋ค์์ ์ ๊ณตํ๋ค.
- ์๋ฐ์ ๋น์ทํ ์์ค์ ์ค์ฒฉ ํด๋์ค ํ์
- ์ ๋ค๋ฆญ (Generic) ๊ณผ ํ๋ผ๋ฏธํฐํํ ํ์ ์ ํ์ฉ
- ๊ต์งํฉ (intersection) ์ ์ฌ์ฉํ์ฌ ํ์ ์ ์กฐํฉํ ์ ์๋ค
- ์ถ์ ํ์ (abstract type) ์ ์ฌ์ฉํ์ฌ ์ด๋ค ํ์ ์์ ์์ธ ๋ด์ฉ์ ๊ฐ์ถ ์ ์๋ค
์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํ ์ปดํฌ๋ํธ์ ์ธํฐํ์ด์ค๋ฅผ ์ด๋ฃจ๋ ๋ฉค๋ฒ์ ํ์ ์๊ทธ๋์ณ (signature) ๋ ๋ช ์ํด์ผํ๋ค.
1.4 ์ค์นผ๋ผ์ ๋ฟ๋ฆฌ
์ค์นผ๋ผ๋ ๋ง์ ์ธ์ด๋ค๋ก๋ถํฐ ์์ด๋์ด์ ์ํฅ์ ๋ฐ์ ์๋ค.
์ค์นผ๋ผ์ ์ถ์ํ ํ์ ์ ์ ๋ค๋ฆญํ์ ๋ณด๋ค ๋ ๊ฐ์ฒด์งํฅ์ ์ธ ๋์์ด ๋ ์ ์๋ค.
์ค์นผ๋ผ ํธ๋ ์ดํธ๋ ๋ ์ ์ฐํ ์ปดํฌ๋ํธ ์กฐ๋ฆฝ์ ํ์ฉํ๋ฉฐ, ์ต์คํธ๋ํฐ (extractor) ๋ ํจํด ๋งค์น๋ฅผ ๋ด๋ถ ํํ๊ณผ ๋ถ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค.
1.5 ๊ฒฐ๋ก
์ค์นผ๋ผ์ ํ์ ์์คํ ๊ณผ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ํ๋ก๊ทธ๋จ์ ์ฌ๊ณ ๋ฐฉ์์ ๋ฐ๊ฟ ์ ์๋ ์ง์ ์ธ ๊ฒฝํ์ ์ ๊ณตํ๋ค๋ ์ฌ์ค์ ์ฒด๊ฐํ๋ค.
Chapter 02 ์ค์นผ๋ผ ์ฒซ๊ฑธ์
2.1 1๋จ๊ณ: ์ค์นผ๋ผ ์ธํฐํ๋ฆฌํฐ ์ฌ์ฉ๋ฒ์ ์ตํ์
์ค์นผ๋ผ๋ฅผ ์์ํ๊ธฐ ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ ์ค์นผ๋ผ ์ธํฐํ๋ฆฌํฐ (๋ํํ Shell) ์ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.
ํํ์ (expression) ์ ์ ๋ ฅํ๋ฉด ์ธํฐํ๋ฆฌํฐ๊ฐ ๊ทธ ํํ์์ ๊ณ์ฐํด์ ๊ฒฐ๊ด๊ฐ์ ์ถ๋ ฅํ ๊ฒ์ด๋ค.
$ scala
Welcome to Scala version 2.11.7
Type in expressions to have them evaluated.
Type :help for more information.
scala>
1 + 2 ์ ๊ฐ์ ํํ์์ ์ ๋ ฅํ๊ณ ์ํฐ๋ฅผ ๋๋ฅด์
scala> 1 + 2
๋ค์๊ณผ ๊ฐ์ด ์๋ตํ๋ค.
res0: Int = 3
res{๋ฒํธ}
์ ์๋ณ์ (identifier) ๋ ๋์ค์ ์ฌ์ฉํ ์ ์๋ค.
๋ง์ฝ res0
๊ฐ 3
์ผ๋ก ์ ํด์ก์ผ๋ฉด ์๋์ ๊ฐ์ด ํด๋น ์๋ณ์์ 3์ ๊ณฑํ๋ฉด 9๋ฅผ ์ถ๋ ฅํ๋ค.
scala> res0 * 3
res1: Int = 9
Hello World ์ถ๋ ฅ์ ๋ค์๊ณผ ๊ฐ๋ค.
scala> println("Hello, world!")
Hello, world!
2.2 2๋จ๊ณ: ๋ณ์๋ฅผ ์ ์ํด๋ณด์
์ค์นผ๋ผ์๋ ๋๊ฐ์ง ์ข
๋ฅ์ ๋ณ์๊ฐ ์๋๋ฐ val
๊ณผ var
์ด๋ฉฐ ํน์ง์ ๋ค์๊ณผ ๊ฐ๋ค.
- val : ๋ถ๋ณ (immutable)
- var : ๊ฐ๋ณ (mutable)
๋ํ ์ค์นผ๋ผ๋ ์๋์ ๊ฐ์ด ํ์ ์ถ๋ก ์ด ๊ฐ๋ฅํ๋ค.
scala> val msg = "Hello, world!"
msg: String = Hello, world!
2.3 3๋จ๊ณ: ํจ์๋ฅผ ์ ์ํด๋ณด์
์ค์นผ๋ผ์์๋ ํจ์์ ์ ์๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ํ๋ค.
def max(x: Int, y: Int): Int = {
if (x > y)
x
else
y
}
์ ์ฝ๋๋ ์๋์ ๊ฐ์ด ์ค๊ดํธ๋ฅผ ์๋ตํ์ฌ ํํ์ด ๊ฐ๋ฅํ๋ค.
def max(x: Int, y: Int) = if (x > y) x else y
์ค์นผ๋ผ ์ปดํ์ผ๋ฌ๊ฐ ํจ์์ ๋ฐํ ํ์ ์ ๋ฐ๋์ ์ง์ ํ๋๋ก ์๊ตฌํ๋ ๊ฒฝ์ฐ๊ฐ ์๋๋ฐ ์ด๋ ํจ์๊ฐ ์ฌ๊ท์ (recursive) ์ด๋ผ๋ฉด ๋ฐ๋์ ๋ฐํ ํ์ ์ ๋ช ์ํด์ผ ํ๋ค.
๋ง์ฝ ํจ์๊ฐ ์ด๋ค ๊ด์ฌ์ด ์์๋งํ ๊ฒฐ๊ณผ๋ฅผ ๋๋ ค์ฃผ์ง ์๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ๋ก ์๋์ ๊ฐ์ ๊ฒฝ์ฐ๋ค.
def greet() = println("Hello, world!")
greet()
ํจ์๋ฅผ ์ ์ํ๋ฉด ์ธํฐํ๋ฆฌํฐ๊ฐ greet: ()Unit
์ด๋ผ๊ณ ์๋ตํ ๊ฒ์ด๋ค.
Unit
์ greet
ํจ์์ ๋ฐํ ํ์
์ธ๋ฐ ์ด๋ ์ฐ๋ฆฌ๊ฐ ๊ด์ฌ์ ๊ฐ์ง ๋งํ ๊ฐ์ ๋ฐํํ์ง ์๋๋ค๋ ๋ป์ด๋ค.
์ด๋ ์๋ฐ์ void
์ ๋น์ทํ ์ญํ์ ํ๋ฉฐ ์ค์นผ๋ผ์์๋ ๋ชจ๋ Unit
์ ๋ฐํํ๋ ๋ฉ์๋๊ฐ ๋๋ค.
์ฆ, ๋ฐํ ํ์
์ด Unit
์ธ ๋ฉ์๋๋ ๋ถ์ํจ๊ณผ๋ฅผ ์ํด์๋ง ์คํํ๋ ํจ์์ด๋ค.
2.4 4๋จ๊ณ: ์ค์นผ๋ผ ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํด๋ณด์
println("Hello, " + args(0) + "!" )
$ scala helloarg.scala planet
Hello, planet!
์ค์นผ๋ผ ๋ฐฐ์ด์ ์ฒซ๋ฒ์งธ ์์๋ args[0]
์ด ์๋๊ณ args(0)
์ด๋ค.
2.5 5๋จ๊ณ: while๋ก ๋ฃจํ๋ฅผ ๋๊ณ , if๋ก ๊ฒฐ์ ํด๋ณด์
var i = 0
while (i < args.length) {
if (i != 0)
println(" ")
println(args(i))
i += 1
}
์ด ์ฝ๋๋ ๋ช ๋ นํ ์คํ์ผ์ด๋ฉฐ ์๋์ ์ง์ํ๋ ๋ช ๋ น์ ํ ๋ฒ์ ํ๋์ฉ ์ฌ์ฉํ๋ ๋ฐฉ์์ด๋ค.
์ ์ฝ๋๋ ์์์ผ ๋ฟ ๋ค์์ ๋ฐฐ์ธ ๋ฐฐ์ด์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํด ์ดํฐ๋ ์ด์ ํ๋ ๊ฒ์ด ๋ ๋์ ์ ๊ทผ๋ฐฉ๋ฒ์ด๋ค.
2.6 6๋จ๊ณ: foreach์ for๋ฅผ ์ฌ์ฉํด ์ดํฐ๋ ์ด์ ํด๋ณด์
์ค์นผ๋ผ๋ฅผ ๋ ์ ์๊ฒ ๋ ์๋ก ํจ์ํ (functional) ์คํ์ผ๋ก ์ฝ๋ ์์ฑ์ ํ๊ฒ ๋ ๊ฒ์ด๋ค.
args.foreach(arg => println(arg))
์ ์ฝ๋๋ ํจ์ ๋ฆฌํฐ๋ด (function literal) ์ ์ฌ์ฉํ์์ง๋ง ๋ ์ ํํ ํํ๋ ๋ค์๊ณผ ๊ฐ๋ค.
args.foreach(println)
ํจ์ ๋ฆฌํฐ๋ด ๋ฌธ๋ฒ์ ํ๋ผ๋ฏธํฐ ์ด๋ฆ์ ๋ชฉ๋ก์ด ๊ดํธ ์์ ์ค๊ณ , ๊ทธ ์์ ์ค๋ฅธ์ชฝ ํ์ดํ, ๋ง์ง๋ง์ผ๋ก ํจ์์ ๋ณธ๋ฌธ์ด ์์ด์ผ ํ๋ค.
(x: Int, y: Int) => x + y
2.7 ๊ฒฐ๋ก
์ค์นผ๋ผ์ ๊ธฐ๋ณธ์ ์ ๋ฌธ๋ฒ์ ์์๋ดค์ผ๋ ๋ค์์ฅ์์๋ ์ข ๋ ์ฌ๋ฌ์ด ์ฃผ์ ๋ก ๋์ด๊ฐ๋ค.
Chapter 03 ์ค์นผ๋ผ ๋ ๋ฒ์งธ ๊ฑธ์
2์ฅ์์๋ ์ค์นผ๋ผ์ ๊ธฐ์ด๋ฅผ 3์ฅ์์๋ ์ค์นผ๋ผ์์ ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ ์ ์์ ์ ๋์ ์ถฉ๋ถํ ์ง์์ ์์์ ์๋ค.
3.1 7๋จ๊ณ: ๋ฐฐ์ด์ ํ์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ง์ ํด๋ณด์
์ค์นผ๋ผ์์๋ new
๋ฅผ ์ฌ์ฉํด ๊ฐ์ฒด๋ฅผ ์ธ์คํด์คํ ํ ์ ์๋ค.
๋ค์ ์ฝ๋๋ ์ค์นผ๋ผ์์ java.math.BigInteger
์ธ์คํด์ค๋ฅผ ๋ง๋ค๊ณ ๊ฐ "12345"
๋ฅผ ์ธ์คํด์คํ ํ๋ค.
val big = new java.math.BigInteger("12345")
๋ฐฐ์ด์ ํ์ ์ผ๋ก ํ๋ผ๋ฏธํฐํ ํ๋ ๋ฐฉ๋ฒ์ด๋ค.
val greetStrings = new Array[String](3)
greetStrings(0) = "Hello"
greetStrings(1) = ", "
greetStrings(2) = "world!\n"
for (i < 0 to 2)
print(greetStrings(i))
๋ฐฐ์ด์ ์ฒซ๋ฒ์งธ ์์๋ฅผ ์ ๊ทผํ๋ ค๋ฉด ์๋ฐ์์๋ greetStrings[0]
์ด์ง๋ง ์ค์นผ๋ผ์์๋ greetStrings(0)
์ด๋ค.
for
๋ฐ๋ณต๋ฌธ์ ์ฝ๋์ค์ ๋ํ๋๋ ์ค์นผ๋ผ์ ํน์ง์ ๋ฉ์๋๊ฐ ํ๋ผ๋ฏธํฐ๋ฅผ ํ๋๋ง ์๊ตฌํ๋ ๊ฒฝ์ฐ, ๊ทธ ๋ฉ์๋๋ฅผ ์ (.)๊ณผ ๊ดํธ ์์ด ํธ์ถํ ์ ์๋ค๋ ์ ์ด๋ค.
์ด ์์์ to
๋ ์ค์ ๋ก Int
์ธ์๋ฅผ ํ๋๋ง ๋ฐ๋ ๋ฉ์๋์ด๋ฉฐ 0 to 2
๋ ๋ด๋ถ์ ์ผ๋ก (0).to(2)
๋ผ๋ ๋ฉ์๋ ํธ์ถ๋ก ๋ฐ๋๋ค.
์ค์นผ๋ผ๋ ๋ชจ๋ ๊ฐ์ฒด๊ฐ ํจ์์ด๋ค.
์ ํต์ ์ผ๋ก 1 + 2
๋ผ๋ ์ฝ๋๋ (1).+(2)
๋ผ๊ณ ๋ ์ธ ์ ์๋ค.
๋ณ์ ํ๋ ์ด์์ ๊ฐ์ ๊ดํธ๋ก ๋๋ฌ์ธ์ ํธ์ถํ๋ฉด ์ค์นผ๋ผ๋ ๊ทธ ์ฝ๋๋ฅผ ๋ณ์์ ๋ํด apply
๋ผ๋ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ๊ฒ์ผ๋ก ๋ฐ๊พผ๋ค.
์ฆ, greetStrings(i)
๋ greetStrings.apply(i)
๋ก ๋ฐ๋๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก ์ด๋ค ๋ณ์ ๋ค์ ๊ดํธ๋ก ๋๋ฌ์ผ ์ธ์๋ค์ด ์๋ ํํ์์ ํ ๋น ํ๋ฉด, ์ปดํ์ผ๋ฌ๋ ์ธ์์ ๋ฑํธ, ์ค๋ฅธ์ชฝ๊ฐ๋ฑ์ ๋ชจ๋ ๋ฃ์ด update
๋ฉ์๋๋ฅผ ํธ์ถํ๋ค.
์ฆ greetStrings(0) = "Hello"
๋ greetStrings.update(0, "Hello")
๋ก ๋ฐ๋๋ค.
ํ์ง๋ง ์ ์ฝ๋๋ ๊ฐ๋ ์ ๋ณด์ฌ์ฃผ๋ ค๋ ์๋๋ก ์ค์นผ๋ผ์์๋ ์ถ์ฒํ์ง ์๋ ์ฝ๋์ด๋ฉฐ ๋ ์ข์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
์ค์นผ๋ผ์์๋ ํ์ ์ถ๋ก ์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ์๋์ ๊ฐ์ด ๋ฐฐ์ด์ ๋ง๋ค๊ณ ์ด๊ธฐํ ํ ์ ์๋ค.
val numNames = Array("zero", "one", "two")
์์์ ์ธ๊ธํ ๊ฒ ์ฒ๋ผ ์ ์ฝ๋๋ฅผ ์ข ๋ ์ฅํฉํ๊ฒ ๋ง๋ค๋ฉด ์๋์ ๊ฐ๋ค.
val numNames = Array.apply("zero", "one", "two")
3.2 8๋จ๊ณ: ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํด๋ณด์
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ๊ฐ์ฅ ํฐ ์ฐฉ์์ ํ๋๋ ๋ฉ์๋์ ๋ถ์ํจ๊ณผ๊ฐ ์์ด์ผ ํ๋ค๋ ์ ์ด๋ค.
๋ฉ์๋์ ์ ์ผํ ๋์์ ๊ณ์ฐ์ ํด์ ๊ฐ์ ๋ฐํํ๋ ๊ฒ ๋ฟ์ด๋ค.
๋ฆฌ์คํธ๋ฅผ ๋ง๋ค๊ณ ์ด๊ธฐํํ๋ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ๋ค.
val oneTwoThree = List(1, 2, 3)
๋ฆฌ์คํธ์ ์์๋ฅผ ์ถ๊ฐํ๋ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ์ด ์ด๋ฃจ์ด์ง๋ค.
val twoThree = List(2, 3)
val oneTwoThree = 1 :: twoThree
println(oneTwoThree)
์ฐ์ฐ์ ์ฝ์ฆ (:๐ ๋ฅผ ์ฌ์ฉํ์ฌ ์ฒ๋ฆฌํ๋๋ฐ ์ด๋ ์ฐ์ฐ์ ๊ฒฐํฉ๋ฒ์น์ ์๊ฑฐํ์ฌ ์ดํ 5.9 ์ ์์ ์ค๋ช ํ๋ค.
์ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ ์๋ค.
List(1, 2, 3)
๋น ๋ฆฌ์คํธ๋ฅผ Nil
๋ก ์ค์ฌ ์ธ ์ ์์ด ์ด๋ฅผ ์ด์ฉํ์ฌ ๋ฆฌ์คํธ๋ฅผ ์ด๊ธฐํ ํ ์ ์๋ค.
val oneTwoThree = 1 :: 2 :: 3 :: Nil
println(oneTwoThree)
๋ฆฌ์คํธ์ ๋ฆฌ์คํธ ๊ฐ์ ๋ถ์ผ ๋๋ :::
์ ์ฌ์ฉํ๋ค.
List("a", "b") ::: List("c", "d", "e")
3.3 9๋จ๊ณ: ํํ์ ์ฌ์ฉํด๋ณด์
ํํ์ ๋ฆฌ์คํธ์ ๋ค๋ฅด๊ฒ ๋์์ ๋ฌธ์์ด๊ณผ ์ ์๋ฅผ ํจ๊ป ์ฌ์ฉ๊ฐ๋ฅํ๋ค.
ํํ์ ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ ์ ์๋ค.
var pair = (99, "Luftballons")
println(pair._1)
println(pair._2)
ํํ์ ์ธ์คํด์คํํ๊ณ ๋์ ๊ฐ ์์์ ์ ๊ทผํ๋ ค๋ฉด, ์ (.) ๊ณผ ๋ฐ์ค (_) ๋ค์์ 1๋ถํฐ ์์ํ๋ ์ธ๋ฑ์ค๋ฅผ ๋ฃ๋๋ค. (0 ์ด ์๋ 1๋ถํฐ ์์)
99
Luftballons
ํํ์ ์ค์ ํ์ ์ ๋ด๋ถ์ ๋ค์ด ์๋ ์์์ ๊ฐฏ์์ ๊ฐ๊ฐ์ ํ์ ์ ๋ฐ๋ผ ๋ฐ๋๋ค.
์ ํํ์ Tuple2[Int, String]
์ด๋ค.
('u', 'r', "the", 1, 4, "me")
์ ํํ์ ํ์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
Tuple6[Char, Char, String, Int, Int, String]
3.4 10๋จ๊ณ: ์งํฉ๊ณผ ๋งต์ ์จ๋ณด์
์ค์นผ๋ผ์ ๋ชฉ์ ์ ํจ์ํ ์คํ์ผ๊ณผ ๋ช ๋ นํ ์คํ์ผ์ ์ฅ์ ์ ๋ชจ๋ ์ทจํ ์ ์๊ฒ ๋๋๊ฒ์ด๋ค.
์ด๋ฅผ ์ํด ์ค์นผ๋ผ ์ปฌ๋ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์๋ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ์ปฌ๋ ์ ๊ณผ ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅํ ์ปฌ๋ ์ ์ ๊ตฌ๋ถํด๋๋ ๊ณณ์ด ์๋ค.
์๋ฅผ ๋ค์ด ๋ฐฐ์ด์ ํญ์ ๋ณ๊ฒฝ ๊ฐ๋ฅํ์ง๋ง, ๋ฆฌ์คํธ๋ ํญ์ ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅํ๋ค.
ํ์ง๋ง ์งํฉ ํน์ ๋งต์ ๋ณ๊ฒฝํ ๊ฒ๊ณผ ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅ ๊ฒ์ ๋ชจ๋ ์ ๊ณตํ๋ค.
์ด๋ ์ค์นผ๋ผ์์๋ ํด๋์ค ๊ณ์ธต ์์์ ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ์ ๋ชจ๋ธ๋ง ํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ค์นผ๋ผ์์ ์ ๊ณตํ๋ ํธ๋ ์ดํธ (trait) ์ ์ฌ์ฉํ์ฌ ํ์ฅ (extends) ํ๊ฑฐ๋ ํผํฉ (mixed) ํ์ฌ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
์ ๊ทธ๋ฆผ์ฒ๋ผ ๋ณ๊ฒฝ ๊ฐ๋ฅํ๊ฑฐ๋ ํน์ ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅํ ํด๋์ค๋ฅผ ์ํฌํธ (import) ํ์ฌ ์ฌ์ฉํ๋ค.
๋ค์์ ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅํ ์งํฉ์ ์์ฑ, ์ด๊ธฐํ, ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค.
var jetSet = Set("Boeing", "Airbus")
jetSet += "Lear"
println("jetSet.contains("Cessna")
์ ์ฝ๋์ Set
์ scala.collection.immutable.Set
์ ๋๋ฐ ๊ฐ์ฒด์ ์๋ apply
๋ฅผ ํธ์ถ ํ์๋ค.
๋ง์ฝ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ์งํฉ์ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด ์๋์ ๊ฐ์ด scala.collection.mutable
์ ์ํฌํธ (import) ํ๋ฉด ๋๋ค.
import scala.collection.mutable
val moiveSet = mutable.Set("Hitch", "Poltergeist")
movieSet += "Shrek"
println(movieSet)
movieSet += "Sherk"
๋์ ์ moiveSet.+=("Shrek")
์ด๋ผ๊ณ ์ธ ์ ์๋ค.
๋ณ๊ฒฝ ๊ฐ๋ฅํ ๋งต์ ์์ ์ ์ฌํ๊ฒ ์๋์ ๊ฐ์ด ์ฌ์ฉํ๋ฉด ๋๋ค.
import scala.collection.mutable
val treasureMap = mutable.Map[Int, String]()
treasureMap += (1 -> "Go to island.")
treasureMap += (2 -> "Find big X on ground")
treasureMap += (3 -> "Dig.")
println(treasureMap(2))
Find big X on ground.
๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅํ ๋งต์ ์์ฑ, ์ด๊ธฐํ, ์ฌ์ฉ์ ๋ค์๊ณผ ๊ฐ๋ค.
val romanNumeral = Map(
1 -> "I", 2 -> "II", 3 -> "III", 4 -> "IV", 5 -> "V"
)
println(romanNumeral)
์ค์นผ๋ผ๊ฐ ->
๋ฅผ ๋ชจ๋ ๊ฐ์ฒด์ ์ ์ฉ ๊ฐ๋ฅํ๊ฒ ๋ง๋ค ์ ์๋ ์ด์ ๋
์ค์นผ๋ผ์ ๋ค์ํ ๋งค์ปค๋์ฆ ์ค ํ๋์ธ ์์์ ๋ณํ (implicit conversion) ์ด ์ผ์ด๋๊ธฐ ๋๋ฌธ์ด๋ค. (21์ฅ)
๊ธฐ๋ณธ์ ์ผ๋ก ์ปฌ๋์ ํด๋์ค๋ฅผ ํธ์ถํ๋ฉด ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅํ ํด๋์ค๋ฅผ ํธ์ถํ๋ ๊ฒ ๊ฐ์
3.5 11๋จ๊ณ: ํจ์ํ ์คํ์ผ์ ์ธ์ํ๋ ๋ฒ์ ๋ฐฐ์ฐ์
ํจ์ํ ์คํ์ผ์ ์ฌ์ฉ์ ๊ถ์ฅ ํ๋๋ฐ, ์ฝ๋์์์ var
๋์ ์ val
์ ์ฌ์ฉํ์ฌ ํ๋ก๊ทธ๋๋ฐ ํ๋๋ก ๋
ธ๋ ฅํ์.
์ด๋ ๋๋์ฑ ์ฝ๋๋ฅผ ํจ์์ ์ผ๋ก ๋์ ์ํค๋๋ก ๋ง๋ค์ ์์ผ๋ฉฐ, ๋ด๋ถ์ ์ผ๋ก๋ ๋ถ์ํจ๊ณผ๋ฅผ ์์ ๋๋ก ์ ๋ํ๊ธฐ ๋๋ฌธ์ด๋ค.
๋ถ์ํจ๊ณผ๊ฐ ์ ๋์ ์ผ๋ก ๋์๊ฑด ์๋์ง๋ง ์ต๋ํ ์ง์ํ๋๋ก ํ์
3.6 12๋จ๊ณ: ํ์ผ์ ๋ด์ฉ์ ์ค ๋จ์๋ก ์ฝ์
์ด๋ค ํ์ผ์ ๋ชจ๋ ์ค์ ๋ฌธ์ ๊ฐ์๋ฅผ ์ค์ ์ ๋ง์ถฐ ์ถ๋ ฅํ๊ธฐ
import scala.io.Source
def widthOfLength(s: String) = s.length.toString.length
if (arg.length > 0) {
val lines = Source.formFile(args(0)).getLines().toList
val longestLine = lines.reduceLeft(
(a, b) => if (a.length > a.length) a else b
)
val maxWidth = widthOfLength(longestLine)
for (line <- lines) {
val numSpaces = maxWidth - widthOfLength(line)
val padding = " " * numSpaces
println(padding + line.length + " | " + line)
}
} else
Console.err.println("Please enter filename")
3.7 ๊ฒฐ๋ก
์ค์นผ๋ผ ์คํฌ๋ฆฝํธ ์ฌ์ฉ ์ค๋น๋ ๋๋ฌ๊ณ , ๊ฐ ์ฃผ์ ์ ๋ํด ๋ ์์ธํ๊ฒ ์์๋ณธ๋ค.
Chapter 04 ํด๋์ค์ ๊ฐ์ฒด
2์ฅ๊ณผ 3์ฅ์์ ์ค์นผ๋ผ์ ํด๋์ค์ ๊ฐ์ฒด์ ๋ํ ๊ธฐ๋ณธ์ ์ธ ์ฌํญ์ ์ดํด๋ณด์๋ค.
์ด ์ฅ์์๋ ๋ค์ ๋ด์ฉ๋ค์ ์ดํด๋ณธ๋ค.
- ํด๋์ค (class)
- ํ๋ (field)
- ๋ฉ์๋ (method)
- ์ธ๋ฏธ์ฝ๋ก ์ถ๋ก (semicolon interface)
๋ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ฑํ๊ธฐ ์ํ ์ฑ๊ธํค์ ์ด๋ป๊ฒ ์ฌ์ฉํ ์ง ์ดํด๋ณธ๋ค.
์๋ฐ์ ๋น์ทํ ๊ฐ๋ ์ด์ง๋ง ์์ ํ ๊ฐ์ง๋ ์๋ค.
4.1 ํด๋์ค, ํ๋, ๋ฉ์๋
ํด๋์ค๋ ๊ฐ์ฒด์ ๋ํ ์ฒญ์ฌ์ง์ด๋ค.
ํด๋์ค๋ฅผ ์ ์ํ๊ณ ๋๋ฉด new
๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด๋ฅผ ๋ง๋ค ์ ์๋ค.
class ChecksumAccumulator {
// ์ฌ๊ธฐ ํด๋์ค์ ์ ์๊ฐ ๋ค์ด๊ฐ๋ค.
}
ํด๋์ค ์์๋ ๋ณ์์ ๋ฉ์๋๋ฅผ ๋ฃ์์ ์์ผ๋ฉฐ ์ด๋ฅผ ๋ฉค๋ฒ (member) ๋ผ๊ณ ํ๋ค.
์ดํ ChecksumAccumulator
ํ์
์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ ์ถ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํ ์ ์๋ค.
new ChecksumAccumulator
ํด๋์ค๋ฅผ ์ธ์คํด์คํ (instanciate) ํ ๋, ์ค์นผ๋ผ ๋ฐํ์์ ํด๋น ๊ฐ์ฒด์ ์ํ (๊ฐ ๋ณ์์ ๋ด์ฉ) ๋ฅผ ๋ด์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ๋ณดํ๋ค.
๊ฐ ํด๋์ค๋ฅผ ์ฌ๋ฌ ๋ณ์์ ์ธ์คํด์คํ ํ๋ฉด ๊ทธ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ์ธ์คํด์ค ๊ฐ์ฒด๋ ํ๋ก๊ทธ๋จ ์งํ์ ๋ฐ๋ผ ๋ณํ ์ ์๋ค.
๊ฐ์ฒด์ ๊ฐ๊ฑด์ฑ (robustness) ๋ฅผ ์ถ๊ตฌํ๋ ํ ๊ฐ์ง ์ค์ํ ๋ฐฉ๋ฒ์ ๊ฐ์ฒด์ ์ํ (์ธ์คํด์ค ๋ณ์ ๊ฐ ์ ์ฒด) ๋ฅผ ํด๋น ์ธ์คํด์ค๊ฐ ์ด์ ์๋ ๋์ ํญ์ ๋ฐ๋ฅด๊ฒ ์ ์งํ๋ ๊ฒ์ด๋ค.
์ด๋ ํด๋์ค ๋ด๋ถ ํ๋๋ฅผ ๋น๊ณต๊ฐ (private) ๋ก ๋ง๋ค์ด์ ์ธ๋ถ์์ ์ง์ ์ ๊ทผํ ์ ์๋๋ก ํ๋ ๊ฒ ์ด๋ค.
๋น๊ณต๊ฐ ํ๋๋ ๊ฐ์ ํด๋์ค ์์ ์ ์ํ ํจ์์์๋ง ์ ๊ทผ ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์, ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ์ฝ๋๋ฅผ ํด๋์ค ๋ด๋ถ๋ก ํ์ ํ๋ ํจ๊ณผ๊ฐ ์๋ค.
์ค์นผ๋ผ ๋ฉ์๋ ํ๋ผ๋ฏธํฐ๋ val (immutable: ๋ถ๋ณ) ์ด๋ผ๋ ์ ์ด๋ค.
์ค์นผ๋ผ ํ๋ฆฌ๋ฏธํฐ๊ฐ
val
์ธ ์ด์ ๋val
์ด ๋ถ์ํ๊ธฐ ๋ ์ฝ๊ธฐ ๋๋ฌธ์ด๋ค.
val
์ ๊ฒฝ์ฐ ๋ถ์์ ์ํด ๋์ค์ ์ฌํ ๋นํด์ ๊ฐ์ด ๋ฐ๋๋์ง ์ดํด๋ณผ ํ์๊ฐ ์๋ค.
๋ฐ๋ฉด์var
์ ์ถ์ ํด์ผ ํ๋ค.
๋ถ์ํจ๊ณผ๋ง์ ์ํด ์คํ๋๋ ๋ฉ์๋๋ฅผ ํ๋ก์์ (procedure) ๋ผ๊ณ ํ๋ค.
4.2 ์ธ๋ฏธ์ฝ๋ก ์ถ๋ก
์๋์ ๊ฐ์ด ํ์ค์ ์ฌ๋ฌ๋ฌธ์ฅ์ ๋ฃ์ผ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๊ผญ ์ค๊ฐ์ ์ธ๋ฏธ์ฝ๋ก ์ ๋ฃ์ด์ผ ํ๋ค.
val s = "hello"; println(s)
4.3 ์ฑ๊ธํค ๊ฐ์ฒด
์ค์นผ๋ผ๋ ์ฑ๊ธํค ๊ฐ์ฒด๋ฅผ ์ง์ํ๋ค.
class
๋ผ๋ ํค์๋ ๋์ object
๋ผ๋ ํค์๋๋ก ์์ํ๋ค.
import scala.collection.mutable
object ChecksumAccumulator {
private val cache = mutable.Map.empty[String, Int]
def calculate(s: String): Int =
if (cache.contains(s))
cache(s)
else {
val acc = new ChecksumAccumulator
for (c <- s)
acc.add(c.toByte)
val cs = acc.checksum()
cache += (s -> cs)
cs
}
}
์ด๋ค ์ฑ๊ธํค ๊ฐ์ฒด์ ์ด๋ฆ์ด ์ด๋ค ํด๋์ค์ ๊ฐ์ ๋, ๊ทธ ๊ฐ์ฒด๋ฅผ ํด๋์ค์ ๋๋ฐ๊ฐ์ฒด (companion object) ๋ผ๊ณ ํ๋ค.
ํด๋์ค์ ๋๋ฐ ๊ฐ์ฒด๋ ๋ฐ๋์ ๊ฐ์ ์์คํ์ผ ์์ ์ ์ํด์ผ ํ๋ค.
์๋ฐ์ ๊ฐ์ด ํด๋์ค๋ ๊ฐ์ฒด๋ฅผ ํ์ผ ์ด๋ฆ๊ณผ ๋์ผํ๊ฒ ๊ตฌ์ฑํ์ง ์์๋ ๋์ง๋ง ๊ฐ๋ฐ์ ํธ์์ฑ์ ์ํด์ ํ์ผ๋ณ๊ณผ ํด๋์ค๋ช ์ ๋์ผํ๊ฒ ์ ์งํ๋ ๊ฒ์ ๊ถ์ฅํ๋ค.
๋๋ฐ ํด๋์ค๊ฐ ์๋ ์ฑ๊ธํค ํด๋์ค๋ฅผ ๋ ๋ฆฝ๊ฐ์ฒด (standalone object) ๋ผ๊ณ ํ๋ค.
4.4 ์ค์นผ๋ผ ์ ํ๋ฆฌ์ผ์ด์
์ค์นผ๋ผ ํ๋ก๊ทธ๋จ์ ์คํํ๋ ค๋ฉด Array[String]
์ ์ ์ผํ ์ธ์๋ก ๋ฐ๊ณ Unit
์ ๋ฐํํ๋ main
์ด๋ผ๋ ๋ฉ์๋ ์ด๋ฆ์ ๊ฐ์ง ๋
๋ฆฝ ์ฑ๊ธํค ๊ฐ์ฒด ์ด๋ฆ์ ์์์ผ ํ๋ค.
์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ main
๋ฉ์๋๋ง ์์ผ๋ฉด ์ด๋ค ๋
๋ฆฝ ๊ฐ์ฒด๋ ์ ํ๋ฆฌ์ผ์ด์
์ ์์์ ์ ์ ์ ์๋ค.
import ChecksumAccumulator.calculate
object Summer {
def main(args: Array[String]) {
for (arg <- args)
println(args + ": " + calculate(arg))
}
}
์ค์นผ๋ผ๋ ํญ์
java.lang
๊ณผscala
ํจํค์ง์ ์ ๋ฒ๋ฅผ ์์์ ์ผ๋ก ์ํฌํธ ํ๋ค.
4.5 App ํธ๋ ์ดํธ
์ค์นผ๋ผ๋ ํ์ดํ ์๊ณ ๋ฅผ ๋ ์ ์๋ scala.App ์ด๋ผ๋ ํธ๋ ์ดํธ๋ฅผ ์ ๊ณตํ๋ค.
ํธ๋ ์ดํธ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ์ํ ์ฑ๊ธํค ๋ค์ extends App
์ด๋ผ๊ณ ์จ์ผ ํ๋ค.
๊ทธ ํ, main
๋ฉ์๋๋ฅผ ์ ์ ๋์ main
๋ฉ์๋์ ๋ฃ๊ณ ์ถ์ ์ฝ๋๋ฅผ ์ง์ ์ฑ๊ธํค ๊ฐ์ฒด๋ฅผ ์ค๊ดํธ ์ฌ์ด (๋ฐ๋) ์ ๋ฃ๋๋ค.
import ChecksumAccumulator.calculate
object FallWinterSpringSummer extends App {
for (season <- List("fall", "winter", "spring"))
println(season + ": " + calculate(season))
}
์ด๋ args
๋ผ๋ ๋ฌธ์์ด์ ๋ฐฐ์ด์ ์ฌ์ฉํ์ฌ ๋ช
๋ นํ ์ธ์์ ์ ๊ทผํ ์ ์๋ค.
4.5 ๊ฒฐ๋ก
์ค์นผ๋ผ์ ๊ธฐ๋ณธ์ ์ธ ์ฌํญ์ ์์๋ดค๋ค.
๋ค์์ฅ์์๋ ์ค์นผ๋ผ์ ๊ธฐ๋ณธํ์ ๊ณผ ํ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ธ๊ฒ์ด๋ค.
Chapter 05 ๊ธฐ๋ณธ ํ์ ๊ณผ ์ฐ์ฐ
์ค์นผ๋ผ๋ ์์์ ๋ณํ (implicit conversion) ์ ํตํด ์๋ฐ๊ฐ ์ ๊ณตํ๋ ์ฐ์ฐ ์ธ์ ์ฌ๋ฌ ์ฐ์ฐ์ ์ถ๊ฐ๋ก ์ ๊ณตํจ์ผ๋ก์จ ๊ธฐ๋ณธํ์ ์ด ์ผ๋ง๋ ํ๋ถํด์ง ์ ์๋์ง ํ์ธํ ์ ์๋ค.
5.1 ๊ธฐ๋ณธ ํ์
- ์ ์ํ ํ์
(intergral type) :
Byte
,Short
,Int
,Long
,Char
- ์ ํ์
(numeric type) :
Float
,Double
5.2 ๋ฆฌํฐ๋ด
์ค์นผ๋ผ์ ๋ชจ๋ ํ์ ์ ๋ฆฌํฐ๋ด (literal) ๋ก ์ ์์ ์๋ค.
๋ฆฌํฐ๋ด
์์ซ๊ฐ์ ์ฝ๋์ ์ง์ ์ ๋ ๋ฐฉ๋ฒ
์ ์ ๋ฆฌํฐ๋ด
val hex = 0x5
// Int = 5
val hex2 = 0x00FF
// Int = 255
val magic = 0xcafebebe
// Int = -889275714
๋ถ๋์์์ ๋ฆฌํฐ๋ด
val big = 1.2345
// Double = 1.2345
val bigger = 1.2345e1
// Double = 12.345
val biggerStill 123E45
// Double = 1.23E47
๋ฌธ์ ๋ฆฌํฐ๋ด
val a = 'A'
// Char = A
val d = '\u0041'
// Char = A
๋ฌธ์์ด ๋ฆฌํฐ๋ด
val hello = "Hello"
// String = Hello
println("""Welcome to Ultamix 3000
Type "HELP" for help.""")
์ ์ฝ๋์ ๊ฒฐ๊ณผ๋ ์๋์ ๊ฐ๋ค.
Welcome to Ultamix 3000
Type "HELP" for help.
์ด๋ ๋๋ฒ์งธ ์ค์ ๊ณต๋ฐฑ์ด ๋ค์ด๊ฐ๊ธฐ ๋๋ฌธ์ธ๋ฐ, ์ด ๋ฌธ์ ํด๊ฒฐ์ ์ํด์๋ stripMargin
๋ฌธ์์ด์ ๋ํด ํธ์ถํ์ฌ ์ฒ๋ฆฌํ๋ค.
println("""|Welcome to Ultamix 3000
|Type "HELP" for help.""".stripMargin)
์ด์ ์ฝ๋๊ฐ ์ํ๋ ๋๋ก ๋์ํ๋ค.
Welcome to Ultamix 3000
Type "HELP" for help.
์ฌ๋ณผ ๋ฆฌํฐ๋ด
val s = 'aSymbol
// Symbol = 'aSymbol
๋ถ๋ฆฌ์ธ ๋ฆฌํฐ๋ด
val bool = true
// Boolean = true
val full = false
// Boolean = false
5.3 ๋ฌธ์์ด ์ธํฐํด๋ ์ด์
์ค์นผ๋ผ๋ ์ธํฐํด๋ ์ด์ (interpolation) ์ ์ํ ๋ฉ์ปค๋์ฆ์ ํฌํจํ๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก๋ s
์ f
๋ฅผ ์ ๊ณตํ๋ค.
s"The answer is ${6 * 7}."
// The answer is 42
f
๋ฌด์์ด ์ดํฐํด๋ ์ด์
์ ์ฌ์ฉํ๋ฉด ๋ด์ฅ๋ ํํ์์ ๋ํด printlnf
์คํ์ผ์ ํ์์ ์ง์ ํ ์ ์๋ค.
val pi = "Pi"
f"$pi is approximately ${math.Pi}.8f."
// String = Pi is approximately 3.14159265
5.4 ์ฐ์ฐ์๋ ๋ฉ์๋๋ค
์ค์นผ๋ผ๋ ๊ธฐ๋ณธํ์ ์ ๋ํด ํ๋ถํ ์ฐ์ฐ์๋ฅผ ์ ๊ณตํ๋ค.
๋ชจ๋ ๋ฉ์๋๋ ์ฐ์ฐ์๊ฐ ๋ ์ ์๋ค.
1๊ฐ์ ์ธ์๋ฅผ ๋ฐ๋ ๋ฉ์๋์ธ ๊ฒฝ์ฐ ์๋์ ๊ฐ์ด ์ถ์ฝํ ํํ์ด ๊ฐ๋ฅํ๋ค.
๋ค์์ ๊ฐ์ ํํ์ ์ฝ๋์ด๋ค.
val s = "Hello, world!"
s.indexOf('o')
or
s indexOf 'o'
// Int = 4
-2.0
or
(2.0).unary_-
// Double = -2.0
val s = "Hello, world!"
s.toLowerCase()
or
s toLowerCase
// String = hello, world!
5.5 ์ฐ์ ์ฐ์ฐ
๋ชจ๋ ์ ํ์ ์ ๋ํ๊ธฐ (+), ๋นผ๊ธฐ (-), ๊ณฑํ๊ธฐ (*), ๋๋๊ธฐ (/), ๋๋จธ์ง (%) ๋ฅผ ์ค์ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด ๊ณ์ฐํ ์ ์๋ค.
5.6 ๊ด๊ณ ์ฐ์ฐ๊ณผ ๋ ผ๋ฆฌ์ฐ์ฐ
์ ํ์
์ ํฌ๋ค (>), ์๋ค (<), ํฌ๊ฑฐ๋ ๊ฐ๋ค (>=), ์๊ฑฐ๋ ๊ฐ๋ค (<=) ๋ผ๋ ๊ด๊ณ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด ๋น๊ต ๊ฐ๋ฅํ๋ฉฐ ๊ทธ ๊ฒฐ๊ณผ๋ Boolean
๊ฐ์ผ๋ก ๋ฐํํ๋ค.
๋
ผ๋ฆฌ ์ฐ์ฐ์ผ๋ก๋ ๋
ผ๋ฆฌ๊ณฑ (&&, &), ๋
ผ๋ฆฌํฉ (||, |) ์ด ์๋ค.
๊ฐ๊ฐ์ ๋ Boolean
ํผ ์ฐ์ฐ์๋ฅผ ์ทจํ๋ฉฐ Boolean
๊ฒฐ๊ด๊ฐ์ ๋ด๋๋๋ค.
์ค์นผ๋ผ์์ && ์ || ์ฐ์ฐ์ ์๋ฐ์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ผํธ ์ํท (short circuit: ํ๋ก) ์ฐ์ฐ์ด๋ค.
5.7 ๋นํธ ์ฐ์ฐ
- ๋นํธ๊ณฑ (&)
- ๋นํธํฉ (|)
- ๋นํธ ๋ฐฐํํฉ (^)
- ๋จํญ ๋นํธ ๋ฐ์ ์ฐ์ฐ์ (~)
5.8 ๊ฐ์ฒด ๋์ผ์ฑ
๋ ๊ฐ์ฒด๊ฐ ๊ฐ์์ง ๋น๊ตํ๊ณ ์ถ๋ค๋ฉด ==
์ ์ฌ์ฉํ ์ ์๊ณ ๊ฐ์ง ์์์ง ๋น๊ตํ๋ ค๋ฉด !=
์ ์ฌ์ฉํ๋ค.
5.9 ์ฐ์ฐ์ ์ฐ์ ์์์ ๊ฒฐํฉ ๋ฒ์น
ํํ์์์ ์ด๋ ๋ถ๋ถ์ ์ฐ์ ์ ์ผ๋ก ์คํํ ์ง ๊ฒฐ์ ํ๋ ๋ฐฉ์์ด๋ค.
์ผ๋ฐ์ ์ผ๋ก ๊ฒฐํฉ๋ฒ์น์ ๋ฐ๋ฅธ๋ค (๊ณฑํ๊ธฐ / ๋๋๊ธฐ > ๋ํ๊ธฐ / ๋นผ๊ธฐ)
5.10 ํ๋ถํ ๋ํผ
์์์ ๋ณํ์ ๋ฐ๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ์ค์นผ๋ผ API ๋ฅผ ํตํด ํ์ธ ๊ฐ๋ฅํ๋ค.
5.11 ๊ฒฐ๋ก
์ด๋ฒ์ฅ์์ ๊ฐ์ฅ ์ค์ํ ์ฌํญ์ ์ค์นผ๋ผ์์๋ ์ฐ์ฐ์๊ฐ ๋ฉ์๋ ํธ์ถ์ด๋ผ๋ ์ฌ์ค, ์ค์นผ๋ผ ๊ธฐ๋ณธํ์ ์ ๋ ์ ์ฉํ ๋ฉ์๋๋ฅผ ์ ๊ณตํด์ฃผ๋ ํ๋ถํ ๋ ํผ ํด๋์ค๋ก ๋ณํํ๋ ์์์ ๋ณํ์ด ์กด์ฌํ๋ค๋ ์ ์ด๋ค.