2. 1. Scala는?
2. Hello world!
3. Java와 함께 사용하기
4. 모든 것은 객체다
5. 클래스에 대하여
6. Q&A
목차
3. 1.1 페이지 제목
Scala는?
3 / 14
Scala는 함수형 프로그래밍과 very strong static type system을 지원하는 프로그래밍 언어이다.
• Scala의 소스코드는 Java 바이트코드로 컴파일된다.
• 따라서 JVM에서 구동된다.
• Java library 코드를 소스코드에서 바로 사용할 수 있다.
• Java의 단점을 보완하기 위한 언어.
• JVM 기반의 언어 중 단연 최고의 인기도.
• Learning curve.
• Apache Spark에서 사용.
4. 2.1 도형 4 / 14
Hello world!
object HelloWorld {
def main(args: Array[String]) {
println("Hello, world!")
}
}
• object는 singleton class.
• Scala에는 static이라는 개념이 없다.
• static 변수 및 메서드는 전부 object에 집어 넣는다.
5. 2.1 도형 5 / 14
Java와 함께 사용하기
import java.util.{Date, Locale}
import java.text.DateFormat
import java.text.DateFormat._
object USDate {
def main(args: Array[String]) {
val now = new Date
val df = getDateInstance(LONG, Locale.US)
// equivalent to df.format(now)
println(df format now)
}
}
• Java 코드와 함께 사용할 수 있다. (java.lang 패키지는 import 없이 사용 가능)
• import 구문에서 * 대신 _ 사용
• 하나의 매개변수를 가지는 메서드는 이항 연산자와 같이 쓸 수 있다.
6. 2.1 도형 6 / 14
모든 것은 객체다
object Timer {
def oncePerSecond(callback: () => Unit) {
while (true) { callback(); Thread sleep 1000 }
}
def timeFlies() {
println("time flies like an arrow...")
}
def main(args: Array[String]) {
oncePerSecond(timeFlies)
}
}
• Java에서 기본 타입이었던 int나 boolean도 Scala에서는 객체다.
– 1 + 2 * 3 / x
– (1).+(((2).*(3))./(x))
• 함수마저 객체다. (함수형 프로그래밍)
• 이름 없는 함수도 만들 수 있다.
7. 2.1 도형 7 / 14
클래스에 대하여
class Complex(real: Double, imaginary: Double) {
def re() = real
def im() = imaginary
}
• 생성자 역할을 하는 부분이 클래스 선언부에 갈 수 있다.
• 프로퍼티 기능이 있다.
• override 키워드로 상위 클래스의 메서드를 상속할 수 있다.
class Complex(real: Double, imaginary: Double) {
def re = real
def im = imaginary
override def toString() =
"" + re + (if (im < 0) "" else "+") + im + "i"
}
8. 2.1 도형 8 / 14
케이스 클래스 그리고 패턴 매칭
abstract class Tree
case class Sum(l: Tree, r: Tree) extends Tree
case class Var(n: String) extends Tree
case class Const(v: Int) extends Tree
• 산술 표현식을 나타내는 트리를 정의하자.
• Java에서는 Tree 추상 클래스 및 Node와 Leaf에 대한 하위 클래스를 정의했을 것이다.
• Scala에서는 추상 클래스와 일반 클래스 사이에 있는 케이스 클래스를 이용할 수 있다.
• 케이스 클래스는 다음과 같은 특성을 지닌다.
– 인스턴스를 생성할 때 new 키워드를 생략할 수 있다. (new Const(5) 대신 Const(5))
– 생성자 파라미터들에 대한 getter 메서드가 자동으로 정의된다.
– equals, hashCode 메서드도 공짜로 제공된다. 생성자 파라미터 값이 같다면 같은 것으로 여긴다.
– toString 메서드에 대한 기본적 구현이 제공된다.
9. 2.1 도형 9 / 14
케이스 클래스 그리고 패턴 매칭
type Environment = String => Int
• 주어진 환경에서 산술 표현식에 맞게 값을 계산하는 함수를 정의하자.
• 산술 표현식을 나타낼 수 있는 데이터 타입을 정의했으니 이제 그것들을 계산할 연산자들
을 정의할 차례다.
• 먼저 변수들의 값을 지정하는 환경을 선언하자.
def eval(t: Tree, env: Environment): Int = t match {
case Sum(l, r) => eval(l, env) + eval(r, env)
case Var(n) => env(n)
case Const(v) => v
}
• 왜 eval 함수를 Tree의 메서드로 정의하지 않았을까? (취향 문제)
• 멤버 함수로 정의하게 되면 새로운 데이터 타입을 추가하기 쉽지만 새로운 연산을 추가할
때마다 모든 하위 클래스의 해당 메서드를 정의해야 한다.
• 패턴 매칭을 사용하면 정반대이다.
10. 2.1 도형 10 / 14
트레잇에 대하여
trait Ord {
def < (that: Any): Boolean
def <=(that: Any): Boolean = (this < that) || (this == that)
def > (that: Any): Boolean = !(this <= that)
def >=(that: Any): Boolean = !(this < that)
}
• Java의 interface와 비슷하다.
• interface에 로직이 있는 것이라고 생각하면 된다.
• 연산자 오버로딩이 가능하다.
11. 2.1 도형 11 / 14
제네릭함
class Reference[T] {
private var contents: T = _
def set(value: T) { contents = value }
def get: T = contents
}
• 타입 T가 파라미터화 되어있다.
• _는 기본값을 뜻한다. (Int는 0, Boolean은 false, 객체는 null)
object IntegerReference {
def main(args: Array[String]) {
val cell = new Reference[Int]
cell.set(13)
println("Reference contains the half of " + (cell.get * 2))
}
}
12. 1.1 페이지 제목
마치며
12 / 14
• Scala By Example
• 참조
– 자바 프로그래머를 위한 스칼라 튜토리얼
– Scala (programming language)_Wikipedia