[세미나] 20160819 java 프로그래머를 위한 scala...

14
Java 프프프프프프 프프 Scala 프프프프 2016.08.19 KAIST iDBLab 프프프 이 이이이 이이이이이 이이이이이이이 . 이이이이

Upload: sanghun-yun

Post on 17-Jan-2017

35 views

Category:

Technology


5 download

TRANSCRIPT

Page 1: [세미나] 20160819 Java 프로그래머를 위한 Scala 튜토리얼

Java 프로그래머를 위한Scala 튜토리얼

2016.08.19

KAIST iDBLab

윤상훈

이 문서는 나눔글꼴로 작성되었습니다 . 설치하기

Page 2: [세미나] 20160819 Java 프로그래머를 위한 Scala 튜토리얼

1. Scala 는 ?

2. Hello world!

3. Java 와 함께 사용하기

4. 모든 것은 객체다

5. 클래스에 대하여

6. Q&A

목차

Page 3: [세미나] 20160819 Java 프로그래머를 위한 Scala 튜토리얼

1.1 페이지 제목

Scala 는 ?3 / 14

Scala 는 함수형 프로그래밍과 very strong static type system 을 지원하는 프로그래밍 언어이다 .

•Scala 의 소스코드는 Java 바이트코드로 컴파일된다 .•따라서 JVM 에서 구동된다 .•Java library 코드를 소스코드에서 바로 사용할 수 있다 .•Java 의 단점을 보완하기 위한 언어 .•JVM 기반의 언어 중 단연 최고의 인기도 .•Learning curve.•Apache Spark 에서 사용 .

Page 4: [세미나] 20160819 Java 프로그래머를 위한 Scala 튜토리얼

2.1 도형 4 / 14

Hello world!object HelloWorld { def main(args: Array[String]) { println("Hello, world!") }}

•object 는 singleton class.•Scala 에는 static 이라는 개념이 없다 .•static 변수 및 메서드는 전부 object 에 집어 넣는다 .

Page 5: [세미나] 20160819 Java 프로그래머를 위한 Scala 튜토리얼

2.1 도형 5 / 14

Java 와 함께 사용하기import java.util.{Date, Locale}import java.text.DateFormatimport 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 구문에서 * 대신 _ 사용•하나의 매개변수를 가지는 메서드는 이항 연산자와 같이 쓸 수 있다 .

Page 6: [세미나] 20160819 Java 프로그래머를 위한 Scala 튜토리얼

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))

•함수마저 객체다 . ( 함수형 프로그래밍 )•이름 없는 함수도 만들 수 있다 .

Page 7: [세미나] 20160819 Java 프로그래머를 위한 Scala 튜토리얼

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"}

Page 8: [세미나] 20160819 Java 프로그래머를 위한 Scala 튜토리얼

2.1 도형 8 / 14

케이스 클래스 그리고 패턴 매칭abstract class Treecase class Sum(l: Tree, r: Tree) extends Treecase class Var(n: String) extends Treecase class Const(v: Int) extends Tree

•산술 표현식을 나타내는 트리를 정의하자 .•Java 에서는 Tree 추상 클래스 및 Node 와 Leaf 에 대한 하위 클래스를 정의했을

것이다 .•Scala 에서는 추상 클래스와 일반 클래스 사이에 있는 케이스 클래스를 이용할 수 있다 .•케이스 클래스는 다음과 같은 특성을 지닌다 .

–인스턴스를 생성할 때 new 키워드를 생략할 수 있다 . (new Const(5) 대신 Const(5))–생성자 파라미터들에 대한 getter 메서드가 자동으로 정의된다 .–equals, hashCode 메서드도 공짜로 제공된다 . 생성자 파라미터 값이 같다면 같은 것으로 여긴다 .–toString 메서드에 대한 기본적 구현이 제공된다 .

Page 9: [세미나] 20160819 Java 프로그래머를 위한 Scala 튜토리얼

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 의 메서드로 정의하지 않았을까 ? ( 취향 문제 )•멤버 함수로 정의하게 되면 새로운 데이터 타입을 추가하기 쉽지만 새로운 연산을 추가할

때마다 모든 하위 클래스의 해당 메서드를 정의해야 한다 .•패턴 매칭을 사용하면 정반대이다 .

Page 10: [세미나] 20160819 Java 프로그래머를 위한 Scala 튜토리얼

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 에 로직이 있는 것이라고 생각하면 된다 .•연산자 오버로딩이 가능하다 .

Page 11: [세미나] 20160819 Java 프로그래머를 위한 Scala 튜토리얼

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)) }}

Page 12: [세미나] 20160819 Java 프로그래머를 위한 Scala 튜토리얼

1.1 페이지 제목

마치며

12 / 14

•Scala By Example•참조

–자바 프로그래머를 위한 스칼라 튜토리얼 –Scala (programming language)_Wikipedia

Page 13: [세미나] 20160819 Java 프로그래머를 위한 Scala 튜토리얼

Q&A

이 문서는 나눔글꼴로 작성되었습니다 . 설치하기

Page 14: [세미나] 20160819 Java 프로그래머를 위한 Scala 튜토리얼

감사합니다

이 문서는 나눔글꼴로 작성되었습니다 . 설치하기