SlideShare a Scribd company logo
1 of 40
스프링 MVC 스터디 / 배종국
2014-11-04
자바프로그래머를 위한
스칼라
1 설치하기
2 첫번째 예제
3 자바와 함께 사용하기
4 모든 것은 객체다
5 클래스에 대하여
6 케이스 클래스 & 패턴 매칭
7 트레잇에 대하여
8 제네릭 함
설치하기
4
01 홈페이지 다운로드
http://www.scala-lang.org/download/
첫 번째 예제
6
02
object HelloWorld {
def main(args: Array[String]){
println("Hello, world!")
}
}
Hello World
7
02 컴파일 & 실행하기
scalac HelloWorld.scala
컴파일 하기
scala -classpath . HelloWorld
실행하기
자바와 함께 사용하기
9
03
import java.util.{Date, Locale}
import java.text.DateFormat
import java.text.DateFormat._
object FrenchDate {
def main(args: Array[String]) {
val now = new Date
val df = getDateInstance(LONG, Locale.FRANCE)
println(df format now)
}
}
French Date
df.format(now)
모든 것은 객체다
11
04 숫자도 하나의 객체다
1 + 2 * 3 / x
(1).+(((2).*(3))./(x))
1.+((2.*(3))./(x))
12
04 함수마저 객체다
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)
}
} 인자를 받지 않고 아무것도 돌려주지 않는 모든 함수
C/C++ 에서의 void 와 비슷
13
04 이름 없는 함수
object TimerAnonymous {
def oncePerSecond(callback: () => Unit) {
while (true) { callback(); Thread sleep 1000 }
}
def main(args: Array[String]) {
oncePerSecond(() =>
println("time flies like an arrow..."))
}
}
클래스에 대하여
15
05
Complex
class Complex(real: Double, imaginary: Double) {
def re() = real
def im() = imaginary
}
16
05 인자 없는 함수
object ComplexNumbers {
def main(args: Array[String]) {
val c = new Complex(1.2, 3.4)
println("imaginary part: " + c.im())
}
}
17
05
Complex
class Complex(real: Double, imaginary: Double) {
def re = real
def im = imaginary
}
18
05
상속과 재정의
class Complex(real: Double, imaginary: Double) {
def re = real
def im = imaginary
override def toString() =
"" + re + (if (im < 0) "" else "+") + im + "i"
}
scala.AnyRef
케이스 클래스 &
패턴 매칭
20
06
케이스 클래스
간단 덧셈 계산기 만들기 ex : 1+1 , (x+x)+(7+y)
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
 인스턴스를 생성 할 때 new 키워드를 생략 할 수 있다. 다른 말
로, new Const(5)라 쓰는 대신 Const(5)라 쓰면 된다.
 생성자 파라미터들에 대한 getter 함수가 자동으로 정의된다. 다
른 말로, 클래스 Const의 인스턴스 c에 있는 생성자 파라미터 v의
값은 c.v로 접근 가능하다.
21
06
케이스 클래스
간단 덧셈 계산기 만들기 ex : 1+1 , (x+x)+(7+y)
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
 함수 equals와 hashCode도 공짜로 제공된다. 이 함수들은 레퍼런스
의 동일함 보다 구조의 동일함을 확인 하도록 구현되어 있다. 다른 말
로, 생성 된 곳이 다르더라도 각각의 생성자 파라미터 값이 같다면 같
은 것으로 여긴다.
22
05
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
 함수 toString에 대한 기본적 구현이 제공된다. 이 기본적인 구현은
“값이 생성 될 때”의 형태를 출력한다. 예를 들어 x+1의 트리 표현
을 출력 한다면 Sum(Var(x),Const(1))이 된다.
 케이스 클래스들의 인스턴스는 패턴 매칭을 통해 따로 사용 될 수
