본문 바로가기

scala

Scala Style Guide Scala 로 코딩하는 이들을 위해서 스타일 가이드를 남겨둔다.참고: https://class.coursera.org/progfun-002/wiki/view?page=ScalaStyleGuide (이 링크는 없어질 수도 있다.) Scala Style GuideOn this page you can find a list of common issues that we detected while looking at some submissions.Some of the style issues can be detected by the automated style checker that we also use for the grading process. The style checker, which is based on S.. 더보기
function's placeholder annotation Scala 에서 아래와 같이 코드를 작성할 수 있다. val list = List("abc", "def", "ddddd") list.map(str => Vector(str: _*)) 결과가 어떻게 될까? 재미있게도 아래와 같이 나온다.List[scala.collection.immutable.Vector[Char]] = List(Vector(a, b, c), Vector(d, e, f), Vector(d, d, d, d, d)) 여기서 str: _* 은 무슨 일을 하는 녀석일까?이 녀석은 str 안에 있는 Char 들의 갯수만큼 Vector 에 인자들을 추가하라는 이야기 이다.코드는 엄청 간결하지만, 많은 일을 하고 있다.하지만 문법이 조금 난해하다. 더보기
Scala - Java 의 interface 의 가려운 부분을 긁어주는 trait 오늘은 뭐에 feel 받았는지, 스칼라 공부를 하면서 글을 쓰고 싶은 날이다. 벌써 스칼라 관련 글을 3개 연속으로 썼다... :) 스칼라 언어에는 Java언어의 interface에 해당하는 trait이라는 녀석이 있다.이 녀석은 Programming in Scala 2nd Edition 에서는 아래와 같이 소개가 되어있다. Traits are a fundamental unit of code reuse in Scala. A trait encapsulates method and field definitions, which can then be reused by mixing them into classes. Unlike class inheritance, in which each class must inher.. 더보기
Scala - apply 함수는 무슨 일을 하는 것일까? Scala 언어에서 각종 라이브러리마다 공통되는 함수가 존재하는데, apply 라는 녀석이다. apply 라는 녀석은 말 그대로 어떤 함수를 적용 시킨다는 의미인데, 자세히 이야기 하면, apply 와 함께 들어오는 인자에 대해서 어떤 함수를 적용 시킨다는 뜻이다. 가령 예를 들어서 아래와 같은 코드가 있다고 하자. f1 은 x 와 y 두 정수를 받아서 합쳐서 그 값을 돌려주는 함수이다. f1.apply(2,3) 을 하게 되면 이 f1 이라고 정의된 함수에 2,3 이라는 인자를 적용해서 함수의 역할을 하라는 뜻이다.여기서 신기한 것이 우리는 자연스럽게 f1(2,3) 이라고 호출하고 싶다. 왜냐하면, f1.apply(2,3) 은 좀 자연스럽지 않기 때문이다.여기서 f1 은 함수이지만 스칼라 언어에서 역시 .. 더보기
Scala - 함수를 정의 할 때 관례 (Convention) 스칼라 언어로 함수를 정의할 때 아래와 같이 두 가지 방법으로 정의할 수 있다. 결과를 확인하면, 똑같다... 하는 일도 똑같은데 왜 (...) 이 필요할까? 라는 의문을 제기할 수 있다.그래서 잘 찾아봤는데 문제의 해답은 coding convention 이라는 것이다. 스칼라 언어에서 인자가 없는 함수를 정의할 경우, 괄호(parentheses) 가 있고 없고의 차이는 side effect 가 있냐 없냐의 차이이다.side effect 라는 것은 standard out 을 출력 하거나 어떤 mutable 한 데이터의 값을 변경하는 경우를 의미한다. 그래서 side effect 가 있는 것은 (...) 를 사용하고 없는 것은 그냥 함수 이름만 사용하면 된다. 결론적으로 함수를 정의할 때 (...)의 사용.. 더보기
Scala - 함수를 사용할 때 (...) 과 {...} 의 차이 Scala 로 프로그래밍 하던 중에 궁금한 것이 생겼다. 함수를 사용할 때 (...) 과 {...} 둘 다 사용가능 한 것이었다.하지만 어떤 경우는 컴파일이 되지 않았다. 왜 그런 것일까? 이 둘의 차이는 뭘까? 라는 의문이 생겼다. 예를 들어 아래와 같은 코드는 같은 일을 한다. 그리고 컴파일 에러도 생기지 않는다. 하지만 아래와 같은 코드는 컴파일 에러를 발생 시킨다. 그래서 아래와 같이 {...} 를 사용하면 문제가 생기지 않고 잘 작동함을 알 수 있다. 아하!!! 바로 차이는 (...) 과 {...} 의 차이는 expression 이 한개인가 아니면 여러개 (block of codes) 인가의 차이이다.함수에 표현식을 여러개 넣고 싶다면 {...} 를 사용하고 한 개만 넣고 싶다면, (...) 를.. 더보기
Scala Days - 스칼라 모임 이번 년도 2013년 6월 10일 부터 12일까지 스칼라 데이즈가 미국의 뉴욕에서 열린다. 미국 뉴욕은 2009년에 다녀온 적이 있는데, 4년정도 지나니까 한 번 더 가고 싶은 생각이 든다. ㅎㅎ이번 Scala Days 에는 역시 메인 Speaker로 마틴 오더스키 (Martin Ordersky) 형님이 나오신다. 그 밖에 Jonas Boner, Viktor Klang 등이 나온다. Jonas Boner 는 마틴 오더스키가 이끄는 Typesafe 의 CTO 로써 오랫동은 Akka 오픈소스 프로젝트를 이끌어 왔다.아마도 이분은 여기서 또 Akka 와 Play framework 를 이용하여 웹 애플리케이션을 효율적으로 만드는 법을 알려주실 거 같다. Jonas Boner 의 홈페이지링크:http://jona.. 더보기
Set 간단 팁 Scala 에서 제공하는 API 에서 Set 이라는 녀석이 있다. doc 을 읽다가 여기서 흥미로운 녀석을 발견했다. 바로 diff 라는 녀석인데, 정말 편하고 직관적이다. API doc 을 보면 아래와 같이 설명이 나와있다. defdiff(that: GenSet[A]): Set[A]Computes the difference of this set and another set.thatthe set of elements to exclude.returnsa set containing those elements of this set that are not also contained in the given set that.Definition ClassesSetLike → GenSetLike 사용방법은 아래와 같이.. 더보기
Scala - Application (Scala 언어 응용프로그램) Scala 로 응용프로그램을 만들기위해서는 standalone singleton object 를 사용하여 main method 를 제공해야 한다. 이 main method 는 parameter 한개를 입력 받는데, Java 의 main 과 유사하다. main method 를 가지고 있는 모든 standalone object 는 응용프로그램을 실행 할 수 있다. 아래의 코드는 응용프로그램의 인자로 들어온 값들의 check sum 을 알려주는 프로그램이다. import ChecksumAccumulator.calculate object Summer { def main(args: Array[String]) { for (arg 더보기
Scala - Implement rational number (Scala 언어로 유리수 구현) 보통 Java 언어에서는 int type 의 변수와 유리수 type 의 변수를 계산하기 위해서는 lvalue 가 유리수 type 이 아니기 때문에, int type 의 변수를 유리수 type 의 wrapper 클래스를 이용하여, boxing 이라는 과정을 거치고 다시 오른쪽 변수인 유리수 type 의 변수를 인자를 갖는 method 를 호출하여 해결 한다. 예를 들어서, Java 언어로 구현된, 유리수 클래스가 있다고 하자. Rational.java public class Rational { public Rational add(Rational rvalue) { ... } ... // 내부 method 들 구현 생략 } int a = 10; Ratioan r = new Rational (1, 3) // 분.. 더보기