개요
현재 다니는 회사는 java
, scala
등등을 사용한다. java
개발자로 입사하였고, scala
는 하나도 몰랐다. 입사 1년차까지 java
만 주구장창 쓰다가 문득 다른 사람이 짠 scala
코드를 보고 '이거 잘쓰면 자바보다 편할거같은데..?'라고 생각해 사용해보니 웬걸, 자바보다 스칼라가 훨씬 간결하고 코딩 속도도 증가하였다.
그래서 이 글을 쓰는 일자 기준으로 scala로 개발한지 4개월 정도가 지나 어느정도 익숙해져 Scala에 대해서 정리를 해보려고 한다.
Scala 패러다임
Scala는 객체지향 + 함수형 프로그래밍 요소가 결합된 프로그래밍 언어이다. JVM 위에서 실행가능하며 이로 인해서 Java API를 사용할 수 있다.
사용한 경험을 기준으로 보아도, 어떤 문서를 보아도 자바로 프로그램을 짰을때하고 코드가 간결하다. 극단적인 예시로 본인이 짠 자바 코드 700줄 가량이 스칼라 코드 203줄로 줄었다.
타입추론으로 변수를 선언할 때나 함수 리턴 타입을 선언할때, 따로 타입을 선언할 필요가 없다.
대체적으로 함수형 프로그래밍 패러다임을 차용하고 있다.
- Scala에서 제공하는 List, Map등등과 함수의 파라미터는 기본적으로 immutable(불변)이다. 그래서 ThreadSafe 하다. (물론 mutable 패키지 안에 있는 List, Map을 사용하여 가변으로 만들거나 파라미터도 var 키워드를 사용해 가변으로 만들수 있다.)
모든 함수는 값. 다음과 같은 구문도 가능
List("a", 1, 'c', ()=>"익명함수")
익명함수 선언이 간편하다.
([var name]: [param type])=>[구현]
고차함수 지원 (map, foreach, filter)
// Scala
List(1,2,3).map(_+1)
// out) List(2,3,4)
// Java
new ArrayList<Integer>(){{add(1);add(2);add(3);}}.stream().map(x-> x+1).collect(Collectors.toList());
// out) [2,3,4]
함수의 중첩 지원
def func1(){
def fun2(){
}
}
커링 지원
object CurryTest extends App {
def filter(xs: List[Int], p: Int => Boolean): List[Int] =
if (xs.isEmpty) xs
else if (p(xs.head)) xs.head :: filter(xs.tail, p)
else filter(xs.tail, p)
def modN(n: Int)(x: Int) = ((x % n) == 0)
val nums = List(1, 2, 3, 4, 5, 6, 7, 8)
println(filter(nums, modN(2))) // 이때 modN(x : Int) = ((x % 2) == 0) 함수가 생성
println(filter(nums, modN(3))) // 이때 modN(x : Int) = ((x % 3) == 0) 함수가 생성
}
// 출처 : https://docs.scala-lang.org/ko/tour/multiple-parameter-lists.html
패턴 매칭 지원
object MatchTest2 extends App {
def matchTest(x: Any): Any = x match {
case 1 => "one"
case "two" => 2
case y: Int => "scala.Int"
}
println(matchTest("two"))
}
마치며