맨위로가기

스칼라 (프로그래밍 언어)

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

스칼라(Scala)는 2001년 마틴 오더스키에 의해 설계된 객체 지향 및 함수형 프로그래밍 언어이다. 자바 플랫폼에서 실행되며 자바 코드와 상호 운용이 가능하며, 간결한 표현, 정적 타이핑, 타입 추론, 함수형 프로그래밍 지원 등의 특징을 갖는다. 스칼라는 JVM을 사용하는 다른 언어들과 비교되며, 특히 자바와의 유사성이 강조된다. 스칼라는 자바와 동일한 컴파일 모델을 가지며, 자바 라이브러리를 호출할 수 있고, 자바 가상 머신(JVM)에서 자바 코드와 구별되지 않는다. 주요 활용 사례로는 아파치 스파크, 아파치 카프카, 트위터, 테슬라 등이 있으며, 다양한 개발 도구와 프레임워크를 지원한다. 2021년에는 스칼라 3이 릴리스되어 새로운 기능들이 추가되었다.

더 읽어볼만한 페이지

  • 자바 프로그래밍 언어 계열 - 코틀린 (프로그래밍 언어)
    코틀린은 젯브레인즈에서 개발한 정적 타입 언어로, 자바 가상 머신에서 동작하며 자바와의 호환성을 갖고, 안드로이드 공식 지원 언어로 채택되어 다양한 분야에서 활용되고 있으며, 이름은 러시아의 코틀린 섬에서 유래되었다.
  • 자바 프로그래밍 언어 계열 - 아파치 그루비
    아파치 그루비는 자바 가상 머신에서 실행되는 동적 타이핑 프로그래밍 언어이며, 자바와 파이썬 등의 특징을 결합하여 웹 애플리케이션 개발 등 다양한 분야에서 활용된다.
  • 2003년 개발된 프로그래밍 언어 - 아파치 그루비
    아파치 그루비는 자바 가상 머신에서 실행되는 동적 타이핑 프로그래밍 언어이며, 자바와 파이썬 등의 특징을 결합하여 웹 애플리케이션 개발 등 다양한 분야에서 활용된다.
  • 2003년 개발된 프로그래밍 언어 - 스크래치 (프로그래밍 언어)
    스크래치는 MIT 미디어 연구소에서 개발한 어린이 및 입문자를 위한 시각적 프로그래밍 언어이며, 블록 기반 방식을 통해 애니메이션, 게임, 스토리 등을 만들 수 있도록 설계되었고, 코드 공유 및 재사용을 장려하며 다양한 교육 환경에서 활용된다.
  • 명령형 프로그래밍 언어 - 코틀린 (프로그래밍 언어)
    코틀린은 젯브레인즈에서 개발한 정적 타입 언어로, 자바 가상 머신에서 동작하며 자바와의 호환성을 갖고, 안드로이드 공식 지원 언어로 채택되어 다양한 분야에서 활용되고 있으며, 이름은 러시아의 코틀린 섬에서 유래되었다.
  • 명령형 프로그래밍 언어 - 자바 (프로그래밍 언어)
    자바는 제임스 고슬링 등에 의해 개발된 객체 지향 프로그래밍 언어로, 다양한 플랫폼에서 실행 가능하며 샌드박스 모델 기반의 보안 기능, 자동 메모리 관리, 멀티스레딩 등을 지원한다.
