본문 바로가기

Scala

[Scala] Higher-order Functions 스칼라에서는 고차 함수를 지원한다. 간단하게 설명하면 다른 함수의 파라미터를 받아서 처리하는 것이 가능하다?! 아래의 예제를 보면 decorator의 layout과 7이라는 파라미터를 전달하면 apply에서 실행을 시켜준다. class Decorator(left: String, right: String) { def layout[A](x: A) = left + x.toString() + right}object FunTest extends App { def apply(f: Int => String, v: Int) = f(v) val decorator = new Decorator("[", "]") println(apply(decorator.layout, 7))} 실행결과는 아래와 같이 나온다. [7] 여기서 .. 더보기
[Scala] Automatic Type-Dependent Closure Construction 스칼라에서는 이름이 없는 함수를 파라미터로 전달이 가능하다. whileLoop라는 함수가 정의되어지고 Boolean과 Unit을 받는다. 그리고 내부에서는 true인 경우 계속해서 whileLoop를 호출하도록 구성이 되어져서 다른 언어에서 키워드처럼?! 사용이 가능하다. object TargetTest1 extends App { def whileLoop(cond: => Boolean)(body: => Unit): Unit = if (cond) { body whileLoop(cond)(body) } var i = 10 whileLoop (i > 0) { println(i) i -= 1 }} 다른 예를 보자 이것은 unless를 사용하는 방법이다. 위의 방법과는 다르게 body후에 파라미터를 입력 받는 방.. 더보기
[Scala] Nested Functions 스칼라에서는 내부 함수??를 만들어서 사용이 가능하다. 말보단 코드로... object FilterTest extends App { def filter(xs: List[Int], threshold: Int) = { def process(ys: List[Int]): List[Int] = if (ys.isEmpty) ys else if (ys.head 더보기
[Scala] Mixin Class Composition 각각의 다른 정의가 이루어진 클래스를 하나로 합치는 방법이다. AbsIterator 클래스를 상속 받아서 2개의 클래스가 정의가 된다. abstract class AbsIterator { type T def hasNext: Boolean def next: T} foreach를 구현한 클래스와 trait RichIterator extends AbsIterator { def foreach(f: T => Unit) { while (hasNext) f(next) }} String을 사용하는 클래스 class StringIterator(s: String) extends AbsIterator { type T = Char private var i = 0 def hasNext = i 더보기
[Scala] Implicit Parameters implicit 키워드를 사용하게 되면 prefix 없이 접근이 가능하고 그리고 넘겨 받을 수 있는 인수 또한 implicit라고 선언한 인수만 받을 수 있다. abstract class SemiGroup[A] { def add(x: A, y: A): A}abstract class Monoid[A] extends SemiGroup[A] { def unit: A}object ImplicitTest extends App { implicit object StringMonoid extends Monoid[String] { def add(x: String, y: String): String = x concat y def unit: String = "" } implicit object IntMonoid extend.. 더보기
[Scala] Generic Classes Scala에도 Java처럼 Generic이 있다. 당연히 Java 1.5부터 가능하다 Generic 클래스는class Stack[T] { var elems: List[T] = Nil def push(x: T) { elems = x :: elems } def top: T = elems.head def pop() { elems = elems.tail }} 사용은 그대로 object GenericsTest extends App { val stack = new Stack[Int] stack.push(1) stack.push('a') println(stack.top) stack.pop() println(stack.top)} 결과는 아래와 같이 나온다.971 더보기
[Scala] Case Classes 사용방법abstract class Termcase class Var(name: String) extends Termcase class Fun(arg: String, body: Term) extends Termcase class App(f: Term, v: Term) extends Term 사용 예제 1Fun("x", Fun("y", App(Var("x"), Var("y")))) 사용 예제 2val x = Var("x")println(x.name) 사용 예제 3val x1 = Var("x")val x2 = Var("x")val y1 = Var("y")println("" + x1 + " == " + x2 + " => " + (x1 == x2))println("" + x1 + " == " + y1 + " =>.. 더보기
[Scala] 맛보기~! (2) - Java 사용하기 import java.util.{Date, Locale} //클래스 지정import java.text.DateFormatimport java.text.DateFormat._ // *은 특수한 키워드로 _ 가 Java에서의 *이다. object FrenchDate { def main(args: Array[String]) { var now = new Date //Java 의 Date 생성 val df = getDateInstance(LONG, Locale.FRANCE) println(df format now) }} df format now 의미는 Java로 표현하면 이것 과 같다. df.format(now) - 모든 것은 Object 이다. Java는 기본자료형이 있지만 Scala의 경.. 더보기
[Scala] 맛보기~! 1. Map 사용법var capital = Map("US" -> "Washington", "France" -> "Paris") capital += ("Japan" -> "Tokyo") println(capital("France")) 2. 재귀 함수 println(factorial(30)) def factorial(x: BigInt): BigInt = if (x == 0) 1 else x * factorial(x-1) 3. Java vs Scala3-1Java의 경우 class MyClass { private int index; private String name; public MyClass(int index, String name) { this.index = index; this.name = name; .. 더보기
OS X에서 Scala 개발 환경 구축하기~! 1. scala 설치하기~! (homebrew설치가 되어있어야한다!)터미널에서 다음과 같이 입력brew install scala 2. IDE 다운받기 3. 테스트 프로젝트 생성 그리고 다음과 같은 코드를 실행한다. object HelloWorld { def main(args: Array[String]): Unit = { println("Hello, world!") } } 더보기