있다.
케이스 클래스
간단 덧셈 계산기 만들기 ex : 1+1 , (x+x)+(7+y)
23
06 패턴 매칭
{ case "x" => 5 case "y" => 7 }
type Environment = String => Int
산술 표현식을 나타낼 타입 완성 (Tree, Sum, Var, Const)
Environment 를 정의하자. 어떻게???
아래와 같이 해시맵 형태로 만들어 보자.
스칼라에서는 이렇게 간단하게 정의 가능
Environment 는 type 키워드를 사용하여 이렇게 정의하자
“문자열이 오면 정수형으로 바꿔라” 라는 의미
24
06 패턴 매칭
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
}
이제 실제로 계산 하는 함수를 정의하자
요만큼이 match 키워드를 사용한 패턴매칭
25
06 패턴 매칭
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 의 하위 클래스의 멤버 함수 로 정의해도 될 것 같은데??
그렇게 해도 된다.
패턴매칭을 사용하느냐?
멤버함수를 사용하느냐?
는 개발자 취향 문제!!!!
But! 확장성을 고려한다면…
26
06 패턴 매칭 .VS. 멤버 함수
 멤버 함수를 사용하면
단지 Tree에 대한 하위 클래스를 새롭게 정의 함으로
새로운 노드를 추가하기 쉽다.
반면에 트리에 대한 새로운 연산을 추가하는 작업이 고되다.
새로운 연산을 추가하기 위해서는 Tree의 모든 하위 클래스를
변경해야 하기 때문이다.
 패턴 매칭을 사용하면 상황이 반대가 된다.
새로운 노드를 추가하려면 트리에 대해 패턴 매칭을 수행하는
모든 함수들을 새로운 노드도 고려하도록 변경해야 한다.
반면에 새로운 연산을 추가하는 것은 쉽다.
그냥 새로운 독립적인 함수를 만들면 된다.
27
06 패턴 매칭
1. 더하기 표현식은 좌변과 우변을 더한 것이다
2. 변수 v에 대한 심볼 추출은 우리가 추출하기 원하는 심볼과 관련이
있다면 1이 되고 그 외의 경우 0 이 된다
3. 상수에 대한 심볼 추출 값은 0 이다.
def derive(t: Tree, v: String): Tree = t match {
case Sum(l, r) => Sum(derive(l, v), derive(r, v))
case Var(n) if (v == n) => Const(1)
case _ => Const(0)
} 가드 : if 키워드 뒤에 오는
표현식을 뜻함,
추가 조건 부여그 밖의 모든 경우
28
06 테스트 코드 작성
def main(args: Array[String]) {
val exp: Tree = Sum(Sum(Var("x"), Var("x")), Sum(Const(7), Var("y")))
val env: Environment = { case "x" => 5 case "y" => 7 }
println("Expression: " + exp)
println("Evaluation with x=5, y=7: " + eval(exp, env))
println("Derivative relative to x:n " + derive(exp, "x"))
println("Derivative relative to y:n " + derive(exp, "y"))
}
출력 결과 :
Expression: Sum(Sum(Var(x),Var(x)),Sum(Const(7),Var(y)))
Evaluation with x=5, y=7: 24
Derivative relative to x:
Sum(Sum(Const(1),Const(1)),Sum(Const(0),Const(0)))
Derivative relative to y:
Sum(Sum(Const(0),Const(0)),Sum(Const(0),Const(1)))
트레잇에 대하여
30
07 트레잇(trait)
코드를 가질 수 있는 인터페이스
Scala 에서 클래스가 트레잇을 상속한다면?
트레잇의 인터페이스를 구현하라
And 트레잇에 구현된 모든 코드 다 니꺼!!
31
07
trait Ord
객체들의 순서를 비교하는 기능( < , <=, ==, !=, >, >= )
<,==만구현되면모든기능이구현됨
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 의 Comparable 인터페이스와 같은 것!
Ord 에는 세가지 관계식이 기본으로 구현
하나는 추상함수 ( < )
Any 는 Scala 의 최상위 타입!!!
Java 의 Object 타입과 같으나 int, float 와 같은 기본 타입의 상위타입
이라는 점에서 차이가 있다.
구현된 것
32
07
class Date
그레고리력의 날짜를 나타내는 클래스(크기 비교 가능)
<,==만구현되면모든기능이구현됨
class Date(y: Int, m: Int, d: Int) extends Ord {
def year = y
def month = m
def day = d
override def toString(): String = year + "-" + month + "-" + day
override def equals(that: Any): Boolean =
that.isInstanceOf[Date] && {
val o = that.asInstanceOf[Date]
o.day == day && o.month == month && o.year == year
}
def <(that: Any): Boolean = {
if (!that.isInstanceOf[Date])
error("cannot compare " + that + " and a Date")
val o = that.asInstanceOf[Date]
(year < o.year) ||
(year == o.year && (month < o.month ||
(month == o.month && day < o.day)))
}
}
같다
작다
< , == 만 구현 되면 모든 기능이 구현 됨
제넥릭 함
34
08 제네릭
Java 1.5 에 제네릭 지원이 부족하여 여러가지 문제 발생(지우개 문제)
제네릭이 먼지 알려면 여기 :
http://opentutorials.org/module/516/6237
지우개 문제가 먼지 알려면 여기 :
http://newstars.tistory.com/33
제네릭 함(Genericty) 이란
코드를 타입에 대하여 파라미터화 할 수 있는 능력
35
08 링크드 리스트 만들어 보기
[Java]
리스트의 원소 타입을 뭐로 하지 ? Int, Double???
불가능 그냥 Object 로 퉁!
But, int, long, float 같은 기본 타입에서는 정상 동작하지 않음
프로그래머 님이 알아서 해주세요.
[Scala]
제네릭 클래스와 제네릭 함수를 지원
36
08 링크드 리스트 만들어 보기
[Java]
리스트의 원소 타입을 뭐로 하지 ? Int, Double???
불가능 그냥 Object 로 퉁!
But, int, long, float 같은 기본 타입에서는 정상 동작하지 않음
프로그래머 님이 알아서 해주세요.
[Scala]
제네릭 클래스와 제네릭 함수를 지원
37
08
class Reference
간단한 데이터 저장 구조 클래스
class Reference[T] {
private var contents: T = _
def set(value: T) { contents = value }
def get: T = contents
}
얘가 제네릭 하기 위해 쓰는 타입 파라미터,
매크로 문자 같은 거임
요기 조기 막 쓰임
은 훼이크고 필요한 데서 쓰임
38
08
class Reference
간단한 데이터 저장 구조 클래스
class Reference[T] {
private var contents: T = _
def set(value: T) { contents = value }
def get: T = contents
}
기본 값 이라는 의미
수 타입이라면 0,
Boolean 타입이라면 false
Unit 타입이라면 ()
모든 객체 타입은 null
39
08
object IntegerReference
get 함수의 리턴값을 정수 처럼 사용하기 위해 별도의 캐스팅이 필요 없다.
object IntegerReference {
def main(args: Array[String]) {
val cell = new Reference[Int]
cell.set(13)
println("Reference contains the half of " + (cell.get * 2))
}
}
감사합니다
다음 스터디는 스칼라로??
혹시 관심 있으신 분

