Scala란?

JJStone·2022년 2월 16일
0

Scala 기초

목록 보기
1/5

개요

현재 다니는 회사는 java, scala 등등을 사용한다. java개발자로 입사하였고, scala는 하나도 몰랐다. 입사 1년차까지 java만 주구장창 쓰다가 문득 다른 사람이 짠 scala 코드를 보고 '이거 잘쓰면 자바보다 편할거같은데..?'라고 생각해 사용해보니 웬걸, 자바보다 스칼라가 훨씬 간결하고 코딩 속도도 증가하였다.

그래서 이 글을 쓰는 일자 기준으로 scala로 개발한지 4개월 정도가 지나 어느정도 익숙해져 Scala에 대해서 정리를 해보려고 한다.

Scala 패러다임

  1. Scala는 객체지향 + 함수형 프로그래밍 요소가 결합된 프로그래밍 언어이다. JVM 위에서 실행가능하며 이로 인해서 Java API를 사용할 수 있다.

  2. 사용한 경험을 기준으로 보아도, 어떤 문서를 보아도 자바로 프로그램을 짰을때하고 코드가 간결하다. 극단적인 예시로 본인이 짠 자바 코드 700줄 가량이 스칼라 코드 203줄로 줄었다.

  3. 타입추론으로 변수를 선언할 때나 함수 리턴 타입을 선언할때, 따로 타입을 선언할 필요가 없다.

    • 사용하다보니 개인적으로는 타입을 명시하는게 좋긴하다. 타입 추론만 믿고 리턴을 안해줬다가 Any로 값이 반환되어 어리둥절했던 경험이 있다.
  4. 대체적으로 함수형 프로그래밍 패러다임을 차용하고 있다.
    - 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"))
      }	

마치며

  • 스칼라에 대해서 간단하게 알아보았다. 다음장에서부터 변수 선언부터 정리해보자.
profile
java, scala 개발자 입니다.

0개의 댓글