- 확장가능한 언어
- scalable이란 단어에서 scala가 유래되었듯, 확장 가능하다
- 대규모 프로그램에 잘 맞음
- 객체 지향 (object-oriented)
- class로 객체의 타입을 정의
- trait로 객체의 동작을 정의
- trait는 자바에서의 인터페이스와 비슷
- 다중 상속도 간접적으로 지원
- 서브클래싱과 믹싱 기반의 composition을 사용하면 가능
- 함수형
- 익명함수, 고차함수, 중첩함수 지원 및 허용
- 중첩함수
- 자바와 다르게 클래스 내부에서 함수를 정의할 수 있고, 해당 함수에 대한 외부 접근은 금지됨
- 불변방식+간결한 표현 → 동기화&동시성으로 쉽게 병렬처리 가능 => 이 때문에 스파크에 알맞음.
- 정적 타입 추적 지원
- 인터프리터 방식으로도 실행할 수 있지만, 스칼라는 기본적으로 컴파일언어.
- 컴파일 언어는 컴파일러가 정적으로 타입을 검사해서 명시적으로 지정해야했지만, 스칼라에서는 대부분 필요치 않음
- 알아서 타입을 찾아주는 방식
- JVM에서 동작
- 컴파일 결과가 자바와 마찬가지로 byte code.
- java to scala, scala to java가 쉬운 편
- 단, 스칼라 프로그램에서 자바코드를 실행하는 것은
매우 쉽지만 자바 프로그램에서 스칼라 코드를 실행하는 것은 매우 어려움
(스칼라만의 쉬운 구문 방식 때문) - javac로 컴파일했듯 scala에서는 scalac로 컴파일하면 된다
- 스칼라 환경에섣 바로 자바 sdk에서 사용 가능한 모든 클래스, 사전에 정의된 클래스, 프로젝트, 패키지까지 사용 가능
- 자바 프로그래머에게 익숙한 형태이기도 함
- REPL (Real Eval Print Loop)
- 인터프리터 언어처럼 대화형 셸로 실행할 수 있게 해주는 방식
- 한 문장마다 당연히 컴파일러가 평가하여 에러가 있다면 알려줌
자동으로 타입을 추적하다 보니 정수와 char의 이동도 자유롭다
"abc" map(x=>x+1)) "abc" map(x=>(x+1).toChar)
1번줄의 코드를 REPL에서 입력하면
res1: scala.collection.immutable.IndexedSeq[Int] = Vector(98, 99, 100)
라는 결과를 얻게 되는데, a와 b와 c의 ASCII 코드 값이 97, 98, 99라서 그에 1을 더하며 자동으로 int형으로 변환되는 결과가 나오는 것이다.
따라서 char 결과 ("bcd") 로 반환받기 위해서는 2번줄의 코드를 실행하면 된다.
그런데 여기서 눈치챌 수 있는 것이 있다. 바로 object뒤에 .으로 메소드를 실행하는 것과 같은 표현을 사용한다는 것인데,
그 느낌대로 (x+1)이 int형이고, int형의 object들은 toChar 메소드를 사용할 수 있어서 저런 표현이 가능한 것이 맞다.
이를 쉽게 확인할 수 있는 방법 또한 있다.
x = 1 x. x.toC
1번 줄을 실행해서 x를 int형으로 만들고
x.까지 입력한 뒤에 키보드의 tab버튼을 누르면 x가 사용 가능한 메소드들이 나열된다 ( = int형이 사용 가능한 메소드들 )
toChar를 빨리 찾기 위해서는
x.toC 까지 입력한 뒤에 키보드의 tab버튼을 누르면 좀 더 빨리 toChar가 나오게 된다
'Programming > scala' 카테고리의 다른 글
[Spark] DataFrame의 특정 Column을 List로 추출 (map 사용) (0) | 2020.04.19 |
---|