-
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)Nothing
if(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]