빅데이터/Scala / / 2023. 12. 26. 13:44

Scala 배경과 특징 그리고 자바

빅데이터 분석을 위해 배우기 위해 Scala와 spark를 배우는 여정을 담아보려 합니다.

스칼라는 2004년 마틴 오더스키가 자바의 복잡함을 극복하기 위해 만든 언어입니다.

Scala라는 명칭은 이탈리아어로 계단을 뜻하기도 합니다만 Scalable Language에서 유래되었습니다. 한국에서는 '스칼라(skah-lah)라고 읽지만 영어권에서는 '스케일러 (skay-lah)'라고 자주 부른다고 합니다,

스칼라는 간결한 코드로 자바의 대부분 기능을 구현할 수 있습니다.

이러한 스칼라는 범용 프로그램 언어로, 다른 언어로 표현가능한 패턴을 간결하게 표현할 수 있습니다.

객체지향과 함수형 프로그래밍을 결합하고 자바 API를 활용하여 개발자의 생산성을 높여주고 있습니다.

예를 들어 같은 프로그램을 자바로 작성했을 때 보다 스칼라로 작성하면 코드 길이가 2~3배 정도 줄일 수 있습니다,

자바 런타임 환경과 호환성이 좋고, NET를 위한 지원도 제공되고 있습니다. 트위터와 링크드인에서 적극적으로 사용되지만 주류 언어까지는 아니고 중요한 언어 중 하나로 간주되고 있습니다.

주요 특징

기본적으로 스칼라는 자바의 한계를 극복하고 언어 연구를 위한 플랫폼으로 디자인한 언어입니다.

자바와 비슷한 형태를 가지고 있지만 세부적으로 여러 방면에서 자바보다 발전된 형태를 가지고 있습니다.

 

쉬운 언어 확장과 DSL

언어의 유래가 Scalable Launguage의 약자로 이유 없이 스칼라라고 정해진 게 아닙니다.

쉬운 언어 확장을 하면서 언어(도메인 특화 언어, DSL)을 만들기 쉬워서입니다. 연산자 오버로딩, 암묵적 변환, 이름으로 평가 등 자바에서는 불가능했던 기능들을 제공하고 있습니다.

 

트레이드

클래스는 아닌데 상속을, 여러 번 할 수 있는 점에서 자바 인터페이스와 비슷할 수 있으나 실제 자바 인터페이스를 스칼라에서는 트레이드로 인식하고 있습니다. 트레이드 믹스인으로 활용해 클래스의 기능을 확장하고 AOP도 언어차원에서 지원을 합니다. 추가로 Getter Setter는 자동생성되고, 싱글톤을 쉽게 만들 수 있습니다.

 

짧은 소스

자바에서 긴 코드였던 부분들을 짧고 간판 하게 작성할 수 있도록 개선되었습니다.

  • 생성자 상속 : 클래스의 생성자, 슈퍼클래스 상속, 슈퍼클래스 생성자 호출이 클래스선언과 융합
  • 게터/세터 자동 생성 : 필드를 선언하면 자동으로 게터와 세터가 생성
  • 싱글톤 : 변수의 타입이나 함수의 반환값의 타입은 컴파일러가 추론
  • apply : C++ 연산자를 오버로드하는 개념으로 배열을 임의로 참조할 때 사용

 

패턴 매칭

스칼라의 'match' 구문은 자바의 'switch-case'와 비슷한 면이 있습니다. 그렇지만 일반적인 'switch'와 다르게 'fall-through'가 없다는 차이점이 있습니다. 일반적으로 match구문이 switch구문보다 더 복잡한 구현을 할 수 있는데 그 중심에는 'unapply' 메서드가 있습니다.

 

unapply 메서드는 이름 그대로 apply의 반대개념입니다. 

unapply 메서드를 활용하여 패턴 매칭을 하는 예시입니다.

val person = Person("Jeongzmin", 32)

person match {
  case Person(name, age) =>
    println(s"Name: $name, Age: $age")

  case _ => println("Match failed")
}

위 코드에서 Person 객체 person을 생성하고, match 구문을 사용하여 Person의 unapply 메서드를 통해 이름과 나이를 추출하여 활용할 수 있습니다. person이 Person 케이스 클래스의 인스턴스라면 name과 age 변수에 해당하는 값들이 할당되어 출력될 것입니다.

 

함수형 프로그래밍 언어

