프로그래머스의 강좌 중 무료 강좌인 "30분 Scala" 강의를 정리하였습니다.
Scala의 기본 구조
object LearnScala {
def main(args: Array[String]): Unit = {
println("Hello, world!")
}
}
Scala 변수와 계산
Scala에서는 Primitive Type(Literal)은 Object로 취급하며 연산자는 Object의 Method가 된다. 1 + 2라는 연산식에서 피연산자 1은 Int Type Literal로 Object이며 + 연산자가 Object 1의 Method가 되고, 피연산자 2는 Factor가 된다. 피연산자를 객체로 보며, 연산자를 Object의 Method로 본다. 뒤의 연산자는 Factor이다. 복잡한 연산은 다중 중첩 Method로 구성되어 있으며 수학적 원리로는 Composite Function(합성 함수)과 같다.
object LearnScala {
def main(args: Array[String]): Unit = {
println( 1 + 2 )
println( (1).+(2) )
}
}
1 + 2는 곧 Object 1의 Method +를 호출하고 Factor로 2를 넘긴 것과 같다. 즉 (1).+(2)로 표기하여도 된다.
Scala에서는 연산자 표기방식(Operator notation) 또는 Infix 표기방식을 사용한다.
Scala의 Primitive Type은 Object로 취급되지만, Compile 이후에는 성능을 위해 Java의 Primitive Type을 이용한다.
변수와 상수
변수는 var, 상수는 val 명령어로 선언한다.
object LearnScala {
def main(args: Array[String]): Unit = {
var x = 1 + 2
x = 3 * 4
println( x )
val y = 1 + 2
// y = 3 * 4 상수에는 값을 대입할 수 없다
println( y )
var a, b, c = 5
println( a )
println( b )
println( c )
}
}
> 12
> 3
> 5
> 5
> 5
출력
printf와 println을 사용하여 출력한다.
object LearnScala {
def main(args: Array[String]): Unit = {
var x = 10
var y = 1
// ① println
println("① " + x + " is bigger than " + y)
// ② 문자열 앞에 s를 쓰면 $를 쓰고 변수이름을 바로 쓸 수 있습니다.
println(s"② $x is bigger than $y")
// ③ 수식을 입력하고 싶으면 ${ }사이에 식을 넣으면 됩니다.
println(s"③ $x + $y = ${ x + y }")
// ④ printf도 사용 가능합니다.
//java.lang.*은 자동으로 import됩니다.
//java.lang.Math도 포함입니다.
printf("④ Pi is %f",Math.PI)
}
}
Range와 List
to를 사용하여 range를 생성한다. a to b일 경우 a 이상 b 이하의 수를 포함하는 range가 생성된다.
val range1 = 1 to 10
range1 : {1, 2, 3, ... , 9, 10}
until을 사용하여 range를 생성한다. a until b일 경우 a 이상 b 미만의 수를 포함하는 range가 생성된다.
val range2 = 1 until 10
range2 : {1, 2, 3, ... , 8, 9}
by를 사용하여 특정 개수만큼 건너 뛴 수의 range를 생성한다.
val range3 = 1 until 10 by 3
range3 : {1, 4, 7}
toList를 이용해 range를 List로 변환할 수 있다.
println(s"range1.toList →\n\t ${range1.toList}")
> range1.toList →
List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
filter를 이용해 특정 조건에 부합하는 것만 모은다.
val moreThan4 = range1.filter(_ > 4)
println(s"range1.filter(_ > 4) →\n\t $moreThan4")
> range1.filter(_ > 4) →
Vector(5, 6, 7, 8, 9, 10)
map을 이용해 각 아이템의 값을 변경한다.
val doubleIt = range1.map(_ * 2)
println(s"range1.map(_ * 2) →\n\t $doubleIt")
> range1.map(_ * 2) →
Vector(2, 4, 6, 8, 10, 12, 14, 16, 18, 20)
수학 Methods
abs는 Object의 절댓값을 반환한다.
val num = -5
val numAbs = num.abs // 5
max는 Object와 Factor 사이의 최댓값을 반환한다.
val maxNum = numAbs.max(7) // 5와 7 사이의 최댓값
min은 Object와 Factor 사이의 최솟값을 반환한다.
val minNum = numAbs.min(7) // 5와 7 사이의 최솟값
String Methods
reverse는 String Object를 뒤집어 반환한다.
val reverse = "Scala".reverse
println(s"① $reverse")
> alacS