-
Notifications
You must be signed in to change notification settings - Fork 0
S01E05
- assert ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ๋ฐฉ์์ผ๋ก ๋จ์ธ๋ฌธ์ ์์ฑํ๋ฉฐ ์กฐ๊ฑด์ ๋ง์กฑํ์ง ์๋ ๊ฒฝ์ฐ AssertionError๋ฅผ ๋์ง๋ค.
- assert(c, e) ๋ ๊ฐ ์ธ์๋ก ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ : ์กฐ๊ฑด c๋ฅผ ๋ง์กฑํ์ง ์์ ๊ฒฝ์ฐ ์ค๋ช e๋ฅผ ํฌํจํ๋ AssertionError๋ฅผ ๋์ง๋ค. : e๋ Any ํ์ ์ผ๋ก AssertionError๊ฐ์ฒด์ e.toString์ ํธ์ถํ๋ค.
- ensuring ๋ฉ์๋๋ ์ ์ด ํจ์๋ฅผ ์ธ์๋ก ๋ฐ๊ณ true, false๋ก ๋ฐํํ๋ค.
- ์๋ฐ๋๊ตฌ JUnit, TestNG
- ์ค์นผ๋ผ๋ก ๋ง๋ค์ด์ค ScalaTest, specs, ScalaCheck ๋ฑ๋ ์๋ค
- org.scalatest.Suite ํ์ฅ ํด๋์ค๋ก ์ ์ธํ์ฌ test๋ก ์์ํ๋ ๋ฉ์๋๋ฅผ ์ ์ํ๊ณ execute()๋ฅผ ํธ์ถํ๋ฉด ์ค์ํธ ์์ ์๋ ํ ์คํธ ๋ฉ์๋๋ฅผ ์ฐพ์์ ์คํ
- org.scalatest.FunSuite ํ์ฅ ํด๋์ค๋ก ์ ์ธํ์ฌ test ๋ฉ์๋๋ฅผ ์ ์ํ๊ณ ๊ทธ ์์ ์ฝ๋ ๊ธฐ์
- === ์ฐ์ฐ์, expect ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ์์ง ๋ํ๋ด๊ธฐ
- ScalaTest์ intercept ๋ฉ์๋ ์ฌ์ฉํ์ฌ ์์ธ ๋ฐ์์ํค๊ธฐ
- ๋์ ์ฃผ๋ ๊ฐ๋ฐ ํ ์คํธ ์คํ์ผ ScalaTest์์ Spec, WordSpec, FlatSpec, FeatureSepc ๋ฑ์ ์ ๊ณต
- ์ผ์ด์ค ํด๋์ค : ํด๋์ค ์ ์ธ์์ case ์์์๋ฅผ ๋ฃ์
1. ์ปดํ์ผ๋ฌ๋ ํด๋์ค ์ด๋ฆ๊ณผ ๊ฐ์ ์ด๋ฆ์ ํฉํ ๋ฆฌ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ๋ค. new ์์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ ์ ์๋ค.
2. ํ๋ผ๋ฏธํฐ ๋ชฉ๋ก์ ์๋ ๋ชจ๋ ํด๋์ค ํ๋ผ๋ฏธํฐ์ ์์์ ์ผ๋ก val ์ ๋์ฌ๋ฅผ ๋ถ์ธ๋ค. ๊ฐ ํ๋ผ๋ฏธํฐ๊ฐ ํด๋์ค์ ํ๋๋ ๋๋ค.
3. toString, hashCode, equals ๋ฉ์๋์ ์์ฐ์ค๋ฌ์ด ๊ตฌํ์ ์ถ๊ฐํ๋ค.
4. ์ปดํ์ผ๋ฌ๋ ์ผ์ด์ค ํด๋์ค์์ ์ผ๋ถ๋ฅผ ๋ณ๊ฒฝํ ๋ณต์ฌ๋ณธ์ ์์ฑํ๋ copy ๋ฉ์๋๋ฅผ ์ถ๊ฐํ๋ค.
abstract class Expr
case class Var(name: String) extends Expr
case class Number(num: Double) extends Expr
case class UnOp(operator: String, arg: Expr) extends Expr
case class BinOp(operator: String, left: Expr, right: Expr) extends Expr
object HelloWorld {
def main(args: Array[String]) {
val v = Var("x")
val op = BinOp("+", Number(1), v)
println("v.name : " + v.name)
println("op.left : " + op.left)
println("op : " + op)
println("op.right == Var(x) : " + (op.right == Var("x")))
val op2 = op.copy(operator = "-")
println("op.copy(operator = -) : " + op2)
println("op == op2 : " + (op == op2))
}
}
[๊ฒฐ๊ณผ]
v.name : x
op.left : Number(1.0)
op : BinOp(+,Number(1.0),Var(x))
op.right == Var(x) : true
op.copy(operator = -) : BinOp(-,Number(1.0),Var(x))
op == op2 : false
-
ํจํด ๋งค์น
- ์ ๋ ํฐ match { ๋์๋ค }
- ํจํด ๋งค์น์๋ case ํค์๋๋ก ์์ํ๋ ๋์๋ค์ด ๋ค์ด๊ฐ๊ณ ๊ฐ ๋์์ ํจํด๊ณผ => ์ฌ๋ณผ๋ก ๋ถ๋ฆฌ๋๋ ํจํด๊ณผ ์ผ์นํ์ ๋ ๊ณ์ฐํ ํํ์์ผ๋ก ๊ตฌ์ฑ๋๋ค.
-
switch์ match์ ๋น๊ต
1. ์ค์นผ๋ผ์ match๋ ํํ์์ด๊ณ ๊ฒฐ๊ณผ ๊ฐ์ ๋ด๋๋๋ค.
2. ์ค์นผ๋ผ์ case๋ ๋ค์ case๋ก ๋น ์ง์ง ์๋๋ค. (break ๋ถํ์)
3. ๋งค์น์ ์ฑ๊ณตํ์ง ์๋ ๊ฒฝ์ฐ MatchError ์์ธ๊ฐ ๋ฐ์ํ๋ฏ๋ก ๋ํดํธ ์ผ์ด์ค๋ฅผ ๋ฐ๋์ ์ถ๊ฐํด์ผ ํ๋ค.
val t = "a"
t match {
case "b" => println("b")
}
[๊ฒฐ๊ณผ]
Exception in thread "main" scala.MatchError: a (of class java.lang.String)
- ์์ผ๋์นด๋ ํจํด : ์ด๋ค ๊ฐ์ฒด๋ผ๋ ๋งค์นํ ์ ์๊ณ ์ด๋ค ๊ฐ์ฒด์์ ๊ฐ์ ์ ํ์๊ฐ ์๋ ๋ถ๋ถ์ ๋ฌด์ํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค.
def matchTest(arg: Expr){
arg match{
case BinOp(_, _, _) => println(arg + " is a binary operation")
case _ => println("It's somethisng else")
}
}
matchTest(op)
matchTest(v)
[๊ฒฐ๊ณผ]
BinOp(+,Number(1.0),Var(x)) is a binary operation
It's somethisng else
-
์์ ํจํด : ์์ ๊ณผ ๋๊ฐ์ ๊ฐ๊ณผ ๋งค์น๋๋ฉฐ ์ด๋ค ์ข ๋ฅ์ ๋ฆฌํฐ๋ด์ด๋ ์์๋ก ์ฌ์ฉํ ์ ์๋ค.
-
๋ณ์ ํจํด : ์์ผ๋์นด๋์ฒ๋ผ ์ด๋ค ๊ฐ์ฒด์๋ ๋งค์น๋๋ ๋ณ์ ๊ฐ์ฒด๋ฅผ ๋ฐ์ธ๋ฉํ๋ค.
-
๋ณ์ ๋๋ ์์?
- ์๋ฌธ์๋ก ์์ํ๋ ์ด๋ฆ์ ํจํด ๋ณ์๋ก ์ทจ๊ธํ๊ณ ๋ค๋ฅธ ๋ชจ๋ ์ฐธ์กฐ๋ ์์๋ก ๊ฐ์ฃผํ๋ค.
- ๋ํดํธ ์ผ์ด์ค๋ฅผ ์ถ๊ฐ ์ ์ปดํ์ผ ์๋ฌ ๋ฐ์(Warning ๋ฐ์ํ๋ ๋ฏ)
- ์๋ฌธ์ ์ด๋ฆ์ ์์ ํจํด์ผ๋ก ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด ๊ธด ์ด๋ฆ์ ์ฌ์ฉํ๊ฑฐ๋ ์ญ๋ฐ์ดํ๋ฅผ ์ฌ์ฉํด ๋ณ์ ์ด๋ฆ์ ๊ฐ์ธ๋ฉด ๋๋ค
-
์์ฑ์ ํจํด : ์ด๋ค ๊ฐ์ด ํด๋น ์ผ์ด์ค ํด๋์ค์ ์ํ๋์ง ๊ฒ์ฌํ ๋ค์ ๊ทธ ๊ฐ์ฒด์ ์์ฑ์๊ฐ ์ธ์๋ก ์ ๋ฌ๋ฐ์ ๊ฐ๋ค์ด ๊ดํธ ์์ ํจํด๊ณผ ์ ํํ ๋งค์น๋ ์ ์๋์ง ๊ฒ์ฌํ๋ ๊ฒ์ผ๋ก ์ค์นผ๋ผ ํจํด์ด ๊น์ ๋งค์น๋ฅผ ์ง์ํ๋ค๋ ๋ป์ด๋ค.
def deepMatchTest(expr: Expr){
expr match {
case BinOp("+", Number(1), v) => println("a deep match")
case _ => println("no match")
}
}
val opA = BinOp("+", Number(1), v)
val opB = opA.copy(operator = "-")
val opC = BinOp("+", Number(0), opA)
deepMatchTest(opA)
deepMatchTest(opB)
deepMatchTest(opC)
[๊ฒฐ๊ณผ]
a deep match
no match
no match
- ์ํ์ค ํจํด : ๋ฐฐ์ด์ด๋ ๋ฆฌ์คํธ ๊ฐ์ ์ํ์ค ํ์ ์ ๋ํด์๋ ๋งค์น์ํฌ ์ ์์ผ๋ฉฐ ํจํด ๋ด๋ถ์ ์ํ๋ ๊ฐ์๋งํผ ์์๋ฅผ ๋ช ์ํ๊ณ ๊ธธ์ด๋ฅผ ํ์ ํ์ง ์๊ณ ๋งค์นํ ์ ์๋ค.
expr match{
case List(0, _, _) => println("found it")
case List(0, _*) => println("found it")
case _ =>
}
- ํํ ํจํด : ํํ๋ ๋งค์น ๊ฐ๋ฅ (case(a, b, c) => println("matched" + a + b + c))
- ํ์ ์ง์ ํจํด : ํ์ ๊ฒ์ฌ๋ ํ์ ๋ณํ์ ๋์ ํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ฉฐ ํนํ ํ์ ๊ฒ์ฌ์ ๋ณํ์ ๋์์ ์ฌ์ฉํด์ผ ํ๋ค๋ฉด ์ ์ฉํ๋ค.
def fun(x: Any) = x match {
case s: String => s.length
case m: Map[_, _] => m.size
case _ => -1
}
์์ ๊ฐ์ ๋์์ isInstanceOf[typeVal] ์ asInstanceOf[typeVal] ํธ์ถํ ๊ฒฝ์ฐ ์ฝ๋๊ฐ ๋ ๊ธธ์ด์ง๊ณ ๋ณต์กํด์ง
- ์ค์นผ๋ผ๋ ์๋ฐ์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ ๋ค๋ฆญ์์ ํ์ ์๊ฑฐ ๋ชจ๋ธ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ match๋ฅผ ํตํด ์์ ํ์ ํ์ธ์ด ์ด๋ ต์ง๋ง ๋ฐฐ์ด์ ์์ ํ์ ๊ณผ ๊ฐ์ ํจ๊ป ์ ์ฅํ๋ฏ๋ก ๊ฐ๋ฅํ๋ค.
- ๋ณ์ ๋ฐ์ธ๋ฉ : @ ๊ธฐํธ๋ฅผ ๋ฃ๊ณ ํจํด์ ์ฐ๋ฉด ์ผ๋ฐ์ ์ธ ๋งค์น๋ฅผ ์๋ํ๊ณ ๊ทธ ํจํด ๋งค์น์ ์ฑ๊ณตํ๋ฉด ๋ณ์๊ฐ ํ๋ ์๋ ํจํด์์์ฒ๋ผ ๋งค์น๋ ๊ฐ์ฒด๋ฅผ ๋ณ์์ ์ ์ฅํ๋ค.
ํจํด ๋ค์ ์ค๊ณ if๋ก ์์ํ๋ฉฐ ํจํด ์์ ์๋ ๋ณ์๋ฅผ ์ฐธ์กฐํ๋ ์ด๋ค ๋ถ๋ฆฌ์ธ ํํ์๋ ๊ฐ๋๋ก ์ฌ์ฉํ ์ ์๋ค. ๊ฐ๋๊ฐ ์์ผ๋ฉด ๊ฐ๋๊ฐ true๊ฐ ๋ ๋๋ง ๋งค์น์ ์ฑ๊ณตํ๋ค.
case n: Int if 0 < n => ... // ์์ ์ ์๋ง ๋งค์น
case s: String if s == 'a' => ... // 'a'๋ฌธ์๋ก ์์ํ๋ ๋ฌธ์์ด๋ง ๋งค์น
case๋ฌธ์ ์์๊ฐ ์ค์ํ๋ฉฐ ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ์ฒ๋ฆฌํ๋ case๋ฌธ์ ์์น๊ฐ ์์์ ์์ ๊ฒฝ์ฐ ์ปดํ์ผ๋ฌ๊ฐ ๊ฒฝ๊ณ ํ์๋ฅผ ํ๋ค. (error : unreachable code)
- ์ต์์ ์ํผ ํด๋์ค ์์ sealed ํค์๋๋ฅผ ์ ์ธํ์ฌ ๊ทธ ํด๋์ค์ ๊ฐ์ ํ์ผ์ด ์๋ ๋ค๋ฅธ ๊ณณ์์๋ ์๋ก์ด ์๋ธ ํด๋์ค๋ฅผ ๋ง๋ค ์ ์๋๋ก ํ๋ค.
- ๋ด์ธํ ํด๋์ค๋ ํจํด ๋งค์น์์ ์ ์ฉํ๋ฉฐ ์ปดํ์ผ๋ฌ๊ฐ ๊ฒฝ๊ณ ๋ฉ์์ง์ ํจ๊ป ๋์น ํจํด ์กฐํฉ์ ํ๊ธฐ์์ผ์ค๋ค.
- ๋งค์น์ ์ ๋ ํฐ์ @unchecked ์ ๋ ธํ ์ด์ ์ ์ถ๊ฐํ๋ฉด ์ปดํ์ผ๋ฌ๊ฐ case๋ฌธ์ด ๋ชจ๋ ํจํด์ ๋ค ๋ค๋ฃจ๋์ง ๊ฒ์ฌํ๋ ๊ฒ์ ์๋ตํ์ฌ ๋์น ํจํด์ ๋ํ ๊ฒฝ๊ณ ๋ฉ์์ง๋ฅผ ์ ๋ณผ ์ ์๋ค.
- Option์ด๋ผ๋ ํ์ค ํ์ ์ ์ ํ์ ์ธ ๊ฐ์ ํํํ๋ฉฐ ๊ฐ์ด ์์ ๊ฒฝ์ฐ Some(x), ์์ผ๋ฉด None์ด๋ผ๋ ๊ฐ์ฒด๊ฐ ๋๋ค.
- ์ค์นผ๋ผ ์ปฌ๋ ์ ์ ๋ช๋ช ํ์ค ์ฐ์ฐ์ ์ ํ์ ์ธ ๊ฐ์ ์์ฑํ๊ณ ์ด ์ต์ ๊ฐ์ ๋ถ๋ฆฌํ๋ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ ํจํด ๋งค์น์ด๋ค.
val capitals = Map("France" -> "Paris", "Japan" -> "Tokyo")
println("capitals get France : " + (capitals get "France")) // capitals get France : Some(Paris)
println("capitals get North Pole : " + (capitals get "North Pole")) // capitals get North Pole : None
def show(x: Option[String]): String = {
x match {
case Some(s) => s
case None => "????"
}
}
println("capitals get France : " + show(capitals get "France")) // capitals get France : **Paris**
println("capitals get North Pole : " + show(capitals get "North Pole")) // capitals get North Pole : **????**
- null์ด ๋ฐํ๋์ง ์๊ธฐ ๋๋ฌธ์ ๋ณ์๋ฅผ ์ฌ์ฉํ ๋ ๋ง๋ค null ๊ฒ์ฌ๋ฅผ ํ์ง ์์๋ ๋๊ณ NullPointerException์ ๋ฐ์ํ์ง๋ ์๋๋ค. option ์ฌ์ฉ์ผ๋ก ์ธํด null์ด ๋ ์ ์๋ ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ํ๋ก๊ทธ๋จ์์ ์ค์นผ๋ผ๋ ํ์ ์ค๋ฅ๋ฅผ ๋ฐ์ํ๋ค. ์ด๋ค ๋ณ์๊ฐ Option[String] ํ์ ์ด๋ผ๋ฉด, ๊ทธ ๋ณ์๋ฅผ String์ผ๋ก ์ฌ์ฉํ๋ ค ํ๋ ์ค์นผ๋ผ ํ๋ก๊ทธ๋จ์ ์ปดํ์ผ์ ํ ์ ์๋ค.
val optionSize = (capitals get "France").length() // **Compile Error : value length is not a member of Option[String]**
val noralsize = (show(capitals get "France")).length()
- ๋ณ์ ์ ์์์ ํจํด ์ฌ์ฉํ๊ธฐ : val์ด๋ var๋ฅผ ์ ์ํ ๋, ํจํด์ ์ฌ์ฉ. ์ผ์ด์ค ํด๋์ค์ ๊ฐ์ด ์ฌ์ฉํ๋ฉฐ ํจํด์ ์ฌ์ฉํด ๊ฐ์ผ ํด์ฒดํ ์ ์๋ค.
val exp = new BinOp("%", Number(5), Number(1))
val BinOp(opr, left, right) = exp
println("opr : " + opr + ", left : " + left + ", right : " + right)
- ๋ฐฐ์ด๊ณผ ๋น์ทํ๋ ๋ณ๊ฒฝ์ด ๋ถ๊ฐ๋ฅํ๊ณ ์ฌ๊ท์ ์ด๋ค. (์ : linked list)
- ๋ฆฌ์คํธ ํ์ ์ ๊ณต๋ณ์ ์ด๋ค.
- ๋น ๋ฆฌ์คํธ์ ํ์ ์ด List[Nothing]์ด๋ฉฐ Noting์ ํด๋์ค ๊ณ์ธต๊ตฌ์กฐ์ ๋งจ ์๋ ํ์ ์ด๋ฏ๋ก List()๋ List[String] ํ์ ์ด๊ธฐ๋ ํ๋ค.
- Nil์ ๋น๋ฆฌ์คํธ๋ฅผ ์๋ฏธํ๊ณ ::๋ ๋ฆฌ์คํธ์ ์์ ์์๋ฅผ ์ถ๊ฐํ๋ค.
val nums: List[Int] = List(1, 2, 3, 4)
val nums = 1 :: 2 :: 3 :: 4 :: Nil
- head : ๋ฆฌ์คํธ์ ์ฒซ๋ฒ์งธ ์์
- tail : ๋ฆฌ์คํธ์ ์ฒซ๋ฒ์งธ ์์๋ฅผ ์ ์ธํ ๋๋จธ์ง ์์๋ก ์ด๋ค์ง ๋ฆฌ์คํธ
- isEmpty : ๋ฆฌ์คํธ๊ฐ ๋น์ด ์๋ค๋ฉด true๋ฅผ ๋ฐํ
ํจํด ๋งค์น๋ฅผ ์ฌ์ฉํด ๊ฐ ๋ถ๋ถ์ผ๋ก ๋๋ ์ ์๋ค.
val fruit: List[String] = List("apple", "orange", "pear", "melon", "grape")
val a :: b :: rest = fruit
println("a : " + a)
println("b : " + b)
println("rest : " + rest)
[๊ฒฐ๊ณผ]
a : apple
b : orange
rest : List(pear, melon, grape)
- ๋ ๋ฆฌ์คํธ ์ฐ๊ฒฐํ๊ธฐ : ":::" ๋ ์ธ์๋ฅผ ๋ฆฌ์คํธ๋ก ๋ฐ์ ์ฐ๊ฒฐํ๋ค.
- ๋ถํ ์ ๋ณต ์์น : ??
- ๋ฆฌ์คํธ ๊ธธ์ด ๊ตฌํ๊ธฐ: length - ๋ฆฌ์คํธ๋ฅผ ์ํํ์ฌ ๊ฒ์ฌํ๊ธฐ ๋๋ฌธ์ ์์ ๊ฐ์๋งํผ ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค.
- ๋ฆฌ์คํธ ์ ๋์ ์ ๊ทผํ๊ธฐ: init, last (head ๋ฐ tail๊ณผ ๋ฌ๋ฆฌ ๊ณ์ฐํ๊ธฐ ์ํด ์ ์ฒด ๋ฆฌ์คํธ๋ฅผ ์ํํ๋ค.)
init : ๋ง์ง๋ง ์์๋ฅผ ์ ์ธํ ๋ชจ๋ ์์๋ฅผ ํฌํจํ ๋ฆฌ์คํธ๋ฅผ ๋ฐํ
last : ๋ง์ง๋ง ์์๋ฅผ ๋ฐํ
- ๋ฆฌ์คํธ ๋ค์ง๊ธฐ: reverse ๋ฆฌ์คํธ์ ๋ค์ง์ด ์๋ก์ด ๋ฆฌ์คํธ๋ฅผ ์์ฑํ๋ค.
- ์ ๋์ฌ์ ์ ๋ฏธ์ฌ: drop, take, splitAt
drop : ์ฒซ๋ฒ์งธ์์ n๋ฒ์งธ๊น์ง ์์๋ฅผ ์ ์ธํ ๋ฆฌ์คํธ ์์๋ค ๋ฐํ
take : n ๋ฒ์งธ๊น์ง ์์๋ฅผ ๋ฐํ
splitAt : n๋ฒ์งธ ์ธ๋ฑ์ค ์์น์์ ๋ฆฌ์คํธ๋ฅผ ๋ถํ ํ์ฌ ๋ฐํ
- ์์ ์ ํ: apply์ indices
apply : n ๋ฒ์งธ ์ธ๋ฑ์ค ์์๋ฅผ ๋ฐํ
indices : ์ ํจํ ๋ชจ๋ ์ธ๋ฑ์ค์ ๋ฆฌ์คํธ๋ฅผ ๋ฐํ
- ๋ฆฌ์คํธ์ ๋ฆฌ์คํธ๋ฅผ ํ ๋ฆฌ์คํธ๋ก ๋ฐ๋ฏํ๊ฒ ๋ง๋ค๊ธฐ: flatten
flatten : ๋ฆฌ์คํธ์ ๋ฆฌ์คํธ๋ฅผ ์ธ์๋ก ๋ฐ์์ ํ๋์ ๋ฆฌ์คํธ๋ก ๋ฐ๋ฏํ๊ฒ ํผ์น๋ค.
- ๋ ๋ฆฌ์คํธ๋ฅผ ์์์์ผ๋ก ๋ฌถ๊ธฐ: zip๊ณผ unzip
zip : ๋ ๋ฆฌ์คํธ๋ฅผ ์ธ์๋ก ๋ฐ์์ ์์์์ ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค๋ฉด ๊ธธ์ด๊ฐ ๋ค๋ฅด๋ฉด ๊ธด ์ชฝ์ ๋จ๋ ์์๋ฅผ ๋ฒ๋ฆฐ๋ค.
zipWithIndex : ๋ฆฌ์คํธ์ ๋ชจ๋ ์์์ ๊ทธ ์์น๋ฅผ ๋ฌถ๋๋ค.
unzip : ํํ์ ๋ฆฌ์คํธ๋ฅผ ๋ฆฌ์คํธ๋ฆ ํํ๋ก ๋ฐ๊พผ๋ค.
- ๋ฆฌ์คํธ ์ถ๋ ฅํ๊ธฐ: toString, mkString
toString : ๋ฆฌ์คํธ์ ๋ํ ํ์ค ๋ฌธ์์ด ํํ์ ๋ฐํ
mkString : ์ ๋์ฌ ๋ฌธ์์ด, ๋ถ๋ฆฌ ๋ฌธ์์ด, ์ ๋ฏธ์ฌ ๋ฌธ์์ด์ ๋ฐ์ ๋ฌธ์์ด๋ก ๋ฐํ
addString : mkString๊ณผ ์ ์ฌํ๋ StringBuilder๊ฐ์ฒด์ ์ถ๊ฐ
- ๋ฆฌ์คํธ ๋ณํํ๊ธฐ: iterator, toArray, copyToArray
iterator : ๋ฆฌ์คํธ ์์๋ฅผ ์ดํฐ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํด์ ์ ๊ทผ
toArray, toList : List <-> Array ๋ณํ
copyToArray : ๋ฆฌ์คํธ ์์๋ฅผ ๋ฐฐ์ด์ ํน์ ์ง์ ๋ถํฐ ์ฐ์์ ์ผ๋ก ๋ณต์ฌ
- ๋ฆฌ์คํธ ์ ๋์ ์ ๊ทผํ๊ธฐ: init, last (head ๋ฐ tail๊ณผ ๋ฌ๋ฆฌ ๊ณ์ฐํ๊ธฐ ์ํด ์ ์ฒด ๋ฆฌ์คํธ๋ฅผ ์ํํ๋ค.)
- ๋ฆฌ์คํธ ๋งคํ: map, flatMap, foreach
map : ๋ฆฌ์คํธ๋ฅผ ํจ์์ ์ ์ฉํ์ฌ ๊ทธ ๊ฒฐ๊ณผ ๊ฐ์ผ๋ก ์ด๋ค์ง ๋ฆฌ์คํธ๋ฅผ ๋ฐํ
flatMap : map๊ณผ ์ ์ฌํ๋ ๊ฒฐ๊ณผ ๋ฆฌ์คํธ๋ฅผ ์๋ก ์ฐ๊ฒฐํ ํ๋์ ๋ฆฌ์คํธ๋ก ๋ฐํ
foreach : ์ค๋ฅธ์ชฝ ํผ์ฐ์ฐ์๋ก ํ๋ก์์ ๋ฅผ ๋ฐ์ ์ ์ฉ
- ๋ฆฌ์คํธ ๊ฑธ๋ฌ๋ด๊ธฐ:filter, partition, find, takeWhile, dropWhile, span
filter : Boolean ํ์ ์ ์ ์ด ํจ์๋ฅผ ๋ฐ์์ true์ธ ์์์ ๋ฆฌ์คํธ๋ฅผ ๋ฐํ
partition : filter์ ๊ฐ์ด ์ ์ด ํจ์๋ฅผ ๋ฐ์์ true, false ๊ฐ ๋ฆฌ์คํธ๋ก ๋ฐํ
find : filter์ ์ ์ฌํ๋ ์ ์ด ํจ์์ ๋ง์กฑํ๋ ์ฒซ ๋ฒ์งธ ์์๋ง ๋ฐํ
takeWhile : ์ ์ด ํจ์๋ฅผ ๋ง์กฑํ๋ ๊ฐ์ฅ ๊ธด ์ ๋์ฌ๋ฅผ ๋ฐํ
dropWhile : ์ ์ด ํจ์๋ฅผ ๋ง์กฑํ๋ ๊ฐ์ฅ ๊ธด ์ ๋์ฌ๋ฅผ ์ ๊ฑฐ
span : takeWhile, dropWhile์ ํ๋๋ก ๋ฌถ์ ๊ฒ
- ๋ฆฌ์คํธ ์ ์ฒด์ ๋ํ ์ ์ด: forall๊ณผ exists
forall : ๋ชจ๋ ์์๊ฐ ์ ์ด ํจ์๋ฅผ ๋ง์กฑํ ๋ true๋ฅผ ๋ฐํ
exists : ์ ์ด ํจ์๋ฅผ ๋ง์กฑํ๋ ์์๊ฐ ํ๋๋ผ๋ ์กด์ฌํ๋ฉด true๋ฅผ ๋ฐํ
- ๋ฆฌ์คํธ ํด๋: /:, :<br/>
fold์ฐ์ฐ : ์ผ์ชฝํด๋ /: ์ค๋ฅธ์ชฝ ํด๋ :\ ์ ๋ฌ๋ฐ๋ ์ฐ์ฐ์๋ฅผ ๊ฐ ๋ฐฉํฅ์ผ๋ก ๋ถํฐ ์ฐ์ ์ ์ฉ
- ๋ฆฌ์คํธ ์ ๋ ฌ: sortWith
sortWith : List sortWith before ํ์์ผ๋ก before ์๋ฆฌ์ ์ ์๋ ๋น๊ตํจ์๋๋ก ์ ๋ ฌ (์ : ListX sortWith (_ < _))
- ์์๋ก๋ถํฐ ๋ฆฌ์คํธ ๋ง๋ค๊ธฐ: List.apply
List.apply : List.apply(1,2,3) == List(1, 2, 3)
- ์์ ๋ฒ์๋ฅผ ๋ฆฌ์คํธ๋ก ๋ง๋ค๊ธฐ: List.range
List.range : ์ด๋ค ๋ฒ์๋ฅผ ๊ตฌ์ฑํ๋ ์๋ก ์ด๋ฃจ์ด์ง ๋ฆฌ์คํธ๋ฅผ ๋ง๋ ๋ค. List.range(from, until, increment)
- ๊ท ์ผํ ๋ฆฌ์คํธ ์์ฑ: List.fill
List.fill : ์์ฑํ ๋ฆฌ์คํธ์ ๊ธธ์ด์ ๋ฐ๋ณตํ ์์๋ฅผ ๋ฐ์ ๋ฆฌ์คํธ๋ฅผ ์ฑ์ (์ : List.fill(5)('a'), List.fill(2,3)('b'))
- ํจ์ ๋ํํ:List.tabulate
List.tabulate : ์ ๊ณต๋ ํจ์๋ก ๊ณ์ฐํ ์์์ ๋ฆฌ์คํธ๋ฅผ ์์ฑ (์ : List.tabulate(5)(n => n * n), List.tabulate(5,5)(*))
- ์ฌ๋ฌ ๋ฆฌ์คํธ ์ฐ๊ฒฐํ๊ธฐ: List.concat
List.concat : ์ฌ๋ฌ ๋ฆฌ์คํธ๋ฅผ ์ฐ๊ฒฐํ๋ค. (์ : list.concat(List(), List('a'), List('b'))