More Related Content

What's hot

Java9 특징 훑어보기
Java9 특징 훑어보기Java9 특징 훑어보기
Java9 특징 훑어보기duriepark 유현석
 
자바에서 null을 안전하게 다루는 방법
자바에서 null을 안전하게 다루는 방법자바에서 null을 안전하게 다루는 방법
자바에서 null을 안전하게 다루는 방법Sungchul Park
 
ORM을 활용할 경우의 설계, 개발 과정
ORM을 활용할 경우의 설계, 개발 과정ORM을 활용할 경우의 설계, 개발 과정
ORM을 활용할 경우의 설계, 개발 과정Javajigi Jaesung
 
스파크와 이클립스_연동하기
스파크와 이클립스_연동하기스파크와 이클립스_연동하기
스파크와 이클립스_연동하기Dohyung Park
 
[세미나] 20160819 Java 프로그래머를 위한 Scala 튜토리얼
[세미나] 20160819 Java 프로그래머를 위한 Scala 튜토리얼[세미나] 20160819 Java 프로그래머를 위한 Scala 튜토리얼
[세미나] 20160819 Java 프로그래머를 위한 Scala 튜토리얼Sanghoon Yoon
 
Why what how kotlin
Why what how kotlinWhy what how kotlin
Why what how kotlinSewonKo
 
자바8강의 1강. lambda expression
자바8강의 1강. lambda expression자바8강의 1강. lambda expression
자바8강의 1강. lambda expressionSejong Park
 

What's hot (13)

Java9 특징 훑어보기
Java9 특징 훑어보기Java9 특징 훑어보기
Java9 특징 훑어보기
 
자바에서 null을 안전하게 다루는 방법
자바에서 null을 안전하게 다루는 방법자바에서 null을 안전하게 다루는 방법
자바에서 null을 안전하게 다루는 방법
 