스칼라 (프로그래밍 언어) - [IT 관련 정보]에 관한 문서
기본 정보
스칼라 로고
스칼라 로고
이름스칼라
영어Scala
의미확장 가능한 언어 (scalable language)
로마자 표기Skalla
개발
설계자마틴 오더스키
개발자로잔 연방 공과대학교 프로그래밍 방법 연구소, 스칼라 센터
최초 공개2004년 1월 20일
안정화 버전 출시일}}
미리 보기 버전 출시일}}
특징
프로그래밍 패러다임멀티 패러다임: 병행 프로그래밍, 함수형 프로그래밍, 명령형 프로그래밍, 객체 지향 프로그래밍
자료형 체계추론적, 정적, 강한, 구조적
플랫폼자바 가상 머신(JVM), 자바스크립트(https://scala-js.org Scala.js), LLVM(http://scala-native.org Scala Native) (실험적)
영향 받은 언어커먼 리스프, 에펠, 얼랭, F#, 하스켈, 자바, OCaml, Oz, 피자, Scheme, 스몰토크, 스탠더드 ML
영향을 준 언어Ceylon, Chisel, Fantom, F#, C#, Kotlin, Lasso, Red, Flix
기타
파일 확장자.scala, .sc
라이선스아파치 2.0
웹사이트www.scala-lang.org

2. 역사

마틴 오더스키는 2001년 로잔 연방 공과대학교(EPFL)에서 Scala 설계를 시작했다. 이는 함수형 프로그래밍과 페트리넷의 아이디어를 결합한 프로그래밍 언어인 Funnel에 대한 연구를 따른 것이었다.[13] 오더스키는 이전에 제네릭 자바와 썬의 자바 컴파일러인 javac에 대해 연구했다.[13]

2003년 말 내부 릴리스 후, 2004년 초에 자바 플랫폼에서 공개적으로 출시되었고,[14][5][13][15] 2006년 3월에 두 번째 버전(v2.0)이 출시되었다.[5] 2004년 6월에는 .NET 플랫폼에도 공개되었으나, .NET 지원은 2012년에 중단되었다.

2011년 1월 17일, Scala 팀은 유럽 연구 위원회로부터 5년간 2300000EUR 이상의 연구 지원금을 받았다.[16] 2011년 5월 12일, 오더스키와 협력자들은 Scala에 대한 상업적 지원, 교육 및 서비스를 제공하기 위해 Typesafe Inc.(이후 Lightbend Inc.로 이름 변경)를 설립했다. Typesafe는 2011년에 Greylock Partners로부터 300만달러 투자를 유치했다.[17][18][19][20]

2021년 5월 12일, 코드네임 dotty로 불렸던 컴파일러를 획기적으로 재설계하여 만들어진 스칼라 3가 릴리스되었고, 많은 기능이 추가되었다.[184] 또한, 현재도 활발하게 개발이 진행되고 있다.

마틴 오더스키에 따르면, 스칼라 개발의 동기는 두 가지 가설에 기인한다.

# 범용 언어는 '''확장성'''이 뛰어나야 한다. 같은 개념으로, 작은 프로그램과 큰 프로그램을 모두 작성할 수 있어야 한다.

# 확장성함수형 프로그래밍객체 지향 프로그래밍의 두 가지 프로그래밍 개념을 통합하고 일반화함으로써 실현할 수 있다.

2. 1. 개발 배경

마틴 오더스키는 2001년 로잔 연방 공과대학교(EPFL)에서 Scala 설계를 시작했다. 이는 함수형 프로그래밍과 페트리넷의 아이디어를 결합한 프로그래밍 언어인 Funnel에 대한 연구를 따른 것이다.[13] 오더스키는 이전에 제네릭 자바와 썬의 자바 컴파일러인 javac에 대해 연구했다.[13]

2003년 말 내부 릴리스 후, Scala는 2004년 초에 자바 플랫폼에서 공개적으로 출시되었고,[14][5][13][15] 2006년 3월에 두 번째 버전(v2.0)이 출시되었다.[5]

2011년 1월 17일, Scala 팀은 유럽 연구 위원회로부터 5년간 230만 유로 이상의 연구 지원금을 받았다.[16] 2011년 5월 12일, 오더스키와 협력자들은 Scala에 대한 상업적 지원, 교육 및 서비스를 제공하기 위해 Typesafe Inc.(이후 Lightbend Inc.로 이름 변경)를 설립했다. Typesafe는 2011년에 Greylock Partners로부터 300만달러 투자를 유치했다.[17][18][19][20]

2. 2. 초기 릴리스 및 발전

Scala는 2001년 로잔 연방 공과대학교(EPFL)에서 마틴 오더스키에 의해 설계되었다.[13] 이는 함수형 프로그래밍과 페트리넷의 아이디어를 결합한 프로그래밍 언어인 Funnel에 대한 연구를 따른 것이다.[13] 오더스키는 이전에 제네릭 자바와 썬의 자바 컴파일러인 javac에 대해 연구했다.[13]

2003년 말 내부 릴리스 후, Scala는 2004년 초에 자바 플랫폼에서 공개적으로 출시되었고,[14][5][13][15] 2006년 3월에 두 번째 버전(v2.0)이 출시되었다.[5]

버전출시일기능
1.0.0-b2[51]2003년 12월 8일
1.1.0-b1[51]2004년 2월 19일
1.1.1[51]2004년 3월 23일
1.2.0[51]2004년 6월 9일
1.3.0[51]2004년 9월 16일
1.4.0[51]2005년 6월 20일
2.0[53]2006년 3월 12일
2.1.0[51]2006년 3월 17일
2.1.8[54]2006년 8월 23일
2.3.0[55]2006년 11월 23일
2.4.0[56]2007년 3월 9일
2.5.0[57]2007년 5월 2일
2.6.0[58]2007년 7월 27일
2.7.0[59]2008년 2월 7일


2. 3. Scala 팀 및 Typesafe Inc.(현 Lightbend Inc.) 설립

마틴 오더스키는 2001년 스위스 로잔에 있는 로잔 연방 공과대학교(EPFL)에서 Scala 설계를 시작했다. 이는 함수형 프로그래밍과 페트리넷의 아이디어를 결합한 프로그래밍 언어인 Funnel에 대한 연구를 따른 것이다.[13] 오더스키는 이전에 제네릭 자바와 썬의 자바 컴파일러인 javac에 대해 연구했다.[13]

2011년 5월 12일, 오더스키와 협력자들은 Scala에 대한 상업적 지원, 교육 및 서비스를 제공하기 위해 Typesafe Inc.(이후 Lightbend Inc.로 이름 변경)를 설립했다. Typesafe는 2011년에 Greylock Partners로부터 300만달러 투자를 유치했다.[17][18][19][20]

2. 4. Scala 3 출시

스칼라 3는 코드네임 dotty로 불렸던 컴파일러를 획기적으로 재설계하여 2021년 5월 12일에 출시되었으며, 많은 기능이 추가되었다.[184]

버전출시일기능
3.0.0[121]2021년 5월 13일
3.0.1[122]2021년 7월 31일
3.0.2[123]2021년 9월 7일
3.1.0[124]2021년 10월 21일
3.1.1[125]2022년 2월 1일
3.1.2[126]2022년 4월 12일
3.1.3[127]2022년 6월 21일
3.2.0[128]2022년 9월 5일
3.2.1[129]2022년 11월 7일
3.2.2[130]2023년 1월 30일
3.3.0[131]2023년 5월 30일
3.3.1[132]2023년 9월 7일
3.3.2[133]2024년 2월 29일
3.3.3[134]2024년 2월 29일
3.4.0[135]2024년 2월 29일
3.4.1[136]2024년 3월 29일
3.4.2[137]2024년 5월 16일


3. 특징

스칼라는 다음과 같은 다양한 특징을 가지고 있다.


  • 개발 생산성을 높이는 간결한 표기가 가능하다.
  • 자바의 풍부한 라이브러리를 사용할 수 있다. (Scala.js의 경우, 자바스크립트의 라이브러리를 사용할 수 있다).
  • 모든 것을 객체로 취급하는 객체 지향 언어이다.
  • 정적 타이핑을 수행하는 함수형 언어이다. 정적 타이핑이므로, 컴파일 시점에서의 오류(특히 타입 관련) 감지에 능하다.
  • 타입(클래스)을 자바 등과 비교하여 보다 쉽게 만들 수 있으며, 타입으로 조건 분기를 하는 등 타입 관련 기능이 풍부하여, 메서드나 필드를 묶는 클래스뿐만 아니라, 타입에 적극적인 의미를 부여하여 프로그래밍이 가능하다.
  • 타입 추론을 지원하며, 많은 상황에서 타입을 자동으로 보충해 준다.
  • 순수 함수형 언어적인 val(상수)과 불변 List, Set, Map의 조합으로도 프로그래밍할 수 있고, 보다 절차 지향적인 var(변수)와 가변 List, Set, Map의 조합으로도 프로그래밍할 수 있다.
  • 함수도 객체로 이용 가능하며, 커링이 가능하다.
  • 패턴 매칭을 이용 가능하며, 임의의 클래스를 그룹화하여 패턴 매칭으로 판정하는 것이 가능하다(case 클래스).
  • `implicit def`라는 선언을 사용하여 기존의 클래스를 확장한 듯한 기술이 가능하다.
  • trait 클래스를 사용한 Mix-in 기능을 갖는다.
  • 클로저를 지원한다.
  • XML을 직접 프로그램 내부에 기술 가능하다.
  • 지연 평가가 있는 함수형 언어이므로, 무한 리스트를 다룰 수 있으며, 표준 라이브러리에 그를 위한 클래스가 제공되어 있다.
  • 구문 분석을 위한 Parser combinator영어가 2.12까지 표준 라이브러리에 포함되어 있었다. 2.13 이후에는 외부 라이브러리가 되었다.
  • 파이썬과 유사한 들여쓰기 구문 지원
  • 대수적 데이터 형식의 새로운 표준을 만들기 위해 재설계된 열거형
  • Opaque Types. 박싱 오버헤드를 일으키지 않고 추상화할 수 있는 새로운 값 형식
  • 교차 타입과 합집합 타입. [A & B]나 [A | B]로 표현 가능
  • 암시적(Implicits) 구문 변경
  • 종속 함수 타입
  • 다형 함수 타입
  • 타입 람다
  • 매치 타입
  • 트레이트(trait)는 클래스처럼 인수를 받을 수 있게 됨
  • open classes 개념 도입
  • traits에 transparent를 마크하여 상속을 사용자에게 공개하지 않음
  • 상속보다 합성을 선호함. import와 대칭적으로 export 절은 객체의 특정 멤버에 접근하기 위한 별칭을 정의
  • 더 이상 NPE(NullPointerException) 없음
  • 메타 프로그래밍도 대폭 강화됨


스칼라 개발의 동기는 두 가지 가설에 기인한다.[14]

1. 범용 언어는 '''확장성'''이 뛰어나야 한다. 같은 개념으로, 작은 프로그램과 큰 프로그램을 모두 작성할 수 있어야 한다.

2. 확장성함수형 프로그래밍객체 지향 프로그래밍의 두 가지 프로그래밍 개념을 통합하고 일반화함으로써 실현할 수 있다.

스칼라는 자바와 비교했을 때 다음과 같은 몇 가지 개념적 차이점을 보인다.

  • 싱글톤 객체: 스칼라에는 정적 변수나 메서드가 없는 대신, 싱글톤 객체(singleton object)가 있다. 이는 인스턴스가 하나만 존재하는 클래스이며, `class` 대신 `object`를 사용하여 선언한다. 정적 변수와 메서드는 클래스 이름과 동일한 싱글톤 객체(동반 객체)에 배치하는 것이 일반적이다.[14]
  • 클래스 매개변수: 스칼라는 생성자 매개변수 대신 클래스 매개변수를 사용한다. 이는 함수 매개변수와 유사하게 클래스에 배치된다. `val` 또는 `var` 수정자로 선언된 경우, 필드는 동일한 이름으로 정의되고 클래스 매개변수에서 자동으로 초기화된다. 대체 생성자도 선언할 수 있으며, 기본 생성자에 들어갈 코드는 클래스 레벨에서 직접 작성한다.
  • 연산자 정의: 스칼라에서는 기호를 메서드 이름으로 사용하여 연산자를 정의할 수 있다. 예를 들어, `addPoint` 대신 `+=`를 정의하여 중위 표기법으로 호출할 수 있다.
  • 기본 가시성: 스칼라에서 기본 가시성은 `public`이다.


부분 함수는 정의역이 제한된 함수이다. 다음은 -1 이상 1 이하의 범위에서 제곱을 계산하는 부분 함수의 예시이다.

```scala

val myPartialSquare: PartialFunction[Double, Double] = {

case x if -1 <= x && x <= 1 => x * x

}

println(myPartialSquare(-0.5)) // 0.25

println(myPartialSquare(0.9)) // 0.81

println(myPartialSquare.isDefinedAt(1)) // true

println(myPartialSquare.isDefinedAt(-10)) // false

println(myPartialSquare(1.1)) // MatchError

3. 1. 자바와의 연관성

스칼라는 자바 플랫폼(자바 가상 머신)에서 실행되며 기존의 자바 프로그램과 호환된다.[14] 이러한 자바 호환성은 안드로이드 개발에도 적합하다.[21]

다음은 자바와 스칼라에서 클래스를 정의하는 것을 비교한 예시이다.

자바스칼라



스칼라는 JVM을 사용하는 그루비, 클로저와 비교되기도 한다. 스칼라는 정적 타입 언어인 반면, 그루비와 클로저는 동적 타입 언어이다.

3. 1. 1. 공통점

스칼라는 자바 및 C#과 동일한 컴파일 모델, 즉 개별 컴파일 및 동적 클래스 로딩을 가지고 있어 스칼라 코드가 자바 라이브러리를 호출할 수 있다. 스칼라의 작동 특성은 자바와 동일하며, 스칼라 컴파일러는 자바 컴파일러가 생성하는 바이트 코드와 거의 동일한 바이트 코드를 생성한다.[14] 자바 가상 머신(JVM)에서 스칼라 코드와 자바 코드는 구별할 수 없으며, 유일한 차이점은 `scala-library.jar`라는 하나의 추가 런타임 라이브러리이다.[29]

스칼라는 자바에 비해 많은 기능을 추가했으며, 표현식과 유형의 기본 모델에서 몇 가지 근본적인 차이점이 있다. 스칼라는 상당한 수준의 구문 유연성을 가지고 있는데, 몇 가지 예시는 다음과 같다.

  • 세미콜론은 필요하지 않다.
  • 모든 메서드는 중위 연산자로 사용할 수 있다.
  • 메서드 `apply` 및 `update`는 구문 단축 형태를 가지고 있다.
  • 스칼라는 괄호 없음(`def foo = 42`)과 빈 괄호(`def foo() = 42`) 메서드를 구분한다.
  • 콜론(`:`)으로 끝나는 메서드 이름은 인수를 왼쪽에, 리시버를 오른쪽에 위치시킨다.
  • 클래스 본문 변수는 별도의 getter 및 setter 메서드로 투명하게 구현될 수 있다.
  • 메서드 호출에서 괄호 대신 중괄호를 사용하는 것이 허용된다.
  • For-표현식은 `map`, `flatMap` 및 `filter`와 같은 모나드 메서드를 정의하는 모든 유형을 수용할 수 있다.


스칼라는 도메인 특화 언어를 정의할 수 있도록 하는 데 기여하며, Erlang의 액터에게 메시지를 보내는 특별한 구문(`actor ! message`)은 언어 확장이 필요 없이 스칼라 라이브러리에서 구현될 수 있다.

스칼라의 주요 특징은 다음과 같다.

  • 개발 생산성을 높이는 간결한 표기가 가능하다.
  • 자바(Java)의 풍부한 라이브러리를 사용할 수 있다.
  • 모든 것을 객체로 취급하는 객체 지향 언어이다.
  • 정적 타이핑을 수행하는 함수형 언어이다.
  • 타입 추론을 지원하며, 많은 상황에서 타입을 자동으로 보충해 준다.
  • 순수 함수형 언어적인 val(상수)과 불변 List, Set, Map의 조합으로도 프로그래밍할 수 있고, 보다 절차 지향적인 var(변수)와 가변 List, Set, Map의 조합으로도 프로그래밍할 수 있다.
  • 함수도 객체로 이용 가능하며, 커링이 가능하다.
  • 패턴 매칭을 이용 가능하며, 임의의 클래스를 그룹화하여 패턴 매칭으로 판정하는 것이 가능하다(case 클래스).
  • `implicit def`라는 선언을 사용하여 기존의 클래스를 확장한 듯한 기술이 가능하다.
  • trait 클래스를 사용한 Mix-in 기능을 갖는다.
  • 클로저를 지원한다.
  • XML을 직접 프로그램 내부에 기술 가능하다.
  • 지연 평가가 있는 함수형 언어이므로, 무한 리스트를 다룰 수 있으며, 표준 라이브러리에 그를 위한 클래스가 제공되어 있다.
  • 구문 분석을 위한 Parser combinator영어가 2.12까지 표준 라이브러리에 포함되어 있었다. 2.13 이후에는 외부 라이브러리가 되었다.

3. 1. 2. 차이점

스칼라는 자바와 비교했을 때 다음과 같은 몇 가지 개념적 차이점을 보인다.

  • 싱글톤 객체: 스칼라에는 정적 변수나 메서드가 없는 대신, 싱글톤 객체(singleton object)가 있다. 이는 인스턴스가 하나만 존재하는 클래스이며, `class` 대신 `object`를 사용하여 선언한다. 정적 변수와 메서드는 클래스 이름과 동일한 싱글톤 객체(동반 객체)에 배치하는 것이 일반적이다.[14]
  • 클래스 매개변수: 스칼라는 생성자 매개변수 대신 클래스 매개변수를 사용한다. 이는 함수 매개변수와 유사하게 클래스에 배치된다. `val` 또는 `var` 수정자로 선언된 경우, 필드는 동일한 이름으로 정의되고 클래스 매개변수에서 자동으로 초기화된다. 대체 생성자도 선언할 수 있으며, 기본 생성자에 들어갈 코드는 클래스 레벨에서 직접 작성한다.
  • 연산자 정의: 스칼라에서는 기호를 메서드 이름으로 사용하여 연산자를 정의할 수 있다. 예를 들어, `addPoint` 대신 `+=`를 정의하여 중위 표기법으로 호출할 수 있다.
  • 기본 가시성: 스칼라에서 기본 가시성은 `public`이다.
  • 컴파일 모델: 스칼라는 자바와 동일한 컴파일 모델(개별 컴파일 및 동적 클래스 로딩)을 가지므로, 스칼라 코드는 자바 라이브러리를 호출할 수 있다.


스칼라의 작동 특성은 자바와 동일하며, 스칼라 컴파일러는 자바 컴파일러가 생성하는 바이트 코드와 거의 동일한 바이트 코드를 생성한다.[14] 실제로 스칼라 코드는 특정 생성자 연산을 제외하고 읽을 수 있는 자바 코드로 디컴파일될 수 있다. 자바 가상 머신(JVM)에서 스칼라 코드와 자바 코드는 구별할 수 없으며, 유일한 차이점은 `scala-library.jar`라는 추가 런타임 라이브러리이다.[29]

스칼라는 정적 타입 언어인 반면, 그루비와 클로저는 동적 타입 언어이다. 정적 타이핑은 타입 시스템을 더 복잡하게 만들지만, 거의 모든[138] 타입 오류를 컴파일 시간에 감지하고 실행 속도를 빠르게 한다.

프로그래밍 패러다임 측면에서 스칼라는 객체 지향 및 함수형 프로그래밍 기능을 모두 지원하며, 개발자가 두 패러다임을 조합하여 사용할 수 있도록 한다.

또한, 스칼라는 다음과 같은 특징을 갖는다.

  • 간결한 표기로 개발 생산성을 높일 수 있다.
  • 자바(Java)의 풍부한 라이브러리를 사용할 수 있다. (Scala.js의 경우 자바스크립트 라이브러리 사용 가능)
  • 모든 것을 객체로 취급하는 객체 지향 언어이다.
  • 정적 타이핑을 수행하는 함수형 언어이다.
  • 타입 추론을 지원한다.
  • 순수 함수형 언어적인 방식과 절차 지향적인 방식 모두로 프로그래밍할 수 있다.
  • 함수도 객체로 이용 가능하며, 커링이 가능하다.
  • 패턴 매칭을 이용할 수 있다.
  • implicit def 선언을 사용하여 기존 클래스를 확장한 듯한 기술이 가능하다.
  • trait 클래스를 사용한 Mix-in 기능을 갖는다.
  • 클로저를 지원한다.
  • XML을 직접 프로그램 내부에 기술 가능하다.
  • 지연 평가를 지원한다.

3. 2. 객체 지향 프로그래밍

스칼라는 객체 지향 프로그래밍 개념을 지원하며, 몇 가지 특징적인 면에서 자바와 차이를 보인다.

다음은 자바와 스칼라에서 클래스를 정의하는 예시이다.

자바스칼라



위 코드는 자바와 스칼라의 클래스 처리 방식의 주요 차이점을 보여준다.


  • 싱글톤 객체: 스칼라는 정적 변수나 메서드 대신 ''싱글톤 객체''를 사용한다. 싱글톤 객체는 `object` 키워드로 선언되며, 클래스와 동일한 이름의 싱글톤 객체(동반 객체)에 정적 멤버를 배치하는 것이 일반적이다.[14]
  • 클래스 매개변수: 스칼라는 생성자 매개변수 대신 클래스 매개변수를 사용한다. `val` 또는 `var`로 선언된 클래스 매개변수는 자동으로 필드로 정의되고 초기화된다.
  • 연산자 정의: 스칼라에서는 기호를 메서드 이름으로 사용하여 연산자를 정의할 수 있다. (예: `+=`)
  • 기본 가시성: 스칼라에서 기본 가시성은 `public`이다.
  • for-표현식: 스칼라는 자바의 "foreach" 루프 대신 `for`-표현식을 사용하여 리스트 컴프리헨션과 유사한 기능을 제공한다. `yield` 키워드를 사용하면 새로운 컬렉션을 생성할 수 있으며, 컴파일러는 이를 `map`, `flatMap`, `filter` 호출로 변환한다.

예시:```scala

val s = for (x <- 1 to 25 if x*x > 50) yield 2*x

```

위 코드는 50보다 큰 제곱을 갖는 1부터 25까지의 수에 대해 2를 곱한 값을 요소로 하는 벡터를 생성한다.

```text

Vector(16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50)

```

`1 to 25` 표현식은 암시적 변환[31]을 통해 정수에 대한 확장 메서드로 정의된 `to` 메서드를 사용한다.
맵 반복 예시:```scala

val dem_mentions = for

(mention, times) <- mentions

account <- accounts.get(mention)

if account.party == "Democratic"

yield (account, times)

```

이 코드는 트윗에서 언급된 사용자와 횟수를 담은 맵(`mentions`)에서 민주당 정치인(`"Democratic"`)을 찾아 새로운 맵을 반환한다. 여기서 `(mention, times) <- mentions`는 패턴 매칭을 사용하여 튜플을 분해하는 예시이다.

스칼라는 이 외에도 모든 것을 객체로 취급하고, trait 클래스를 사용한 Mix-in 기능을 갖는 등 객체 지향 프로그래밍 특징을 가진다.

3. 3. 함수형 프로그래밍

스칼라는 일반적으로 함수형 프로그래밍 언어에서만 발견되는 많은 기능을 제공하며, 이를 통해 스칼라 프로그램은 거의 완전한 함수형 스타일로 작성될 수 있다. 또한 함수형 스타일과 객체 지향 스타일을 혼합하여 사용할 수도 있다.

스칼라의 함수형 프로그래밍 관련 주요 기능은 다음과 같다.

  • 문과 식의 구분이 없음
  • 타입 추론
  • 캡처 의미론을 가진 익명 함수 (즉, 클로저)
  • 불변 변수 및 객체
  • 지연 평가
  • 구분된 연속 (2.8부터)
  • 고차 함수
  • 중첩 함수
  • 커링
  • 패턴 매칭
  • 대수적 데이터 타입 (''case 클래스''를 통해)
  • 튜플


스칼라에서 함수는 객체이며, 익명 함수를 지정하기 위한 편리한 구문이 존재한다. 예를 들어, `x => x < 2`는 인수를 2보다 작은지 비교하는 함수를 지정하며, Lisp 형식 `(lambda (x) (< x 2))`와 동일하다. `x`의 타입이나 반환 타입은 명시적으로 지정할 필요 없이 타입 추론에 의해 추론될 수 있다.

익명 함수는 주변 함수 환경에서 사용 가능한 모든 변수를 자동으로 캡처하는 클로저처럼 동작한다. 이러한 변수는 주변 함수가 반환된 후에도 계속 사용 가능하며, 자바의 ''익명 내부 클래스''와 달리 final로 선언할 필요가 없다.

스칼라는 변경 가능 변수(`var`)와 변경 불가능 변수(`val`)를 구분한다. `val`로 선언된 변수는 재할당할 수 없으며, 얕은 불변성을 가진다. 스칼라 표준 라이브러리는 풍부한 변경 불가능한 컬렉션 클래스를 제공하며, 변경 가능 버전을 명시적으로 가져오지 않는 한 항상 변경 불가능 버전이 사용된다.[33] 변경 불가능 변형은 영구 자료 구조로, 기존 객체를 변경하는 대신 업데이트된 복사본을 반환한다.

함수형 프로그래밍 언어는 일반적으로 꼬리 호출 최적화를 제공하여 재귀를 스택 오버플로우 문제 없이 사용할 수 있도록 한다. 자바 바이트코드의 제약으로 JVM에서의 꼬리 호출 최적화가 복잡하지만, 트램펄린이 해결책으로 제안되었다.[35] Scala 2.8.0부터 `scala.util.control.TailCalls` 객체를 통해 트램펄린 지원이 제공되며, `@tailrec` 주석을 통해 꼬리 재귀 여부를 확인할 수 있다.[36]

팩토리얼을 꼬리 재귀와 클로저를 사용하여 최적화 한 예시는 다음과 같다.

```scala

def factorial(n: Int): Int =

@tailrec

def loop(current: Int, accum: Int): Int =

if n == 0 then accum

else loop(current - 1, n * accum)

loop(n, 1)

end factorial

```

이는 꼬리 호출 최적화를 보장하여 스택 오버플로우 오류를 방지한다.

패턴 매칭에서 `match` 연산자의 본문은 일련의 `case` 표현식으로 구성된 부분 함수이며, 첫 번째 일치하는 표현식이 우선 적용된다. 부분 함수는 `try` 문의 예외 처리 부분에서도 사용된다.

부분 함수는 단독으로 사용될 수 있으며, 호출 결과는 해당 함수에 대해 `match`를 수행하는 것과 동일하다.

스칼라의 부분 함수는 정의역이 제한된 함수에 해당한다. 다음은 -1 이상 1 이하의 범위에서 제곱을 계산하는 부분 함수의 예시이다.

```scala

val myPartialSquare: PartialFunction[Double, Double] = {

case x if -1 <= x && x <= 1 => x * x

}

println(myPartialSquare(-0.5))

println(myPartialSquare(0.9))

println(myPartialSquare.isDefinedAt(1))

println(myPartialSquare.isDefinedAt(-10))

println(myPartialSquare(1.1))

3. 4. 표현력이 풍부한 타입 시스템

스칼라는 CJava와 달리 Lisp처럼 표현식과 구문을 엄격하게 구분하지 않으며, 모든 구문은 어떤 값으로 평가되는 표현식으로 간주한다. 예를 들어, 스칼라에서 `if-then-else` 구문은 두 분기 중 하나의 평가 결과인 값을 생성하는 표현식이며, 이는 스칼라에서 삼항 연산자가 필요 없는 이유이기도 하다.[32]

```scala

// Scala:

val hexDigit = (if x >= 10 then x + 'A' - 10 else x + '0').toChar

```

위 코드는 Java의 삼항 연산자를 사용한 아래 코드와 동일한 기능을 수행한다.

```java

// Java:

char hexDigit = (char)(x >= 10 ? x + 'A' - 10 : x + '0');

```

스칼라에서는 `return` 구문이 불필요하며 권장되지 않는다. 코드 블록의 마지막 표현식이 해당 코드 블록의 값이 되며, 함수 본문인 경우 함수에 의해 반환된다.

모든 함수가 표현식임을 명확히 하기 위해, `Unit`을 반환하는 메서드조차도 등호(=)로 작성된다.

```scala

def printValue(x: String) = println("I ate a %s" format x)

```

타입 추론 덕분에 변수, 함수 반환 값 등 많은 식의 유형을 생략할 수 있는데, 컴파일러가 이를 추론할 수 있기 때문이다. 예를 들어, `val x = "foo"` (불변 상수) 또는 `var x = 1.5` (값을 변경할 수 있는 변수)와 같이 타입을 명시하지 않아도 된다. 그러나 함수 매개변수 및 재귀 함수의 반환 유형과 같이 특정 유형은 여전히 선언해야 한다.

```scala

def factorial(x: Int): Int =

if x == 0 then 1

else x * factorial(x - 1)

```

위 코드는 재귀 함수 `factorial`의 반환 타입을 `Int`로 명시한 예시이다.

스칼라의 타입 시스템은 자바와 달리 기본형과 참조형을 엄격하게 구분하지 않는다. 모든 타입은 최상위 클래스 `Any`에서 상속되며, `Any`의 직계 자식은 `AnyVal` (값 타입, `Int`, `Boolean` 등)과 `AnyRef` (참조 타입)이다. 이는 자바의 기본 타입과 박싱 타입(예: `int`와 `Integer`) 구분이 스칼라에는 없음을 의미하며, 박싱과 언박싱은 사용자에게 완전히 투명하게 처리된다.

3. 5. 구문적 유연성

스칼라는 자바에 비해 상당한 수준의 구문 유연성을 가지고 있다. 다음은 몇 가지 예시이다.

  • 세미콜론은 필수가 아니다. 토큰이 이 위치에 올 수 없는 토큰으로 시작하거나 끝나거나, 열리지 않은 괄호나 대괄호가 있는 경우 줄이 자동으로 연결된다.
  • 모든 메서드는 중위 연산자로 사용할 수 있다. 예를 들어, `"%d apples".format(num)`과 `"%d apples" format num`은 동일하다. 실제로, `+` 및 `<<`와 같은 산술 연산자는 다른 메서드와 마찬가지로 처리된다. 왜냐하면 함수 이름은 임의의 기호 시퀀스로 구성될 수 있기 때문이다(괄호, 대괄호 및 중괄호와 같이 특별히 처리해야 하는 몇 가지 예외 사항이 있음). 이러한 기호 이름의 메서드가 받는 유일한 특별 처리는 우선 순위 처리와 관련된다.
  • 메서드 `apply` 및 `update`는 구문 단축 형태를 가지고 있다. `foo()`(여기서 `foo`는 값(싱글톤 객체 또는 클래스 인스턴스)은 `foo.apply()`의 축약형이며, `foo() = 42`는 `foo.update(42)`의 축약형이다. 마찬가지로, `foo(42)`는 `foo.apply(42)`의 축약형이고, `foo(4) = 2`는 `foo.update(4, 2)`의 축약형이다. 이는 컬렉션 클래스에 사용되며 STM 셀과 같은 다른 많은 경우로 확장된다.
  • 스칼라는 괄호 없음(`def foo = 42`)과 빈 괄호(`def foo() = 42`) 메서드를 구분한다. 빈 괄호 메서드를 호출할 때, 괄호를 생략할 수 있는데, 이는 이러한 구분을 알지 못하는 자바 라이브러리를 호출할 때 유용하다. 예를 들어, `foo.toString()` 대신 `foo.toString`을 사용하는 것이다. 관례적으로, 메서드는 부수 효과를 수행할 때 빈 괄호로 정의해야 한다.
  • 콜론(`:`)으로 끝나는 메서드 이름은 인수를 왼쪽에, 리시버를 오른쪽에 위치시킨다. 예를 들어, `4 :: 2 :: Nil`은 `Nil.::(2).::(4)`와 동일하며, 첫 번째 형태는 결과(첫 번째 요소가 4이고 두 번째 요소가 2인 목록)에 시각적으로 해당한다.
  • 메서드 호출에서 괄호 대신 중괄호를 사용하는 것이 허용된다. 이를 통해 새로운 제어 구조를 순수하게 라이브러리로 구현할 수 있다.[30] 예를 들어, `breakable { ... if (...) break() ... }`는 `breakable`가 언어 정의 키워드처럼 보이지만, 실제로 thunk 인수를 취하는 메서드일 뿐이다. Thunk 또는 함수를 취하는 메서드는 종종 이를 두 번째 매개변수 목록에 배치하여 괄호와 중괄호 구문을 혼합할 수 있다. `Vector.fill(4) { math.random }`는 `Vector.fill(4)(math.random)`과 동일하다. 중괄호 변형을 사용하면 표현식이 여러 줄에 걸쳐 있을 수 있다.
  • For-표현식(자세한 설명은 아래에 있음)은 `map`, `flatMap` 및 `filter`와 같은 모나드 메서드를 정의하는 모든 유형을 수용할 수 있다.


이러한 기능을 통하여, 스칼라에서는 컴파일러를 확장할 필요 없이 도메인 특화 언어를 정의할 수 있다. 예를 들어, Erlang의 액터에게 메시지를 보내는 특별한 구문인 `actor ! message`는 언어 확장이 필요 없이 스칼라 라이브러리에서 구현될 수 있다.

4. 플랫폼

스칼라는 자바 플랫폼(자바 가상 머신)에서 실행되며 기존의 자바 프로그램과 호환된다.[14] 안드로이드 애플리케이션은 일반적으로 자바로 작성되어 자바 바이트코드가 달빅 바이트코드로 변환(설치 중에 네이티브 머신 코드로 추가 변환될 수 있음)되므로, 스칼라의 자바 호환성은 안드로이드 개발에 적합하다.[21]

https://www.scala-js.org/ ''Scala.js''자바스크립트로 컴파일하는 스칼라 컴파일러로, 웹 브라우저나 Node.js에서 실행할 수 있는 스칼라 프로그램을 작성할 수 있게 해준다.[23]

Scala Native는 가벼운 관리형 런타임을 사용하여 실행 가능한 코드를 생성하기 위해 LLVM 컴파일러 인프라를 대상으로 하는 스칼라 컴파일러이다.[25]

.NET Framework 및 해당 공용 언어 런타임을 대상으로 하는 참조 스칼라 컴파일러가 2004년 6월에 출시되었지만,[13] 2012년에 공식적으로 중단되었다.[27]

스칼라는 주로 자바 플랫폼(자바 가상 머신) 위에서 동작하며, 기존의 자바 프로그램과 쉽게 연동할 수 있다. 지원 플랫폼은 다음과 같다.

플랫폼설명
스칼라자바 플랫폼
Scala.js[181]스칼라에서 자바스크립트로 트랜스파일
Scala Native[182]LLVM을 사용하여 머신 네이티브 실행 파일 출력
과거에 지원했지만 현재는 개발이 중단된 플랫폼
.NET Framework[183]
Java Platform, Micro Edition CLDC


5. 활용 사례

스칼라는 퓨처와 프로미스, 액터 모델(Akka를 통해), 병렬 컬렉션 등을 지원하여 동시성 및 분산 프로그래밍에 강점을 보인다.[41][42][43][44][45][46] 또한, 소프트웨어 트랜잭션 메모리 및 이벤트 스트림을 사용한 비동기 프로그래밍도 지원한다.[46]

스칼라로 작성된 대표적인 오픈 소스 클러스터 컴퓨팅 솔루션으로는 아파치 스파크가 있으며, 게시-구독 메시지 큐아파치 카프카도 스칼라로 작성되어 스파크 및 기타 스트림 처리 기술에 널리 사용된다.[148]

스칼라 코드를 테스트하기 위한 다양한 방법이 존재한다. ScalaTest,[47] ScalaCheck,[48] specs2,[49] ScalaMock[50] 등이 있으며, JUnit 및 TestNG와 같은 자바 기반 테스트 프레임워크와도 통합될 수 있다.[47]

다음은 스칼라의 주요 활용 사례이다.

기업/기관활용 분야 및 내용
트위터2009년 백엔드의 상당 부분을 루비에서 스칼라로 전환[146]
테슬라가상 발전소 백엔드에 스칼라와 아카 사용[147]
아파치 카프카핵심 및 주요 부분 구현에 스칼라 사용[148]
길트스칼라와 플레이 프레임워크 사용[149]
포스퀘어스칼라와 리프트 사용[150]
코세라스칼라와 플레이 프레임워크 사용[151]
애플특정 팀에서 Java 및 Play 프레임워크와 함께 스칼라 사용[152][153]
가디언2011년 웹사이트를 Java에서 스칼라로 전환[154][155][156]
뉴욕 타임스내부 콘텐츠 관리 시스템 Blackbeard 구축에 Scala, 아카, Play 사용[157]
허핑턴 포스트콘텐츠 제공 시스템 Athena에 스칼라 사용[158]
UBS일반적인 생산 사용을 위해 스칼라 승인[159]
링크드인스칼라트라 마이크로프레임워크를 사용하여 Signal API 지원[160]
미트업실시간 API에 Unfiltered 툴킷 사용[161]
리멤버 더 밀크공개 API 및 실시간 업데이트에 Unfiltered 툴킷, 스칼라, 아카 사용[162]
버라이존"차세대 프레임워크" 구축에 스칼라 사용[163]
에어비앤비오픈 소스 머신 러닝 소프트웨어 "Aerosolve" 개발에 Java 및 Scala 사용[164]
잘란도기술 스택을 Java에서 Scala 및 Play로 이전[165]
사운드클라우드백엔드에 Finagle, Scalding, Spark 등과 함께 스칼라 사용[166] [167]
데이터브릭스아파치 스파크 빅 데이터 플랫폼에 스칼라 사용
모건 스탠리금융 및 자산 관련 프로젝트에 스칼라 광범위하게 사용[168]
구글/알파벳파이어베이스[169], Nest[170] 등 인수 기업을 중심으로 스칼라 사용
월마트 캐나다백엔드 플랫폼에 스칼라 사용[171]
듀오링고레슨 생성 백엔드 모듈에 스칼라 사용[172]
HMRC많은 영국 정부 세금 애플리케이션에 스칼라 사용[173]
M1 파이낸스백엔드 플랫폼에 스칼라 사용[174]
니코니코 생방송(정보 추가 필요)
스터디 서플리(정보 추가 필요)
마이크로소프트기계 학습 라이브러리 SynapseML 개발에 스칼라 사용[187]
레고[188]


6. 개발 도구

스칼라는 기본적으로 표현식이 사용 가능해지자마자 평가하는 엄격한(즉시) 평가 방식을 따른다. 그러나 `lazy` 키워드를 사용하여 변수를 선언하면, 해당 변수가 처음 참조될 때까지 평가를 지연(비엄격)시킬 수 있다. 다양한 유형의 비엄격 컬렉션이 존재하며(예: 비엄격 연결 리스트인 `Stream` 유형), `view` 메서드를 사용하면 모든 컬렉션을 비엄격하게 만들 수 있다. 비엄격 컬렉션은 서버에서 생성된 데이터와 같이 항목이 실제로 필요한 시점에만 생성되는 경우에 적합하다.[189]

스칼라 개발을 지원하는 도구로는 통합 개발 환경(IDE), 빌드 도구, 웹 애플리케이션 프레임워크 등이 있다. 자세한 내용은 각 하위 섹션을 참고하면 된다.

6. 1. [[통합 개발 환경]](IDE)

다음의 통합 개발 환경(IDE)이 스칼라를 지원한다. 괄호 안의 숫자는 2019 스칼라 개발자 설문 조사에서 복수 응답을 포함한 사용 비율이다.[189]

  • IntelliJ IDEA (88.6%)
  • Visual Studio Code + Metals (26.1%)
  • 이클립스 (2.7%)


스칼라를 기반으로 한 프로그래밍 환경으로 코조가 있다.

6. 2. 빌드 도구

아파치 메이븐이나 Gradle과 같은 자바 범용 빌드 도구도 사용할 수 있지만, 스칼라용 빌드 도구는 다음과 같다. 괄호 안의 숫자는 2019 스칼라 개발자 설문 조사에서 복수 응답을 포함한 사용 비율[189]이다.

빌드 도구사용 비율
sbt93.6%
Mill4.1%


6. 3. 웹 애플리케이션 프레임워크

스칼라용 주요 웹 애플리케이션 프레임워크는 다음과 같다.

  • Play Framework
  • Lift
  • Scalatra

7. 예제

스칼라는 모든 값이 객체인 순수한 객체 지향 프로그래밍 언어이다. 객체의 자료형과 동작은 클래스와 트레이트로 설명된다.

다음은 "문자열에 'a' 문자가 존재하는지 판별하는" 예시이다.

절차적 언어 스타일로 코드를 작성하면 다음과 같다.

```scala

def hasLowerCaseA(s: String): Boolean = {

for (i <- 0 until s.length) {

if (s(i) == 'a') return true

}

return false

}

```

위 코드는 인덱스를 사용하지 않고 다음과 같이 작성할 수 있다.

```scala

def hasLowerCaseA(s: String): Boolean = {

for (c <- s) {

if (c == 'a') return true

}

return false

}

```

위의 코드는 트레이트 `scala.collection.Traversable`을 사용하여 다음과 같이 작성할 수 있다.

```scala

def hasLowerCaseA(s: String) = s.exists(_ == 'a')

```

전형적인 함수형 언어에서는 재귀를 자주 사용한다. 재귀로 바꾸면 다음과 같다.

```scala

def hasLowerCaseA(s: String, i: Int = 0): Boolean = {

if (i == s.length) return false

if (s(i) == 'a') return true

return hasLowerCaseA(s, i + 1)

}

7. 1. Hello, world 프로그램

스칼라로 작성된 헬로 월드 프로그램은 다음과 같은 형태를 갖는다.

```scala

object HelloWorld {

def main(args: Array[String]): Unit = {

println("Hello, world!")

}

}

```

또는

```scala

object HelloWorld extends App {

println("Hello, world!")

}

```

스칼라 3 에서는 다음과 같은 형태를 갖는다.

```scala

@main def main() = println("Hello, World!")

```

자바의 독립 실행형 헬로 월드 애플리케이션과는 달리, 클래스 선언이 없으며, 정적으로 선언된 것도 없다.

프로그램이 `HelloWorld.scala` 파일에 저장되면, 사용자는 다음 명령으로 컴파일한다.

```bash

$ scalac HelloWorld.scala

```

그리고 다음 명령으로 실행한다.

```bash

$ scala HelloWorld

```

이는 자바 코드를 컴파일하고 실행하는 과정과 유사하다. 실제로 스칼라의 컴파일 및 실행 모델은 자바와 동일하여, 아파치 앤트와 같은 자바 빌드 도구와 호환된다.

더 짧은 버전의 "헬로 월드" 스칼라 프로그램은 다음과 같다.

```scala

println("Hello, World!")

```

스칼라는 대화형 셸과 스크립트 지원을 포함한다.[28] `HelloWorld2.scala`라는 파일에 저장된 이 파일은 다음 명령을 사용하여 스크립트로 실행할 수 있다.

```bash

$ scala HelloWorld2.scala

```

명령은 `-e` 옵션을 사용하여 스칼라 인터프리터에 직접 입력할 수도 있다.

```bash

$ scala -e 'println("Hello, World!")'

```

표현식은 REPL에서 대화식으로 입력할 수 있다.

```console

$ scala

Scala 2.12.2 버전에 오신 것을 환영합니다 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_131).

평가를 위해 표현식을 입력하십시오. 또는 :help를 시도하십시오.

scala> List(1, 2, 3).map(x => x * x)

res0: List[Int] = List(1, 4, 9)

scala>

7. 2. 퀵 정렬 프로그램

스칼라로 작성된 퀵 정렬 프로그램의 예시는 다음과 같다.

명령형 프로그래밍 방식으로 구현한 경우:



def qsort(arr: Array[Int]): Array[Int] = {

def swap(i: Int, j: Int): Unit = {

val tmp = arr(i)

arr(i) = arr(j)

arr(j) = tmp

}

def partition(left: Int, right: Int): Unit =

if (right <= left) ()

else {

val pivot = arr((left + right) / 2)

var i = left

var j = right

while (i <= j) {

while (arr(i) < pivot) i += 1

while (arr(j) > pivot) j -= 1

if (i <= j) {

swap(i, j)

i += 1

j -= 1

}

}

if (left < j) partition(left, j)

if (j < right) partition(i, right)

}

partition(0, arr.length - 1)

arr

}



if-else문을 사용한 경우:



def qsort(seq: Seq[Int]): Seq[Int] =

if (seq.isEmpty) seq

else {

val (pivot, rest) = (seq.head, seq.tail)

val (lt, ge) = rest partition { _ < pivot }

qsort(lt) ++ (pivot +: qsort(ge))

}



패턴 매칭을 활용한 경우:



def qsort(seq: Seq[Int]): Seq[Int] = seq match {

case pivot +: rest =>

val (lt, ge) = rest partition { _ < pivot }

qsort(lt) ++ (pivot +: qsort(ge))

case _ =>

seq

}



제네릭을 활용한 경우:



def qsort[T](seq: Seq[T], lessThan: (T, T) => Boolean): Seq[T] = seq match {

case pivot +: rest =>

val (lt, ge) = rest partition { lessThan(_, pivot) }

qsort(lt, lessThan) ++ (pivot +: qsort(ge, lessThan))

case _ =>

seq

}



뷰 바운드(View Bounds)를 활용한 경우:



def qsort[T <% Ordered[T]](seq: Seq[T]): Seq[T] = seq match {

case pivot +: rest =>

val (lt, ge) = rest partition { _ < pivot }

qsort(lt) ++ (pivot +: qsort(ge))

case _ =>

seq

}



컨텍스트 바운드(Context Bounds)를 활용한 경우:



def qsort[T: Ordering](seq: Seq[T]): Seq[T] = seq match {

case pivot +: rest =>

val (lt, ge) =

rest partition { implicitly[Ordering[T]].lt(_, pivot) }

qsort(lt) ++ (pivot +: qsort(ge))

case _ =>

seq

}



`Int` 타입에 `isEven` 및 `isOdd` 메서드를 추가하는 방법 예시:



object MyExtensions:

extension (i: Int)

def isEven = i % 2 == 0

def isOdd = !i.isEven

import MyExtensions.* // 암시적 확장을 스코프로 가져옴

4.isEven // -> true


참조

[1] 웹사이트 Notice file https://github.com/s[...] 2019-01-24
[2] 웹사이트 Scala Macros http://scalamacros.o[...]
[3] 웹사이트 MartinOdersky take(5) toList http://blog.fogus.me[...] 2010-08-06
[4] 웹사이트 The Scala Experiment - Can We Provide Better Language Support for Component Systems? https://lampwww.epfl[...] 2006-01-11
[5] 웹사이트 An Overview of the Scala Programming Language https://www.scala-la[...] École Polytechnique Fédérale de Lausanne (EPFL) 2006
[6] 서적 Programming in Scala https://books.google[...] Artima 2008
[7] 서적 Programming Scala: Scalability = Functional Programming + Objects https://books.google[...] O'Reilly Media, Inc. 2009-09-15
[8] 서적 SDL 2013: Model-Driven Dependability Engineering 2015-09-24
[9] 웹사이트 Frequently Asked Questions: Java Interoperability https://www.scala-la[...]
[10] AV media Martin Odersky: A Scala 3 Update https://www.youtube.[...] YouTube 2020-06-17
[11] 웹사이트 Effect expt https://docs.scala-l[...]
[12] 서적 Steps in Scala: An Introduction to Object-Functional Programming https://books.google[...] Cambridge University Press 2010
[13] 웹사이트 A Brief History of Scala https://www.artima.c[...] 2006-06-09
[14] 간행물 Unifying functional and object-oriented programming with Scala
[15] 문서 The Scala Language Specification Version 2.7
[16] 웹사이트 Scala Team Wins ERC Grant https://www.scala-la[...]
[17] 웹사이트 Commercial Support for Scala https://www.scala-la[...] 2011-05-12
[18] 웹사이트 Why We Invested in Typesafe: Modern Applications Demand Modern Tools https://medium.com/@[...] 2011-05-12
[19] 웹사이트 Open-source Scala gains commercial backing https://news.cnet.co[...] 2011-05-12
[20] 웹사이트 Cloud computing pioneer Martin Odersky takes wraps off his new company Typesafe https://www.mercuryn[...] 2011-05-12
[21] 웹사이트 Scala on Android https://scala-androi[...]
[22] 웹사이트 Scala 2.12.8 is now available! https://www.scala-la[...] 2018-12-04
[23] 웹사이트 Scala Js Is No Longer Experimental | The Scala Programming Language https://www.scala-la[...] Scala-lang.org 2015-02-05
[24] 웹사이트 Releases · scala-js/Scala-js https://github.com/s[...]
[25] 뉴스 Scaled-down Scala variant cuts ties to the JVM https://www.infoworl[...] 2017-03-15
[26] 뉴스 Scala language moves closer to bare metal https://www.infoworl[...] 2016-05-11
[27] Github Expunged the .net backend. by paulp · Pull Request #1718 · scala/scala · GitHub https://github.com/s[...] 2012-12-05
[28] 웹사이트 Getting Started with Scala https://www.scala-la[...] 2008-07-15
[29] 웹사이트 Home http://blog.lostlake[...] Blog.lostlake.org
[30] 문서 Scala-Virtualized https://dl.acm.org/c[...] 2012-07
[31] 웹사이트 Pimp my Library https://www.artima.c[...] Artima.com 2006-10-09
[32] 웹사이트 Expressions {{!}} Scala 2.13 https://scala-lang.o[...]
[33] 웹사이트 Mutable and Immutable Collections - Scala Documentation https://docs.scala-l[...]
[34] 웹사이트 Collections - Concrete Immutable Collection Classes - Scala Documentation https://docs.scala-l[...]
[35] 웹사이트 Rich Dougherty's blog http://blog.richdoug[...]
[36] 웹사이트 TailCalls - Scala Standard Library API (Scaladoc) 2.10.2 - scala.util.control.TailCalls https://www.scala-la[...] Scala-lang.org 2013-06-25
[37] 간행물 Reify your collection queries for modularity and speed! ACM 2013
[38] 웹사이트 What is highest priority for Scala to succeed in corporate world (Should be in scala-debate?) ? 2019-05-08
[39] 웹사이트 Should we "enrich" or "pimp" Scala libraries? 2016-04-15
[40] 문서
[41] Akka What is Akka? https://doc.akka.io/[...]
[42] 서적 Communicating Process Architectures 2008: WoTUG-31 http://users.comlab.[...] IOS Press 2008
[43] 웹사이트 Scala Tour http://www.scala-tou[...] 2015-07-04
[44] 웹사이트 Parallelcollections - Overview - Scala Documentation https://docs.scala-l[...] Docs.scala-lang.org 2013-06-25
[45] 웹사이트 Scala Tour http://www.scala-tou[...] 2015-07-04
[46] 서적 Learning Concurrent Programming in Scala https://www.amazon.c[...] Packt Publishing
[47] 웹사이트 A short Introduction to ScalaTest https://www.hascode.[...] 2014-11-07
[48] 웹사이트 ScalaCheck 1.5 https://www.scala-la[...] 2014-11-07
[49] 웹사이트 Build web applications using Scala and the Play Framework http://workwithplay.[...] 2014-11-07
[50] 웹사이트 ScalaMock 3.0 Preview Release https://paulbutcher.[...] 2014-11-07
[51] 웹사이트 Scala Change History https://www.scala-la[...]
[52] 웹사이트 Dropped: XML Literals https://dotty.epfl.c[...] 2021-03-05
[53] 웹사이트 Changes in Version 2.0 (12-Mar-2006) https://www.scala-la[...] 2014-11-07
[54] 웹사이트 Changes in Version 2.1.8 (23-Aug-2006) https://www.scala-la[...] 2014-11-07
[55] 웹사이트 Changes in Version 2.3.0 (23-Nov-2006) https://www.scala-la[...] 2014-11-07
[56] 웹사이트 Changes in Version 2.4.0 (09-Mar-2007) https://www.scala-la[...] 2014-11-07
[57] 웹사이트 Changes in Version 2.5 (02-May-2007) https://www.scala-la[...] 2014-11-07
[58] 웹사이트 Changes in Version 2.6 (27-Jul-2007) https://www.scala-la[...] 2014-11-07
[59] 웹사이트 Changes in Version 2.7.0 (07-Feb-2008) https://www.scala-la[...] 2014-11-07
[60] 웹사이트 Changes in Version 2.8.0 (14-Jul-2010) https://www.scala-la[...] 2014-11-07
[61] 웹사이트 Changes in Version 2.9.0 (12-May-2011) https://www.scala-la[...] 2014-11-07
[62] 웹사이트 Changes in Version 2.10.0 https://www.scala-la[...] 2014-11-07
[63] 웹사이트 Value Classes and Universal Traits https://docs.scala-l[...] 2014-11-07
[64] 웹사이트 SIP-13 - Implicit classes https://docs.scala-l[...] 2014-11-07
[65] 웹사이트 String Interpolation https://docs.scala-l[...] 2014-11-07
[66] 웹사이트 Futures and Promises https://docs.scala-l[...] 2014-11-07
[67] 웹사이트 SIP-17 - Type Dynamic https://docs.scala-l[...] 2014-11-07
[68] 웹사이트 SIP-18 - Modularizing Language Features https://docs.scala-l[...] 2014-11-07
[69] 웹사이트 Parallel Collections https://docs.scala-l[...] 2014-11-07
[70] 웹사이트 Reflection Overview https://docs.scala-l[...] 2014-11-07
[71] 웹사이트 Def Macros https://docs.scala-l[...] 2014-11-07
[72] 웹사이트 Scala 2.10.2 is now available! https://www.scala-la[...] 2013-06-06
[73] 웹사이트 Scala 2.10.3 is now available! https://www.scala-la[...] 2013-10-01
[74] 웹사이트 Scala 2.10.4 is now available! https://www.scala-la[...] 2015-01-07
[75] 웹사이트 Scala 2.10.5 is now available! https://www.scala-la[...] 2015-03-23
[76] 웹사이트 Scala 2.11.0 is now available! https://www.scala-la[...] 2014-11-07
[77] 웹사이트 Scala 2.11.1 is now available! https://www.scala-la[...] 2014-11-07
[78] 웹사이트 Scala 2.11.2 is now available! https://www.scala-la[...] 2014-11-07
[79] 웹사이트 Scala 2.11.4 is now available! https://www.scala-la[...] 2014-11-07
[80] 웹사이트 Scala 2.11.5 is now available! https://www.scala-la[...] 2015-01-22
[81] 웹사이트 Scala 2.11.6 is now available! https://www.scala-la[...] 2015-03-12
[82] 웹사이트 Scala 2.11.7 is now available! https://www.scala-la[...] 2015-07-03
[83] 웹사이트 Scala 2.11.8 is now available! https://www.scala-la[...] 2016-03-09
[84] 웹사이트 Three new releases and more GitHub goodness! https://www.scala-la[...] 2017-04-19
[85] 웹사이트 Security update: 2.12.4, 2.11.12, 2.10.7 (CVE-2017-15288) https://www.scala-la[...] 2018-05-04
[86] 웹사이트 Scala 2.12.0 is now available! https://www.scala-la[...] 2017-01-08
[87] 웹사이트 Scala 2.12.1 is now available! https://www.scala-la[...] 2017-01-08
[88] 웹사이트 Scala 2.12.3 is now available! https://www.scala-la[...] 2017-08-16
[89] 웹사이트 Scala 2.12.4 is now available! https://www.scala-la[...] 2017-10-26
[90] 웹사이트 Scala 2.12.5 is now available! https://www.scala-la[...] 2018-03-20
[91] 웹사이트 Scala 2.12.6 is now available! https://www.scala-la[...] 2018-05-04
[92] 웹사이트 Scala 2.12.7 is now available! https://www.scala-la[...] 2018-10-09
[93] 웹사이트 Scala 2.12.8 is now available! https://www.scala-la[...] 2018-12-09
[94] 웹사이트 Scala 2.12.9 is now available! https://www.scala-la[...] 2021-01-20
[95] 웹사이트 Scala 2.12.10 is now available! https://www.scala-la[...] 2021-01-20
[96] 웹사이트 Scala 2.12.11 is now available! https://www.scala-la[...] 2021-01-20
[97] 웹사이트 Scala 2.12.12 is now available! https://www.scala-la[...] 2021-01-20
[98] 웹사이트 Scala 2.12.13 is now available! https://www.scala-la[...] 2021-01-20
[99] 웹사이트 Scala 2.12.14 is now available! https://www.scala-la[...] 2022-04-15
[100] 웹사이트 Scala 2.12.15 is now available! https://www.scala-la[...] 2022-06-19
[101] 웹사이트 Scala 2.12.16 is now available! https://www.scala-la[...] 2022-06-19
[102] 웹사이트 Scala 2.12.17 is now available! https://www.scala-la[...] 2022-09-16
[103] 웹사이트 Scala 2.12.18 is now available! https://www.scala-la[...] 2023-06-07
[104] 웹사이트 Scala 2.12.19 is now available! https://www.scala-la[...] 2024-08-12
[105] 웹사이트 Scala 2.13.0 is now available! https://www.scala-la[...] 2018-06-17
[106] 웹사이트 Scala 2.13.1 is now available! https://www.scala-la[...] 2019-09-18
[107] 웹사이트 Scala 2.13.2 is now available! https://www.scala-la[...] 2020-04-22
[108] 웹사이트 Scala 2.13.3 is now available! https://www.scala-la[...] 2020-06-25
[109] 웹사이트 Scala 2.13.4 is now available! https://www.scala-la[...] 2020-11-19
[110] 웹사이트 Scala 2.13.5 is now available! https://www.scala-la[...] 2021-02-22
[111] 웹사이트 Scala 2.13.6 is now available! https://www.scala-la[...] 2021-05-17
[112] 웹사이트 Scala 2.13.7 is now available! https://www.scala-la[...] 2021-11-01
[113] 웹사이트 Scala 2.13.8 is now available! https://www.scala-la[...] 2022-01-12
[114] 웹사이트 Scala 2.13.9 is now available! https://www.scala-la[...] 2022-09-21
[115] 웹사이트 Scala 2.13.10 is now available! https://www.scala-la[...] 2022-10-13
[116] 웹사이트 Scala 2.13.11 is now available! https://www.scala-la[...] 2023-06-07
[117] 웹사이트 Scala 2.13.12 is now available! https://www.scala-la[...] 2023-09-11
[118] 웹사이트 Scala 2.13.13 is now available! https://www.scala-la[...] 2024-02-26
[119] 웹사이트 Scala 2.13.14 is now available! https://www.scala-la[...] 2024-05-01
[120] 웹사이트 Scala 2.13.15 is now available! https://www.scala-la[...] 2024-09-25
[121] 웹사이트 Scala 3 is here! https://www.scala-la[...] 2021-05-14
[122] 웹사이트 Scala 3.0.1 and 3.0.2-RC1 are here! https://www.scala-la[...] 2021-07-31
[123] 웹사이트 Scala 3.0.2 released! https://www.scala-la[...] 2021-09-07
[124] 웹사이트 Scala 3.1.0 released! https://www.scala-la[...] 2021-10-21
[125] 웹사이트 Scala 3.1.1 and forward compatibility news https://www.scala-la[...] 2022-02-01
[126] 웹사이트 Scala 3.1.2 released! https://www.scala-la[...] 2022-04-12
[127] 웹사이트 Scala 3.1.3 released! https://www.scala-la[...] 2022-06-21
[128] 웹사이트 Scala 3.2.0 released! https://www.scala-la[...] 2022-09-05
[129] 웹사이트 Scala 3.2.1 released! https://www.scala-la[...] 2022-11-07
[130] 웹사이트 Scala 3.2.2 is now available! https://www.scala-la[...] 2023-01-30
[131] 웹사이트 Scala 3.3.0 released! https://www.scala-la[...] 2023-05-30
[132] 웹사이트 Scala 3.3.1 LTS is now available! https://www.scala-la[...] 2023-09-07
[133] 웹사이트 Scala 3.3.2 https://github.com/s[...] 2024-02-29
[134] 웹사이트 Scala 3.4.0 and 3.3.3 LTS released! https://www.scala-la[...] 2024-02-29
[135] 웹사이트 Scala 3.4.0 and 3.3.3 LTS released! https://www.scala-la[...] 2024-02-29
[136] 웹사이트 Scala 3.4.1 is now available! https://www.scala-la[...] 2024-03-29
[137] 웹사이트 Scala 3.4.2 is now available! https://www.scala-la[...] 2024-05-16
[138] 웹사이트 Java and Scala's Type Systems are Unsound https://raw.githubus[...]
[139] 뉴스 ThoughtWorks Technology Radar FAQ https://martinfowler[...]
[140] 뉴스 ThoughtWorks Technology Radar MAY 2013 http://thoughtworks.[...]
[141] 뉴스 Scala, the good parts https://www.thoughtw[...]
[142] 뉴스 The State of Java in 2018 https://www.baeldung[...]
[143] 뉴스 Popularity of Programming Language Index https://pypl.github.[...]
[144] 뉴스 The RedMonk Programming Language Rankings: January 2021 https://redmonk.com/[...] 2021-03-01
[145] 뉴스 TIOBE Index for May 2021 https://www.tiobe.co[...]
[146] 웹사이트 The Secret Behind Twitter's Growth, How a new Web programming language is helping the company handle its increasing popularity https://www.technolo[...] MIT 2009-04-06
[147] 웹사이트 Tesla Virtual Power Plant (Architecture and Design) https://www.infoq.co[...] 2023-03-28
[148] 웹사이트 Apache Kafka source code at GitHub https://github.com/a[...] Apache Software Foundation 2023-03-29
[149] 웹사이트 Play Framework, Akka and Scala at Gilt Groupe https://www.lightben[...] Lightbend 2016-07-16
[150] 웹사이트 Scala, Lift, and the Future http://www.grenadesa[...] 2015-07-04
[151] 웹사이트 Why we love Scala at Coursera https://medium.com/c[...] Coursera Engineering 2023-09-21
[152] 웹사이트 Apple Engineering PM Jarrod Nettles on Twitter https://twitter.com/[...] Jarrod Nettles 2016-03-11
[153] 웹사이트 30 Scala job openings at Apple https://alvinalexand[...] Alvin Alexander 2016-03-11
[154] 뉴스 Are people ready to pay for online news? https://news.bbc.co.[...] BBC 2010-02-28
[155] 웹사이트 Guardian switching from Java to Scala http://www.h-online.[...] Heise Online 2011-04-05
[156] 웹사이트 Guardian.co.uk Switching from Java to Scala https://www.infoq.co[...] InfoQ.com 2011-04-05
[157] 뉴스 Building Blackbeard: A Syndication System Powered By Play, Scala and Akka https://open.blogs.n[...] 2014-07-20
[158] 뉴스 Sneak Peek: HuffPost Brings Real Time Collaboration to the Newsroom https://www.huffingt[...] 2014-07-20
[159] 뉴스 Interview with Scala's Martin Odersky https://drdobbs.com/[...] 2012-02-10
[160] 뉴스 LinkedIn Signal: A Case Study for Scala, JRuby and Voldemort https://www.infoq.co[...] InfoQ 2010-10-11
[161] 웹사이트 Real-life Meetups Deserve Real-time APIs https://making.meetu[...]
[162] 웹사이트 Real time updating comes to the Remember The Milk web app https://blog.remembe[...]
[163] 웹사이트 WHAT IS SCALA https://geniusadstec[...] 2023-03-17
[164] 웹사이트 Airbnb announces Aerosolve, an open-source machine learning software package https://venturebeat.[...] 2016-03-09
[165] 웹사이트 Zalando Tech: From Java to Scala in Less Than Three Months https://www.slidesha[...] 2016-03-09
[166] 웹사이트 Building Products at SoundCloud—Part III: Microservices in Scala and Finagle https://developers.s[...] 2016-03-09
[167] 웹사이트 Customer Case Studies: SoundCloud http://www.concurren[...] 2016-03-09
[168] AV media Scala at Morgan Stanley https://vimeo.com/14[...] Skills Matter 2016-03-11
[169] AV media SF Scala, Greg Soltis: High Performance Services in Scala https://www.youtube.[...] Skills Matter 2016-03-11
[170] 웹사이트 Scala jobs at Nest https://www.scala-la[...] 2016-03-11
[171] 웹사이트 Nurun Launches Redesigned Transactional Platform With Walmart Canada https://www.nurun.co[...] 2013-12-11
[172] 웹사이트 Rewriting Duolingo's engine in Scala https://making.duoli[...] 2017-02-03
[173] 웹사이트 HMRC GitHub repository https://github.com/h[...]
[174] 웹사이트 Meet M1 Finance, A ScalaCon Gold Sponsor http://www.scalacon.[...] 2023-09-02
[175] 웹사이트 The Rest of the Story https://codahale.com[...] 2013-11-07
[176] AV media "O'Reilly Software Architecture Conference 2015 Complete Video Compilation: Re-Architecting on the Fly - Raffi Krikorian - Part 3" https://techbus.safa[...] O'Reilly Media 2016-03-08
[177] 웹사이트 Is LinkedIn getting rid of Scala? https://www.quora.co[...] 2016-01-25
[178] 웹사이트 Chisel: Constructing Hardware in a Scala Embedded Language https://aspire.eecs.[...] 2020-05-27
[179] 문서 dotty/LICENSE at release-3.0.0 · lampepfl/dotty https://github.com/l[...]
[180] Youtube SF Scala: Martin Odersky, Scala -- the Simple Parts https://www.youtube.[...]
[181] 웹사이트 Scala.js https://www.scala-js[...]
[182] 문서 Scala Native — Scala Native documentation https://scala-native[...]
[183] 문서 A Brief History of Scala http://www.artima.co[...]
[184] 문서 'https://docs.scala-lang.org/ja/scala3/new-in-scala3.html' https://docs.scala-l[...]
[185] 문서 The Secret Behind Twitter's Growth http://www.technolog[...]
[186] 문서 Scala, Lift, and the Future http://grenadesandwi[...]
[187] 문서 Microsoft Announces General Availability of SynapseML https://www.reddit.c[...]
[188] 문서 Announcing Woof, a pure Scala 3 logging library https://medium.com/l[...]
[189] 문서 2019 Scala Developer Survey https://scalacenter.[...]
[190] 서적 Programming in Scala Artima Press
[191] 문서 The busy Java developer's guide to Scala http://www.ibm.com/d[...]
[192] 간행물 서광열의 프로그래밍 언어 이야기 마이크로소프트웨어 2008-05
[193] 서적 Programming in Scala Artima Press
[194] 문서 결론>정적 클래스 변수(메서드) vs. 싱글턴 패턴 http://kyungseo.pe.k[...]



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com