Scalaプログラミングの基礎【現役エンジニアがわかりやすく解説】

PROGRAM

Scalaプログラミングの基礎を知りたい方に。

この記事を読まれている方は、

  • Scalaのプログラミングがどんなものか知りたい
  • Scala言語の簡単な書き方が知りたい
  • Scalaが使われる場面を知りたい

おそらくこのように考えている方が多いと思います。

この記事を書いている私は、
プログラミング未経験から転職を果たした現役のWeb系エンジニアです。
エンジニア歴は3年ですが、本業とは別にフリーランスの副業で月10万円ほど、多いときで20万円ほどの収入があります。

この記事では、現役のエンジニアが、Scalaプログラミングの基礎を解説しています。

プログラミング言語のScalaの特徴

プログラミング言語のScalaの特徴

Scalaは静的型付けのコンパイル言語で、オブジェクト指向言語と関数型言語の特徴を統合したマルチパラダイムのプログラミング言語です。

静的型付けの言語とは、簡単に言うと、データを文字列型や数値型、論理型などに分ける必要がある言語のことです。
Scalaでは型推論というものがあるため、コンパイル後にははっきりと型が決まるものの、コーディング時ではvarを使ってあいまいな型にしておくことが可能です。

コンパイル言語とは、プログラムの実行前に、開発者の方でコンパイラーを使って構文チェックなどをしたうえで中間言語に変換しないと動作しない言語のことです。

一方、コンパイル言語と対をなすスクリプト言語とは、プログラム実行前にコンパイルをする必要のない言語のことで、書いた後はすぐにプログラムを実行することができる言語のことです。

一般に、コンパイル言語は、処理速度がスクリプト言語に比べて速くなります。速度が求められる処理では、コンパイル言語が使用されることが多いです。

オブジェクト指向型言語とは、オブジェクトという概念を持つ言語のことで、簡単に言うと、データ構造として、配列や構造体に加えて、オブジェクト(クラス)があるということです。
オブジェクトのおかげで、ソースコードのメンテナンスがしやすかったり、機能の流用ができます。

関数型言語とは、再帰的に呼び出すなどして、プログラム上で状態を変化させないように(再代入などをしないで)実行する手法を取るプログラミング言語のことです。

Scalaはオブジェクト指向、関数型のどちらにも対応します。

Scalaは、静的型付けのコンパイル言語のため、きちんと型定義を行う開発をしたいという場合や処理速度を上げたい場合にオススメの言語です。

また、Scalaは、JVM(Javaの仮想マシン)上で動作するため、Javaのライブラリを使うことも可能です。Javaを使っている人にも習得しやすい言語というメリットがある他、Javaがベースのため、プラットフォームに依存しないで動作させることができます。

統合開発環境(IDE)にはIntelliJ IDEAが使われることが多いようです。フレームワークも充実しており、実際の開発でもScalaが採用されることも多いです。たとえば、TwitterやビズリーチなどはScalaを使って開発されています。

また、Scalaエンジニアは単価が高いことでも知られていますので、将来的に習得する言語の目標にするのもありかと思います。

Scalaの用途

Scalaの用途

Scalaは静的型付けのコンパイル言語ということもあり、速度が重視される開発でも利用することが可能な言語です。

ScalaはJavaのVM(JVM)上で動作するため、あらゆるプラットフォームで動作させることが可能です。

また、Web系アプリケーションの開発もできるので、Javaに近いオールラウンド性があります。

コーディングはvarの型推論が使えるので、初心者の方にもハードルが高くないように思えます。しかし、動的型付けではないため、データの型をきちんと認識したうえでの開発が求められます。

Scalaの書き方

Scalaの書き方

ここでは簡単に書き方を少しだけ紹介します。実際に始める気になったら、ぜひ参考書などの教材を参考にして、試してみて下さい。

Hello World!を画面に出力する

まずはお決まりのHello World!という文字列を画面に出力する方法から。

object Main extends App{
    print("Hello World!")
}

これで出力することができます。ただし、オブジェクトの定義が必要です。(Javaではクラスでした。)

コンパイル言語のため、プログラム実行前には必ずコンパイラーを使って中間言語に変換する必要があります。

変数宣言と分岐処理

次は少し踏み込んで、変数宣言と分岐処理をしてみます。

object Main extends App{
    var age = 19
    if (age < 20) {
        print("未成年")
    } else {
        print("成人")
    }

}

上記の例では、まずageという数値型の変数を作り、その中に19という数値を入れています。
次にageが20未満であれば”未成年”という文字列を、それ以外であれば”成人”という文字列を出力するような分岐処理をしています。

配列と繰返処理

続いて、配列の使い方と繰返処理について、解説します。

ここでは配列を作って、以下のようにデータを出力することにしましょう。

佐藤,田中,小林

これを出力するコードは以下です。

object Main extends App{
    var students = Array("佐藤","田中","小林")
    
    for(i <- 0 to students.length-1){
        print(students(i))
        if (i<students.length-1) {print(",")}
    }
}

上記の例では、まず文字列型の配列studentsに「佐藤」「田中」「小林」の3つの文字列を格納しています。
その後、数値型のカウンタ変数iを0に初期セットし、配列studentsの要素の数に到達するまでループでiを1ずつ増やしてまわしていきます。その際に、print関数を使い、配列studentsのi番目の要素の値を出力し、最後の要素以外、その後に「,(カンマ)」を出力しています。

構造体の取り扱い

最後に構造体の取り扱い方法について解説します。

ここではエクセルのようなデータを作って、以下のようにデータを出力することにしましょう。

名前:佐藤,性別:男性
名前:田中,性別:女性
名前:小林,性別:女性

これを出力するコードは以下です。

object Main extends App{
    val first_row = Map("A" → "佐藤", "B" → "男性")
    val second_row = Map("A" → "田中", "B" → "女性")
    val third_row = Map("A" → "小林", "B" → "女性")
    var excel_data = Array(first_row,second_row,third_row)
    
    for(i <- 0 to excel_data.length-1){
        print(excel_data(i)("A"))
        print(",")
        println(excel_data(i)("B"))
    }
}

上記の例では、まずfirst_row, second_row, third_rowという、キー・値がともに文字列型の連想配列を3つ作り、Aというキー(列)に名前を、Bのキーに性別の値を入れていきます。
そして、それら全てをexcel_dataという連想配列型の配列に入れます。
その後、数値型のカウンタ変数iを0に初期セットし、配列excel_dataの要素の数に到達するまでループでiを1ずつ増やしてまわしていきます。その際に、print関数を使い、配列excel_dataのi番目の要素の中のA列とB列の値を出力しています。

まとめ:Scalaは自由度が高く、どこでも動く言語

まとめ:Scalaは自由度が高く、どこでも動く言語

Scalaの良さを簡単にまとめると、以下のとおりです。

  • コードが書きやすい ← 静的型付けだが型推論あり
  • どこでも動く ← JVM上のため、プラットフォームを選ばず
  • プログラミングの自由度が高い ← 関数型とオブジェクト指向に対応

つまりScalaは、型推論があり、関数型・オブジェクト指向型のいずれでもプログラミングができるため、書きやすいのと、JVM上で動作するためどこでもアプリを動かすことのできる言語です。

Scalaエンジニアの平均年収は高いため、これから始めようとする方にはオススメですが、初心者はまず動的型付け言語から入ら方が挫折なしに始められると思います。

もしScalaから始める場合、静的型付けの言語でオブジェクト指向型の言語なので、独学では少し難しいかもしれません。もし独学でできなさそうな方は、プログラミングスクールも手段の一つに入れると良いと思います。