본문 바로가기

Programming/scala

[scala] 스칼라의 특징

    • 확장가능한 언어
      • 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가 나오게 된다