Fppis week 3 - codeport/scala GitHub Wiki
Class Hierarchy
μλ°μ λμΌν λΆλΆ
- μ μΈλ§ μ‘΄μ¬νκ³ κ΅¬νλΆκ° μ‘΄μ¬νμ§ μλ method, value, variable μ κ°μ§ ν΄λμ€λ
abstractν€μλλ₯Ό μ¬μ©νλ€.
abstract class Base{
def foo = 1 // ꡬνλΆκ° μ‘΄μ¬
def bar: Int // μ μΈλ§ μ‘΄μ¬
}
- base ν΄λμ€μ ꡬνλΆκ° μ‘΄μ¬νλ κ²½μ°λ λ°λμ
overrideν€μλλ₯Ό μ¬μ©νμ¬ μ¬μ μνλ€. - base ν΄λμ€μ ꡬνλΆκ° μ‘΄μ¬νμ§ μλ κ²½μ°(μ μΈλ§ μ‘΄μ¬νλ κ²½μ°)
overrideν€μλλ μ΅μ μ΄λ€.
calss Sub extends Base{
override def foo = 2 // override νμ
def bar = 3 // override μ΅μ
}
Programs
μλ°μ λ©μΈ λ©μλpublic static void main(String[] args){...}μ ν΄λΉνλ μ€μΉΌλΌμ μ½λ
object Hello{
def main(args: Array[String]) = println("hello world!")
}
Dynamic Binding
μ€μΉΌλΌλ₯Ό ν¬ν¨ν Object-oriented μΈμ΄λ dynamic method dispatch λ₯Ό ꡬννλ€. μ΄κ²μ νΈμΆ λ μ€λΈμ νΈμ λ©μλκ° μ€ν μκ°μ κ²°μ λλ€λ κ²μ΄λ€.
μ€λΈμ νΈλ₯Ό κ³ μ°¨ν¨μ(higher-order function)λΌκ³ λΆλ₯Ό μ μλ?
κ³ μ°¨ν¨μ(higher-order function)μ μ€λΈμ νΈλΌκ³ λΆλ₯Ό μ μλ?
How Classes Are Organized
μ€μΉΌλΌλ μλ°μ λ§μ°¬κ°μ§λ‘ packageλ‘ λ€μμ€νμ΄μ€λ₯Ό ꡬλΆνλ€.
- fully qualified name: ν¨ν€μ§λͺ +ν΄λμ€(μ€λΈμ νΈ) μ΄λ¦
import
import week3.Rational // Rational νμ
λ§ import
import week3.{Rational, Hello} // Rational, Hello νμ
λ§ import
import week3._ // week3.* κ³Ό κ°μ(wildcard import)
Automatic Import
κΈ°λ³Έμ μΌλ‘ import λλ entityλ,
scalaν¨ν€μ§java.langν¨ν€μ§scala.Predefμ±κΈν΄ μ€λΈμ νΈμ λͺ¨λ λ©€λ²
Scaladoc
www.scala-lang.org/api/current
Traits
Traitμ μλ°μ abstract classμ λΉμ·νμ§λ§, ν κ° μ΄μμ traitμ μμ λ°μ μ μλ€. ν€μλ withλ₯Ό νμ©. ν΄λμ€κ° trait νλλ§μ μμ λ°λ κ²½μ°λ extends ν€μλλ₯Ό μ¬μ©νλ€.
trait Planar {
def height: Int
def width: Int
def surface = height * width
}
κ°μ superνμ
μ κ°λ trait λ€μ stackable modificationμ μ§μνλ€.
Scala's Class Hierarchy
- μ΅μμ ν΄λμ€
scala.Any AnyVal: μλ°μ μμνμ (primitive),int,long,booleanUnitμμAnyValνμ μ΄λ€. (void)νμ΄κΈ° λλ¬Έ?AnyRef: μλ°μ object νμ (λ νΌλ°μ€λ₯Ό κ°λνμ )String,ScalaObject,IterableNull: λͺ¨λAnyRefνμ μ μ΅νμ μλΈνμ ,nullμNullνμ μ΄λ€.Nothing: λͺ¨λ νμ μ μ΅νμ μλΈνμ .val z: Int = nullμ μλνμ§ μλλ€.(Intνμ : AnyVal,Notingνμ : AnyRef)
The Nothing Type
Nothing Typeμ νμμ±
- λΉμ μμ’ λ£μμ νμ©(μμΈ)
- λΉ μ»¬λ μ
μ λνλ΄κΈ° μν¨:
Seq[Noting]
Exception
μμΈμ νμ μ Nothingμ΄λ€.
def error(msg: String) = throw new Error(msg) //> error: (msg: String)Nothing
Exercise
if(true) 1 esle falseμ νμ
μ? => AnyVal
Polymorphism
Cons-Lists
Nil : λΉ λ¦¬μ€νΈλ₯Ό λνλ
Cons : μμ(element)λ₯Ό ν¬ν¨νκ³ , λλ¨Έμ§μ 리μ€νΈλ₯Ό κ°λ¦¬ν€λ ν¬μΈν°λ₯Ό ν¬ν¨ [3][ ], [3][Nil] κ³Ό κ°μ cellνν
Value Parameter
class Cons(val head: Int, val tail: IntList) extends IntList{...}
μμ±μμ val μ μ¬μ©νλ©΄ (public) field μ²λΌ νμ© ν μ μλ€.
class Cons(_head: Int, _tail: IntList) extends IntList{
val head = _head
val tail = _tail
}
### Type Parameters
μμ Cons μμ `Int`λ‘λ§ νμ μ§λ κ²μ narrow νλ€. μ’ λ μΆμνμμΌμ, λ€μκ³Ό κ°μ΄ λ³κ²½νλ€.
```scala
trait List[T]
class Cons[T](val head: T, val tail: List[T]) extends List[T]
class Nil[T] extends List[T]