함수형 프로그래밍 언어에서 함수는 값으로 취급됩니다. 이것은 함수도 단순히 데이터 형식인 Int나 String과 동등하게 취급된다는 것을 의미합니다. 스칼라에서 모든 값이 객체이므로 함수도 객체입니다. 이로써 함수는 변수에 할당되거나, 다른 함수에게 전달되며 반환될 수 있습니다.

 

예를 들어 val increment = (i : Int) => i + 1과 같은 표현은 1이나 "안녕 세계!"와 마찬가지로 함수를 나타내는 리터럴입니다.

이는 Function1[Int, Int] 타입의 람다식(익명함수)으로 이해될 수 있습니다.

 

불변성 또한 중요한 특징으로 스칼라에서 변수 선언은 주로 'val'로 이루어집니다. val로 선언된 변수는 한번 값이 할당되면 변경이 불가능합니다.

 

예를 들어

val arr = Array(1, 2, 3, 4, 5)
arr = Array(1, 2, 3) //다른 객체를 가리키는 것은 금지

은 불가능한 하지만,

val arr = Array(1, 2, 3 ,4, 5)
arr(0) = 0 //가리키고 있는 객체의 상태가 바뀌는 것은 허용

은 가능합니다.

 

이러한 결점을 보완하기 위해 스칼라의 내장 컬렉션은 mutable(가변)과 imutable(불변)으로 나누어져 있습니다.

불변 컬렉션에서는 원소에 대한 재입력이 불가능합니다. 따라서 변경을 위해서는 변경된 새로운 컬렉션을 리턴하는 방식으로 사용해야 합니다.

 

위에서 예시인 Array는 가변 컬렉션이지만 기본적으로는 임포트 되는 스칼라의 고유 컬렉션들(List나 Vector 등)은 불변이 기본값입니다. 따라서 스칼라에서는 클래스 안에서도 되도록이면 var를 쓰지 않도록 권장하고 있습니다.

 

자바와의 상위 호환

스칼라에서는 별다른 절차 없이 자바 코드를 100% 가져다 쓸 수 있습니다. 원하는 자바 라이브러리가 있다면 sbt에서 불러오게 하면 됩니다. 하지만 자바에서는 스칼라 코드를 그대로 쓸 수 없습니다. 이유는 스칼라에서 정의한 연산자나 메서드 등을 자바에서는 스칼라에서 쓰던 식으로 사용할 수 없기 때문입니다.

 

자바와의 차이점

  • 타입추론 : 스칼라는 정적타이핑이지만 타입추론을 제공하기에 타입에 대해서 많은 정보를 명시하지 않아도 됨
  • 자료형 : 스칼라는 스몰토크나 루비와 자바 같은 모든 자료형을 객체로 취급
  • 싱글톤 객체 : 자바에서는 생성자를 private를 통해 선언하고 메서드를 static 선언을 통해 싱글턴 객체를 생성합니다.
                          이러한 점을 스칼라에서는 오브젝트라는 키워드를 통해 선언
                          내부 동작에는 크게 차이가 없으나 코드 표현에 있어서 간결성을 보임
  • 다중 상속 : 자바에서는 인터페이스를 내에 정의만 기능하고 구현은 상속받은 클래서 내에서 작성하지만,
                      스칼라에서는 트레이드를 통해 정의만 하는 것뿐만 아니라 실제 구현도 가능

 

추가 (+마틴 오더스키)

 

마틴 오더스키는 1958년 9월 5일 출생으로 독일일 컴퓨터 과학자이자 프로그래밍 방법 교수로서 코드 분석 및 프로그래밍 언어를 전문으로 다루는 사람입니다. 대표적으로 다른 사람들과 함께 Scala 프로그래밍 언어Generic Java를 설계하였습니다.

 

이상으로 위키문서들을 참조하여 스칼라에 대해 조금 알아보았습니다.

 

여담 정보

 

2023년도 통합개발환경 탑3 순위

2023년도 통합수익기술 탑8 순위

 

출처 https://survey.stackoverflow.co/2023/#top-paying-technologies-programming-scripting-and-markup-languages

 

'빅데이터 > Scala' 카테고리의 다른 글

Scala 빌드 도구 sbt  (0) 2023.12.28
Scala 3 News  (0) 2023.12.26
Scala with vscode, Hello Scala!  (0) 2023.12.26
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유