Java lambda
Java lambdaJava lambda
Java lambda
 
Java class
Java classJava class
Java class
 
Java 기초
Java 기초Java 기초
Java 기초
 
ORM을 활용할 경우의 설계, 개발 과정
ORM을 활용할 경우의 설계, 개발 과정ORM을 활용할 경우의 설계, 개발 과정
ORM을 활용할 경우의 설계, 개발 과정
 
스파크와 이클립스_연동하기
스파크와 이클립스_연동하기스파크와 이클립스_연동하기
스파크와 이클립스_연동하기
 
Realm시작하기
Realm시작하기Realm시작하기
Realm시작하기
 
[세미나] 20160819 Java 프로그래머를 위한 Scala 튜토리얼
[세미나] 20160819 Java 프로그래머를 위한 Scala 튜토리얼[세미나] 20160819 Java 프로그래머를 위한 Scala 튜토리얼
[세미나] 20160819 Java 프로그래머를 위한 Scala 튜토리얼
 
JDK 변천사
JDK 변천사JDK 변천사
JDK 변천사
 
Java extends
Java extendsJava extends
Java extends
 
Why what how kotlin
Why what how kotlinWhy what how kotlin
Why what how kotlin
 
자바8강의 1강. lambda expression
자바8강의 1강. lambda expression자바8강의 1강. lambda expression
자바8강의 1강. lambda expression
 

Similar to 자바프로그래머를 위한 스칼라

Scala, Scalability
Scala, ScalabilityScala, Scalability
Scala, ScalabilityDongwook Lee
 
R 기초 : R Basics
R 기초 : R BasicsR 기초 : R Basics
R 기초 : R BasicsYoonwhan Lee
 
일단 시작하는 코틀린
일단 시작하는 코틀린일단 시작하는 코틀린
일단 시작하는 코틀린Park JoongSoo
 
자바 테스트 자동화
자바 테스트 자동화자바 테스트 자동화
자바 테스트 자동화Sungchul Park
 
Introduction to Fork Join Framework_SYS4U I&C
Introduction to Fork Join Framework_SYS4U I&CIntroduction to Fork Join Framework_SYS4U I&C
Introduction to Fork Join Framework_SYS4U I&Csys4u
 
Javascript 완벽 가이드 정리
Javascript 완벽 가이드 정리Javascript 완벽 가이드 정리
Javascript 완벽 가이드 정리ETRIBE_STG
 
SpringCamp 2013 : About Jdk8
SpringCamp 2013 : About Jdk8SpringCamp 2013 : About Jdk8
SpringCamp 2013 : About Jdk8Sangmin Lee
 
자바와 사용하기2
자바와 사용하기2자바와 사용하기2
자바와 사용하기2destinycs
 
집단지성 프로그래밍 03-군집발견-03
집단지성 프로그래밍 03-군집발견-03집단지성 프로그래밍 03-군집발견-03
집단지성 프로그래밍 03-군집발견-03Kwang Woo NAM
 
JVM 메모리 해부학
JVM 메모리 해부학JVM 메모리 해부학
JVM 메모리 해부학Greg Lee
 
외계어 스터디 2/5 - Expressions & statements
외계어 스터디 2/5 - Expressions & statements외계어 스터디 2/5 - Expressions & statements
외계어 스터디 2/5 - Expressions & statements민태 김
 
파이썬+주요+용어+정리 20160304
파이썬+주요+용어+정리 20160304파이썬+주요+용어+정리 20160304
파이썬+주요+용어+정리 20160304Yong Joon Moon
 
