이번에 이직을 하게 되면서 스파크 코드가 python이 아닌 scala로 구성되어 있기 때문에 스칼라 언어를 배울 필요성을 느껴 스칼라언어에 대해 하나씩 배우면서 적용해 나갈 계획입니다. java와 닮은 점이 많은 언어 이기 때문에 java와 비교하며 같이 공부 해 나갈 계획이고 scala를 통해 spark프로그래밍도 적용 및 pyspark와 비교 해 볼 계획입니다.
1. Scala란?
- 2004년 마틴 오더스키(Martin Odersky)가 발표
- 일반적인 프로그래밍 패턴을 간결하고 우아하며 타입-세이프한 방식으로 표현할 수 있게 설계된 최신 멀티-패러다임 프로그래밍 언어
- 객체지향과 함수형 언어의 특징을 자연스럽게 통합한 언어(하이브리드 언어)
2. Scala 특징
1. 모든 값이 객체인 순수 객체지향 언어
- 숫자와 함수를 포함한 모든 것이 객체
//동일한 표현식
1 + 2 * 3 / x
//오직 함수 호출로만 이루어져 있음
1.+(2.*(3)./(x))
- 함수마저 객체
함수에 함수를 인자로 넘기거나, 함수를 변수에 저장하거나, 함수가 함수를 리턴하는 것도 가능
ex)
object Timer {
def oncePerSecond(callback: () => Unit): Unit = {
while (true) { callback(); Thread sleep 1000 }
}
def timeFlies(): Unit = {
println("time flies like an arrow...")
}
def main(args: Array[String]): Unit = {
oncePerSecond(timeFlies)
}
}
이 함수는 콜백 함수를 인자로 받는다. 인자로 받는 함수의 타입은 () => Unit 인데, 이 타입은 인자를 받지 않고 아무 것도 돌려주지 않는 모든 함수를 뜻한다 (Unit 타입은 C/C++에서 void와 비슷하다). 이 프로그램의 메인 함수는 이 타이머 함수를 화면에 문장을 출력하는 간단한 콜백함수를 인자로 호출한다. 결국 이 프로그램이 하는 일은 일초에 한번씩 “time flies like an arrow”를 화면에 출력하는 것이 된다.
- Java에서는 기본적인 타입(boolean이나 int 따위)과 참조 가능한 타입이 분리되어 있으며, 함수를 값과 동일하게 다룰 수도 없음
- 객체의 타입과 행위는 클래스와 트레잇으로 설명
- 클래스는 서브클래스를 만들거나, 다중 상속을 깔끔하게 대체하는 유연한 mix-in 기반 composition으로 확장 가능
2. 함수형 언어(프로그래밍)
- 스칼라는 함수형 언어의 특징을 가지기 때문에 자바에 비하여 코드길이가 짧음
- 겟터, 셋터, 생성자를 제거하고, 표현식을 간소화 하여 자바대비 짧은 코드로 동일한 내용을 작성
- 순수 함수와 보조 함수의 조합을 이용해서 로직 내에 존재하는 조건문과 반복문을 제거하여 복잡성을 없애고, 변수의 사용을 억제하여 상태 변경을 피하고자 하는 패러다임
(조건문과 반복문은 로직의 흐름을 이해하기 어렵게 하여 가독성을 해치고, 변수의 값은 누군가에 의해 언제든지 변경 될 수 있어 오류 발생의 근본적인 원인이 될 수 있기 때문)
1) 순수 함수(pure function)
- 함수의 실행이 외부에 영향을 끼치지 않는 함수
- 외부에 영향을 미치지 않기 때문에 스레드-세이프하고, 병렬 계산이 가능
public int add(int a, int b) {
return a + b
}
2) 익명 함수(anonymous function)
- 전통적인 명령형 언어는 함수에 이름이 있어야 함
- 함수형 언어는 선언부가 없는 익명 함수를 생성하여 코드 길이를 줄이고, 프로그래밍 로직에 집중할 수 있음
Arrays.asList(1,2,3).stream().reduce((a,b)-> a-b).get() //reduce 내 (a,b)
3) 고차 함수(higher-order function)
- 함수를 인수로 취하는 함수
- 함수를 입력 파라미터나 출력 값으로 처리할 수 있음
Collections.sort(new ArrayList<Integer>(), (x, y) -> x >= y ? -1 : 1)
3. JVML(Java Virtual Machine Language)
- 자바가상머신(JVM) 위에서 동작하는 언어로 scala, kotlin, Groovy가 대표적
- 자바 가상 머신 위에서 동작하기 때문에 자바의 모든 라이브러리를 사용할 수 있음
- 스칼라는 스칼라 컴파일러를 통해 스칼라 코드를 바이트 코드로 변환하고, 바이트 코드는 JVM 상에서 자바와 동일하게 실행
4. 바이트 코드 최적화
- 바이트 코드를 최적화 하여하여 자바 보다 20% 정도 속도가 빠름
- 같은 일을 하는 프로그램을 작성하여도 자바에 비해 코드도 짧고, 속도도 빠름
5. 동시성에 강함
스칼라는 변경 불가능한 Immutable 변수를 많이 가지고 있음 → 속성을 변경 불가능하게 하고, 순수 함수를 사용하여 병렬 프로그래밍 처리에 강함
3. Scala에 대한 통계
버전
컴파일 대상
유닛 테스트 프레임워크
주로 사용하는 프레임워크/라이브러리
IDE
빌드 시스템
대화형 scala 환경
scala용 도구
scala를 이용한 개발 종류
참조:
https://docs.scala-lang.org/ko/tutorials/scala-for-java-programmers.html#
https://docs.scala-lang.org/ko/tour/tour-of-scala.html
https://www.jetbrains.com/ko-kr/lp/devecosystem-2022/scala/
'language > Scala' 카테고리의 다른 글
[Scala] 스칼라 배우기 6. 스칼라 기본 문법5(collection,배열,리스트,튜플,맵) (2) | 2023.06.11 |
---|---|
[Scala] 스칼라 배우기 5. 스칼라 기본 문법4(trait, singleton object) (0) | 2023.06.11 |
[Scala] 스칼라 배우기 4. 스칼라 기본 문법3(클래스) (0) | 2023.05.23 |
[Scala] 스칼라 배우기 3. 스칼라 기본 문법2(함수) (0) | 2023.05.22 |
[Scala] 스칼라 배우기 2. 스칼라 기본 문법1(진입점, 객체, 자료형, 문자열, 변수) (0) | 2023.05.14 |
댓글