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 타입의 최하위 서브타입, nullNull타입이다.
  • 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]