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, boolean
  • Unit μ—­μ‹œ AnyVal νƒ€μž…μ΄λ‹€. (void)ν˜•μ΄κΈ° λ•Œλ¬Έ?
  • AnyRef: μžλ°”μ˜ object νƒ€μž…(레퍼런슀λ₯Ό κ°–λŠ”νƒ€μž…) String, ScalaObject, Iterable
  • Null: λͺ¨λ“  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]