-
Notifications
You must be signed in to change notification settings - Fork 36
Fppis week 3
Brandon JeongYeol Choi edited this page Aug 12, 2013
·
2 revisions
자바와 동일한 부분
- 선언만 존재하고 구현부가 존재하지 않는 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 옵션
}자바의 메인 메소드public static void main(String[] args){...}에 해당하는 스칼라의 코드
object Hello{
def main(args: Array[String]) = println("hello world!")
}스칼라를 포함한 Object-oriented 언어는 dynamic method dispatch 를 구현한다. 이것은 호출 될 오브젝트의 메소드가 실행 시간에 결정 된다는 것이다.
오브젝트를 고차함수(higher-order function)라고 부를 수 있나?
고차함수(higher-order function)을 오브젝트라고 부를 수 있나?
스칼라는 자바와 마찬가지로 package로 네임스페이스를 구분한다.
- fully qualified name: 패키지명+클래스(오브젝트) 이름
import week3.Rational // Rational 타입만 import
import week3.{Rational, Hello} // Rational, Hello 타입만 import
import week3._ // week3.* 과 같음(wildcard import)기본적으로 import 되는 entity는,
-
scala패키지 -
java.lang패키지 -
scala.Predef싱글턴 오브젝트의 모든 멤버
www.scala-lang.org/api/current
Trait은 자바의 abstract class와 비슷하지만, 한 개 이상의 trait을 상속 받을 수 있다. 키워드 with를 활용. 클래스가 trait 하나만을 상속 받는 경우는 extends 키워드를 사용한다.
trait Planar {
def height: Int
def width: Int
def surface = height * width
}같은 super타입을 갖는 trait 들은 stackable modification을 지원한다.
- 최상위 클래스
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)
Nothing Type의 필요성
- 비정상종료에서 활용(예외)
- 빈 컬렉션을 나타내기 위함:
Seq[Noting]
예외의 타입은 Nothing이다.
def error(msg: String) = throw new Error(msg) //> error: (msg: String)Nothingif(true) 1 esle false의 타입은? => AnyVal
Nil : 빈 리스트를 나타냄
Cons : 요소(element)를 포함하고, 나머지의 리스트를 가리키는 포인터를 포함 [3][ ], [3][Nil] 과 같은 cell형태
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]