Scala
스칼라(Scala)는 객체 지향 프로그래밍 언어와 함수형 프로그래밍의 요소가 결합된 다중패러다임 프로그래밍 언어이다. 스칼라의 이름은 <skah-lah>라고 발음하며 'Scalable Language'에서 따왔다. 적은 양의 코드로도 방대한 규모의 시스템을 작성할 수 있다는 특징이 있다. 자바의 자바 가상 머신 에서 실행 할 수 있으며 자바의 API도 그대로, 혹은 스칼라의 형식에 맞춰 약간 수정한 형태로 사용 할 수 있다.
스칼라는 다른 언어로 표현할 수 있는 패턴을 매우 간결하게 표현할 수 있는 범용 프로그래밍 언어이다. 객체 지향 프로그래밍 언어와 함수형 프로그래밍의 요소의 결합과 자바 API의 적용을 통해 프로그래머의 생산성을 높이는데 도움을 준다. 그 예로 같은 기능을 하는 프로그램을 작성했을 때 자바로 작성했을 때에 비해 2-3배의 코드 길이가 줄어든다.
자바 런타임 환경(런타임 환경 (JRE))과의 상호 호환성이 좋으며, .NET을 위한 지원도 제공하고 있다.
Categories
- 기초
-
val
: (불가변) 값. (value) -
var
: (가변) 변수. (variable)
-
- 예를 들면,
def modN
(n: Int)(x: Int)
= ((x % n) == 0)
와 같이 파라미터 목록을 여러 개 정의하는 것.
-
@
사용,match
와case
사용.
for .. yield
- Sequence Comprehensions 라고도 부르는듯
-
class Baz[A] { ... }
와 같이 선언,val stack = new Stack[Int]
와 같이 사용.
- 제네릭에서
class Foo[+A]
,class Bar[-A]
,class Baz[A]
와 같이 사용.
[B <: A]
: B는 A의 하위 유형으로 제한됨. [B >: A]
: B가 A의 상위 유형으로 제한됨. - 암시적 파라미터 (Implict Parameters)
-
implicit val
intMonoid: Monoid[Int] = new Monoid[Int] { ... }
-
def sum[A](xs: List[A])(
implicit m
: Monoid[A]): A = ...
-
- 암시적 변환 (Implict Conversions)
-
implicit def
int2Integer(x: Int) = java.lang.Integer.valueOf(x)
-
- 중위 연산자:
+
,-
,*
,++
등 - 단항 연산자:
unary_
-
def calc(
i: => Int
) = i * 37
_
)의 활용에 대한 내용. public HashMap(Map<? extends K,? extends V> m);
에서 extends
에 해당하는 녀석은? package object json {
import DefaultJsonProtocol._
implicit def enrichJsonString(s: String) = new EnrichJsonString(s)
private[json] class EnrichJsonString(s: String) {
def rightJsValue: Either[AnswerError, JsValue] = Try(s.parseJson) ...
}
}
</syntaxhighlight>
More - Scala:Lazy
- Scala:String
- Scala:Option & Scala:Either
- Scala:Future
- Scala:Apply
-
Future { ... }
와 같이 하나 이상 Scalatra
의 값을 중괄호 ({
와 }
)로 둘러 싸서 호출하면 그 객체의 apply
메소드가 호출된다.
- Scala:Lazy
- Scala:String
- Scala:Option & Scala:Either
- Scala:Future
- Scala:Apply
-
Future { ... }
와 같이 하나 이상 Scalatra
-
Ruby로 만든 Sinatra 에 영감을 얻어 만든 web micro-framework 라고 소개하고 있습니다. 다른 full-framework 과는 달리 가볍고, 유연합니다. 개발자가 다른 형태의 라이브러리를 사용할 수 있도록 모듈화가 잘 되어있고, 기존 servlet container 표준을 잘 지킵니다. 특이한 것은 scalate 라는 템플릿 엔진을 이용하여, 다양한 포맷을 쓸 수 있습니다. (Scaml, SSP, Jade 등등) 이거 상당한 장점이라고 보는게, 여러가지 포맷 중 맘에 드는 거 사용하다가 중간에 바꿔도 되고, 여러명이 다른 포맷을 사용해도 됩니다. (이게 장점인지 단점인지 다를 수 있겠지만 저는 장점으로 보고 싶습니다.) 또한 Play Framework 2 에서 제공하는 Template 엔진을 spin off 하여 제작한 Twirl 도 지원합니다. spray.io 처럼 Akka 를 이용하여 비동기 통신을 지원하고, Atmosphere 를 이용한 비동기 통신도 지원합니다. REST-API 를 개발하고, 문서를 만드는 것도 Swagger 를 이용하면 아주 좋은 결과물을 만들 수 있습니다.
vararg
, _*
타입 어노테이션 Build tools
Classes
Akka gRPC Quickstart with Scala (gRPC, Scala, Akka)
Libraries
How to install
Hello, World!
아래와 같이 HelloWorld.scala
파일을 생성한다.
아래와 같이 컴파일 한 후 실행하면 된다.
Regex
val regex = """^([a-zA-Z]\d{6})""".r // enables you to drop escaping \'s
val f = List("b111111").filter { s => regex.findFirstIn(s).isDefined }
Elapsed Time
def elapsedTime[R](block: => R): (R, Long) = {
val start = System.currentTimeMillis
val result = block
val end = System.currentTimeMillis
(result, end-start)
}
Grave quotes
Using backticks, you can more or less give any name to a field identifier. In fact, you can even say
which defines a variable with name . (one character of whitespace)
Cake Pattern
JDK Compatibility
Frameworks
- Play Framework 2
- Play Framework는 Ruby on Rails 사상을 받아들여, 아주 쉽고, 빠르게 웹 Application 을 제작할 수 있게 해줍니다. 특히 java 로도 모두 구현이 가능하여, 많은 사용자를 확보하고 있습니다. play framework 2 부터는 scala 를 사용한 template 엔진을 사용하여 좀 더 빠르고, 다양한 기능을 제공합니다. 특히 sbt 를 이용하여 compile on changing 기능으로, 코드 변경 즉시 자동 반영되어, Web Application 을 제작하는데는 상당한 편의성을 제공합니다. 단 Rails 도 그렇지만, 모든 걸 다 지원해주는 것이 장점이 될 수 도 있지만, 개발자가 다른 버전의 라이브러리를 사용하고자 한다면, 문제가 될 수도 있고, 개인적으로 sbt 의 성능이 느리고, ivy2의 dependency 관리에 문제가 있어 보입니다.
- Spray
- Spray 는 REST 에 특화된 가볍고, 성능 좋은 Web Application 을 제작하기에 좋습니다. Akka 를 이용하여 고성능의 비동기 작업이 됩니다. Spray는 특수 목적 (REST-API) 를 전문적으로 제공할 때에는 성능 짱! 즉 적용 대상이 대규모 API 서버라면 강추합니다. 다만 Scala, Akka 도 공부해야 하지만, Spray 특유의 operator 도 공부해야 하는 부담이 있습니다. 그래도 정말 성능에 목마르다고 생각한다면, 추천합니다.
- Scalatra
- Ruby로 만든 Sinatra 에 영감을 얻어 만든 web micro-framework 라고 소개하고 있습니다. 다른 full-framework 과는 달리 가볍고, 유연합니다. 개발자가 다른 형태의 라이브러리를 사용할 수 있도록 모듈화가 잘 되어있고, 기존 servlet container 표준을 잘 지킵니다. 특이한 것은 scalate 라는 템플릿 엔진을 이용하여, 다양한 포맷을 쓸 수 있습니다. (Scaml, SSP, Jade 등등) 이거 상당한 장점이라고 보는게, 여러가지 포맷 중 맘에 드는 거 사용하다가 중간에 바꿔도 되고, 여러명이 다른 포맷을 사용해도 됩니다. (이게 장점인지 단점인지 다를 수 있겠지만 저는 장점으로 보고 싶습니다.) 또한 Play Framework 2 에서 제공하는 Template 엔진을 spin off 하여 제작한 Twirl 도 지원합니다. spray.io 처럼 Akka 를 이용하여 비동기 통신을 지원하고, Atmosphere 를 이용한 비동기 통신도 지원합니다. REST-API 를 개발하고, 문서를 만드는 것도 Swagger 를 이용하면 아주 좋은 결과물을 만들 수 있습니다.
- Skinny
- Scalatra 를 기반으로 full stack web framework 을 표방합니다. 당근 Ruby on Rails 의 영향을 받았구요. Full Stack이라 기능은 엄청 많네요. ORM 도 지원하고… 제가 선호하는 타입이 아니지만, Play Framework 을 대체해도 될 것 같습니다.
See also
Favorite site
Tutorials
- [추천] Tour of Scala - 들어가며
- [추천] 스칼라 학교!
- Effective Scala
- Github - 스칼라로 배우는 함수 프로그래밍 기초
- [BOOK] Functional Programming for Mortals
- 스칼라 문법 요약(Scala Cheatsheets)
- [추천] HAMA 블로그 - 스칼라 강좌 (1 ) - 소개