- 객체지향 프로그래밍 언어 + 함수형 프로그래밍 요소가 결합된 언어이다.
- 기존 Java 의 복잡성을 극복하기위해 개발된 언어이다.
때문에 간결한 소스코드를 사용하여 Java에서 구현할 수 있는 기능을 구현 할 수 있다.
-JVM 언어로, 기존의 JAVA 라이브러리를 그대로 사용할 수 있다.
(서버 애플리케이션이나 자바와 비슷한 다른 프로그램을 쓰는 모든 사람들에게 추천)
Why Scala?
1. 의도하지않은 이슈들로부터 애플리케이션을 안정화시킬 수 있다.
변하지않는 데이터 구조, 영향받지않는 환경의 문법들로부터 코드가 더 안전해지고, 견고해지며 더 이해하기 쉬워진다.
2. 코드가 더 간결해지고 표현력있어 질 것.
파이썬이나 자바스크립트같은 언어를 써 왔다면,
이미 짧고 간결한 문법에 익숙하고 한 줄에 맵, 필터, 리듀스같은 오퍼레이션을 쓰는데 익숙할 것이다.
하지만 스칼라를 사용함으로써 좀 더 복잡해지는 대신, 안정성과 퍼포먼스를 높일 수 있을 것이다.
자바, C 같은 정적인 언어에 더 친숙하다면, 다른 컴파일언어에서 볼 수 없는 명시적인 타입, 코드를 제거할 수 있을 것이다.
기본 구조 및 HelloWorld
object HelloWorld {
def main(args: Array[String]) {
println("Hello, world!")
}
}
-Scala의 main 함수는 static이 아니다. 정적 멤버 개념이 존재하지 않는다. (함수, 필드 모두)
- 주석은 자바와 같다.
// 한 줄 주석
/* 여러 줄 주석 */
자료형
Byte 8 bit . Range from -128 to 127
Short 16 bit . Range -32768 to 32767
Int 32 bit . Range -2147483648 to 2147483647
Long 64 bit
Float 32 bit IEEE 754 single-precision float
Double 64 bit IEEE 754 double-precision float
Char 16 bit unsigned Unicode character
String A sequence of Chars
Boolean Either the literal true or the literal false
Unit Corresponds to no value
Null ull or empty reference
Nothing The subtype of every other type;
Any The supertype of any type;
AnyRef The supertype of any reference type
자바에서의 자료형은
기본 자료형(int, short, long, float, double, byte, char, boolean) 과
참조 자료형(기본 자료형의 조합으로 생성한 클래스)으로 나뉜다.
이는 성능에는 도움이 될 지 몰라도 기본 자료형과 참조 자료형 간의 변환 문제로 언어의 표현이 복잡해지는 경향이 있다.
이에 반해 스칼라에서는 스몰토크나 루비와 같이 모든 자료형을 객체로 취급하고 있다.
그 예로 3 + 4 와 같은 수식은
정수 3의 메소드 +를 4라는 정수 인자값으로 호출한다고 표현하여 (3).+(4) 와 같이 표현할 수 있다.
스칼라의 모든 객체는 scala 패키지의 Any를 최상위 클래스로 값(AnyVal)과 레퍼런스(AnyRef)를 모두 아우르고 있다.
ex.
Quick Sort 프로그램
def qsort(arr: Array[Int]): Array[Int] = {
def swap(i: Int, j: Int): Unit = {
val tmp = arr(i)
arr(i) = arr(j)
arr(j) = tmp
}
def partition(left: Int, right: Int): Unit =
if (right <= left ) ()
else {
val pivot = arr((left + right) / 2)
var i = left
var j = right
while (i <= j) {
while (arr(i) < pivot) i += 1
while (arr(j) > pivot) j -= 1
if (i <= j) {
swap(i, j)
i += 1
j -= 1
}
}
if (left < j) partition(left, j)
if (j < right) partition(i, right)
}
partition(0, arr.length - 1)
arr
}