[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로
[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로
[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로Oracle Korea
 
Collection framework
Collection frameworkCollection framework
Collection frameworkssuser34b989
 

Similar to 자바프로그래머를 위한 스칼라 (20)

Scalability
ScalabilityScalability
Scalability
 
Scala, Scalability
Scala, ScalabilityScala, Scalability
Scala, Scalability
 
Scala
ScalaScala
Scala
 
R 기초 : R Basics
R 기초 : R BasicsR 기초 : R Basics
R 기초 : R Basics
 
Javascript
JavascriptJavascript
Javascript
 
일단 시작하는 코틀린
일단 시작하는 코틀린일단 시작하는 코틀린
일단 시작하는 코틀린
 
자바 테스트 자동화
자바 테스트 자동화자바 테스트 자동화
자바 테스트 자동화
 
Introduction to Fork Join Framework_SYS4U I&C
Introduction to Fork Join Framework_SYS4U I&CIntroduction to Fork Join Framework_SYS4U I&C
Introduction to Fork Join Framework_SYS4U I&C
 
Javascript 완벽 가이드 정리
Javascript 완벽 가이드 정리Javascript 완벽 가이드 정리
Javascript 완벽 가이드 정리
 
SpringCamp 2013 : About Jdk8
SpringCamp 2013 : About Jdk8SpringCamp 2013 : About Jdk8
SpringCamp 2013 : About Jdk8
 
자바와 사용하기2
자바와 사용하기2자바와 사용하기2
자바와 사용하기2
 
R 시작해보기
R 시작해보기R 시작해보기
R 시작해보기
 
집단지성 프로그래밍 03-군집발견-03
집단지성 프로그래밍 03-군집발견-03집단지성 프로그래밍 03-군집발견-03
집단지성 프로그래밍 03-군집발견-03
 
JVM 메모리 해부학
JVM 메모리 해부학JVM 메모리 해부학
JVM 메모리 해부학
 
외계어 스터디 2/5 - Expressions & statements
외계어 스터디 2/5 - Expressions & statements외계어 스터디 2/5 - Expressions & statements
외계어 스터디 2/5 - Expressions & statements
 
파이썬+주요+용어+정리 20160304
파이썬+주요+용어+정리 20160304파이썬+주요+용어+정리 20160304
파이썬+주요+용어+정리 20160304
 
[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로
[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로
[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로
 
Java.next
Java.nextJava.next
Java.next
 
Collection framework
Collection frameworkCollection framework
Collection framework
 
함수적 사고 2장
함수적 사고 2장함수적 사고 2장
함수적 사고 2장
 

자바프로그래머를 위한 스칼라

  • 1. 스프링 MVC 스터디 / 배종국 2014-11-04 자바프로그래머를 위한 스칼라
  • 2. 1 설치하기 2 첫번째 예제 3 자바와 함께 사용하기 4 모든 것은 객체다 5 클래스에 대하여 6 케이스 클래스 & 패턴 매칭 7 트레잇에 대하여 8 제네릭 함
  • 6. 6 02 object HelloWorld { def main(args: Array[String]){ println("Hello, world!") } } Hello World
  • 7. 7 02 컴파일 & 실행하기 scalac HelloWorld.scala 컴파일 하기 scala -classpath . HelloWorld 실행하기
  • 9. 9 03 import java.util.{Date, Locale} import java.text.DateFormat import java.text.DateFormat._ object FrenchDate { def main(args: Array[String]) { val now = new Date val df = getDateInstance(LONG, Locale.FRANCE) println(df format now) } } French Date df.format(now)
  • 11. 11 04 숫자도 하나의 객체다 1 + 2 * 3 / x (1).+(((2).*(3))./(x)) 1.+((2.*(3))./(x))
  • 12. 12 04 함수마저 객체다 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) } } 인자를 받지 않고 아무것도 돌려주지 않는 모든 함수 C/C++ 에서의 void 와 비슷
  • 13. 13 04 이름 없는 함수 object TimerAnonymous { def oncePerSecond(callback: () => Unit) { while (true) { callback(); Thread sleep 1000 } } def main(args: Array[String]) { oncePerSecond(() => println("time flies like an arrow...")) } }
  • 15. 15 05 Complex class Complex(real: Double, imaginary: Double) { def re() = real def im() = imaginary }
  • 16. 16 05 인자 없는 함수 object ComplexNumbers { def main(args: Array[String]) { val c = new Complex(1.2, 3.4) println("imaginary part: " + c.im()) } }
  • 17. 17 05 Complex class Complex(real: Double, imaginary: Double) { def re = real def im = imaginary }
  • 18. 18 05 상속과 재정의 class Complex(real: Double, imaginary: Double) { def re = real def im = imaginary override def toString() = "" + re + (if (im < 0) "" else "+") + im + "i" } scala.AnyRef
  • 20. 20 06 케이스 클래스 간단 덧셈 계산기 만들기 ex : 1+1 , (x+x)+(7+y) 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  인스턴스를 생성 할 때 new 키워드를 생략 할 수 있다. 다른 말 로, new Const(5)라 쓰는 대신 Const(5)라 쓰면 된다.  생성자 파라미터들에 대한 getter 함수가 자동으로 정의된다. 다 른 말로, 클래스 Const의 인스턴스 c에 있는 생성자 파라미터 v의 값은 c.v로 접근 가능하다.
  • 21. 21 06 케이스 클래스 간단 덧셈 계산기 만들기 ex : 1+1 , (x+x)+(7+y) 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  함수 equals와 hashCode도 공짜로 제공된다. 이 함수들은 레퍼런스 의 동일함 보다 구조의 동일함을 확인 하도록 구현되어 있다. 다른 말 로, 생성 된 곳이 다르더라도 각각의 생성자 파라미터 값이 같다면 같 은 것으로 여긴다.
  • 22. 22 05 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  함수 toString에 대한 기본적 구현이 제공된다. 이 기본적인 구현은 “값이 생성 될 때”의 형태를 출력한다. 예를 들어 x+1의 트리 표현 을 출력 한다면 Sum(Var(x),Const(1))이 된다.  케이스 클래스들의 인스턴스는 패턴 매칭을 통해 따로 사용 될 수 있다. 케이스 클래스 간단 덧셈 계산기 만들기 ex : 1+1 , (x+x)+(7+y)
  • 23. 23 06 패턴 매칭 { case "x" => 5 case "y" => 7 } type Environment = String => Int 산술 표현식을 나타낼 타입 완성 (Tree, Sum, Var, Const) Environment 를 정의하자. 어떻게??? 아래와 같이 해시맵 형태로 만들어 보자. 스칼라에서는 이렇게 간단하게 정의 가능 Environment 는 type 키워드를 사용하여 이렇게 정의하자 “문자열이 오면 정수형으로 바꿔라” 라는 의미
  • 24. 24 06 패턴 매칭 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 } 이제 실제로 계산 하는 함수를 정의하자 요만큼이 match 키워드를 사용한 패턴매칭
  • 25. 25 06 패턴 매칭 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 의 하위 클래스의 멤버 함수 로 정의해도 될 것 같은데?? 그렇게 해도 된다. 패턴매칭을 사용하느냐? 멤버함수를 사용하느냐? 는 개발자 취향 문제!!!! But! 확장성을 고려한다면…
  • 26. 26 06 패턴 매칭 .VS. 멤버 함수  멤버 함수를 사용하면 단지 Tree에 대한 하위 클래스를 새롭게 정의 함으로 새로운 노드를 추가하기 쉽다. 반면에 트리에 대한 새로운 연산을 추가하는 작업이 고되다. 새로운 연산을 추가하기 위해서는 Tree의 모든 하위 클래스를 변경해야 하기 때문이다.  패턴 매칭을 사용하면 상황이 반대가 된다. 새로운 노드를 추가하려면 트리에 대해 패턴 매칭을 수행하는 모든 함수들을 새로운 노드도 고려하도록 변경해야 한다. 반면에 새로운 연산을 추가하는 것은 쉽다. 그냥 새로운 독립적인 함수를 만들면 된다.
  • 27. 27 06 패턴 매칭 1. 더하기 표현식은 좌변과 우변을 더한 것이다 2. 변수 v에 대한 심볼 추출은 우리가 추출하기 원하는 심볼과 관련이 있다면 1이 되고 그 외의 경우 0 이 된다 3. 상수에 대한 심볼 추출 값은 0 이다. def derive(t: Tree, v: String): Tree = t match { case Sum(l, r) => Sum(derive(l, v), derive(r, v)) case Var(n) if (v == n) => Const(1) case _ => Const(0) } 가드 : if 키워드 뒤에 오는 표현식을 뜻함, 추가 조건 부여그 밖의 모든 경우
  • 28. 28 06 테스트 코드 작성 def main(args: Array[String]) { val exp: Tree = Sum(Sum(Var("x"), Var("x")), Sum(Const(7), Var("y"))) val env: Environment = { case "x" => 5 case "y" => 7 } println("Expression: " + exp) println("Evaluation with x=5, y=7: " + eval(exp, env)) println("Derivative relative to x:n " + derive(exp, "x")) println("Derivative relative to y:n " + derive(exp, "y")) } 출력 결과 : Expression: Sum(Sum(Var(x),Var(x)),Sum(Const(7),Var(y))) Evaluation with x=5, y=7: 24 Derivative relative to x: Sum(Sum(Const(1),Const(1)),Sum(Const(0),Const(0))) Derivative relative to y: Sum(Sum(Const(0),Const(0)),Sum(Const(0),Const(1)))
  • 30. 30 07 트레잇(trait) 코드를 가질 수 있는 인터페이스 Scala 에서 클래스가 트레잇을 상속한다면? 트레잇의 인터페이스를 구현하라 And 트레잇에 구현된 모든 코드 다 니꺼!!
  • 31. 31 07 trait Ord 객체들의 순서를 비교하는 기능( < , <=, ==, !=, >, >= ) <,==만구현되면모든기능이구현됨 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 의 Comparable 인터페이스와 같은 것! Ord 에는 세가지 관계식이 기본으로 구현 하나는 추상함수 ( < ) Any 는 Scala 의 최상위 타입!!! Java 의 Object 타입과 같으나 int, float 와 같은 기본 타입의 상위타입 이라는 점에서 차이가 있다. 구현된 것
  • 32. 32 07 class Date 그레고리력의 날짜를 나타내는 클래스(크기 비교 가능) <,==만구현되면모든기능이구현됨 class Date(y: Int, m: Int, d: Int) extends Ord { def year = y def month = m def day = d override def toString(): String = year + "-" + month + "-" + day override def equals(that: Any): Boolean = that.isInstanceOf[Date] && { val o = that.asInstanceOf[Date] o.day == day && o.month == month && o.year == year } def <(that: Any): Boolean = { if (!that.isInstanceOf[Date]) error("cannot compare " + that + " and a Date") val o = that.asInstanceOf[Date] (year < o.year) || (year == o.year && (month < o.month || (month == o.month && day < o.day))) } } 같다 작다 < , == 만 구현 되면 모든 기능이 구현 됨
  • 34. 34 08 제네릭 Java 1.5 에 제네릭 지원이 부족하여 여러가지 문제 발생(지우개 문제) 제네릭이 먼지 알려면 여기 : http://opentutorials.org/module/516/6237 지우개 문제가 먼지 알려면 여기 : http://newstars.tistory.com/33 제네릭 함(Genericty) 이란 코드를 타입에 대하여 파라미터화 할 수 있는 능력
  • 35. 35 08 링크드 리스트 만들어 보기 [Java] 리스트의 원소 타입을 뭐로 하지 ? Int, Double??? 불가능 그냥 Object 로 퉁! But, int, long, float 같은 기본 타입에서는 정상 동작하지 않음 프로그래머 님이 알아서 해주세요. [Scala] 제네릭 클래스와 제네릭 함수를 지원
  • 36. 36 08 링크드 리스트 만들어 보기 [Java] 리스트의 원소 타입을 뭐로 하지 ? Int, Double??? 불가능 그냥 Object 로 퉁! But, int, long, float 같은 기본 타입에서는 정상 동작하지 않음 프로그래머 님이 알아서 해주세요. [Scala] 제네릭 클래스와 제네릭 함수를 지원
  • 37. 37 08 class Reference 간단한 데이터 저장 구조 클래스 class Reference[T] { private var contents: T = _ def set(value: T) { contents = value } def get: T = contents } 얘가 제네릭 하기 위해 쓰는 타입 파라미터, 매크로 문자 같은 거임 요기 조기 막 쓰임 은 훼이크고 필요한 데서 쓰임
  • 38. 38 08 class Reference 간단한 데이터 저장 구조 클래스 class Reference[T] { private var contents: T = _ def set(value: T) { contents = value } def get: T = contents } 기본 값 이라는 의미 수 타입이라면 0, Boolean 타입이라면 false Unit 타입이라면 () 모든 객체 타입은 null
  • 39. 39 08 object IntegerReference get 함수의 리턴값을 정수 처럼 사용하기 위해 별도의 캐스팅이 필요 없다. object IntegerReference { def main(args: Array[String]) { val cell = new Reference[Int] cell.set(13) println("Reference contains the half of " + (cell.get * 2)) } }