Javaの後継言語「Scala」を使ってみよう

2018年4月18日(水)
広谷 嘉巳

Scala言語とは

本連載も、今回で最終回となります。前回まではJavaを使用したオブジェクト指向について解説してきましたが、今回はJavaの後継言語と言われる「Scala」について解説します。Scalaはオブジェクト指向と関数型プログラミングの両方を統合した言語と言われています。

関数型プログラミングとは、関数の組み合わせによってプログラムを構築する手法です。関数は入力値に対して出力値を計算して返却する数学に出てくる関数に近い考えです。

なお、ScalaはJavaプラットフォームで動作するため、ScalaからJavaのライブラリを利用できます。それでは、早速Scalaの基本構文を見ていきましょう。

変数

Scalaの基本構文、最初は変数です。変数は代入が何度でも可能な「var」と代入不可の「val」があります。varはJavaの変数と同様の使われ方をします。対してvalはJavaの定数と同一です。

変数の宣言は以下のようになります。

var 変数名 = 値
例) var count = 0
val 変数名 = 値
例) val count = 0

ちなみに、変数はJavaのように型を指定できます。

var 変数名:型 = 値
例) var count:Int = 0

明示的に型を指定しなくてもコンパイラが自動的に型を決定してくれます(型推論と呼ばれます)。

また、変数を初期化するには、初期値にアンダースコア「_」を書くと該当する型のデフォルト値が設定されます。

var count = _
(上記はvar count = 0と同一)

基本型(データ型)

Scalaの基本型(データ型)は、基本的にJavaのデータ型と同一です。以下に、ScalaとJavaのデータ型の比較表を示します。

Scala Java
Char char
Byte byte
Short short
Int int
Long long
Float float
Double double
Boolean boolean
String String

Javaと大文字・小文字の違いくらいなので、迷うことなく使用できると思います。

データ型をリテラル(ソースに値を直接書く書き方)として記述する方法は、以下のようになります。

●10進数
val count = 15
●8進数
val count = 015
●16進数
val count = 0x15
●Long
val count = 15L
※Longリテラルは末尾に「L」または「l」を付ける必要がある
●浮動小数点数リテラル
val average = 1.5
val average = 1.5e3
val average = 1.5f
※Floatリテラルは末尾に「F」または「f」を付ける必要がある。付けない場合はDoubleリテラルとなる(Doubleの場合は明示的に「D」または「d」を付けることもできる)。
●ブール(真偽値)リテラル
val b = false
●文字リテラル
val str = 'A'
●文字列リテラル
val str = "あいうえお"
●シンボルリテラル
val sym = ‘sym
※シンボルリテラルはシングルクォート「'」を先頭に付ける必要がある。シンボルリテラルはSymbolクラスのインスタンスで、上記例の場合はSymbol("sym")と同じ意味

コレクション(Array、Seq、Map)

Scalaのコレクションについて解説します。Arrayは順序を保持し、異なる型の値を保持できるJavaでいうところの配列です。

宣言例) val arr = Array(1, 2, 3)

SeqはArrayとほぼ同じようなコレクションですが、値を変更できません(Arrayは変更可)。

宣言例) val seq = Seq(1, 2, 3)

Mapはキーと値のセットからなるコレクションです。JavaのMapと対応します。

宣言例) val map= Map("key1" -> 1, "key2" -> 2, "key3" -> 3)

この他にもScalaにはSetやVectorなど様々なコレクションが用意されていますが、いずれもJavaと同じような使い方をするので、扱いやすいと思います。

演算子(メソッド)

演算子(メソッド)はJavaと同様に算術演算子、関係演算子、論理演算子を用意しています(Scalaでは数値(IntやLongなど)もクラス(オブジェクト)のため、数値の演算はクラスのメソッドとして定義されています。したがって演算子はメソッドとも言えます)。

●算術演算子

演算子(メソッド) 説明
+ 3 + 2 加算
- 3 - 2 減算
* 3 * 2 乗算
/ 3 / 2 除算
% 3 % 2 剰余

●関係演算子

演算子(メソッド) 説明
> 3 > 2 より大きい
>= 3 >= 2 以上
< 3 < 2 より小さい
<= 3 <= 2 以下
== 3 == 2 等しい
!= 3 != 2 等しくない

●論理演算子

演算子(メソッド) 説明
&& a && b 論理積
|| a || b 論理和
! !a 否定

メソッド

メソッドはJavaのメソッドに当たるものです。以下のような形式で定義します。

def メソッド名(パラメータ):返り値のデータ型 = {
  本体
}

例)
def sample(a:Int, b:Int):Int = {
  a + b
}

制御構文(繰り返し構文)

ScalaにはJavaと同様にfor、while、foreachなどの繰り返し構文が用意されています。

●for
for(i <- 1 to 5) {
  println(i)
}
●while
while(i < 5) {
  i += 1
  println( i)
}
●foreach
(1 to 5).foreach { println }

クラス

Scalaのクラス定義はJavaのクラス定義とほとんど変わりません。

class Sample {
}

インスタンス化もJavaと同様にnew演算子で行います。

val sample = new Sample

ここまでScalaの基本構文を見てきましたが、Java同様に継承があったり抽象クラスがあったりとまだまだ紹介しきれない機能がたくさんあります。しかし、Javaをマスターした方であれば基本的な文法は同じなので、すぐに習得できると思います。

GatlingでScalaを学ぼう

Scalaの基本構文を覚えると、コードがScalaで作られている「Gatling」という負荷テストツールのコードが書けるようになります。最終回の締めくくりとして、GatlingでScalaのコードを書いてみましょう。

Gatlingを実行するために、まずはGatlingの公式サイトよりGatlingをダウンロードしてインストールします。インストール方法はこちらのWebサイトなどを参照してください。「Gatling インストール」などで検索すると、たくさんの解説サイトがヒットします。

インストールができたらGatlingを起動し、Gatlingで実行するシナリオ(プログラム)をScalaで作成します。以下はそのサンプルですが、簡単に説明します。

class Sample extends Simulation {
  val httpProc = http
    .baseURL(“http://localhost/”)  // ①
    .acceptHeader("text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8") 
    .acceptLanguageHeader("ja,en-US;q=0.7,en;q=0.3")
    .acceptEncodingHeader("gzip, deflate")

  val scn = scenario("sample scenario").exec(http("request").get("/"))

  setUp(scn.inject(rampUsers(5) over(30 seconds)) .protocols(httpProc))  // ②
}

コードの①の箇所がアクセス先のURLです(サンプルでは“http://localhost/”としていますが、テストを行いたいURLに変えてください)。②の箇所でシナリオ(プログラム)を実行しています。rampUsers(5) over(30 seconds)は「5秒間に30 回アクセスせよ」という意味です。

ちなみに、constantUsersPerSec(20) during(60 seconds)とすれば1秒間で20ユーザのアクセスを60秒キープ、rampUsersPerSec(1) to (50) during (60 seconds)とすれば60秒間で1から50までユーザ増やしてのアクセスになります。

作成したサンプルファイルは(上記例の場合はSample.scalaがファイル名となる)Gatlingインストールディレクトリのuser-files配下に配置します。配置後、binディレクトリ配下にgatling.shがあるので実行します。シナリオ選択画面が表示されたら、作成したシナリオを選択します。

シナリオの実行後、グラフが表示されます。

ここで紹介したサンプルはアクセスを実行する最もシンプルなコードなので、Scalaの機能を使って色々と修正して試してみてください。

Gatlingのドキュメントはこちらに記載されています(英語)。Gatlingを利用しながら実践的にScalaを覚えるのも良いのではないでしょうか。

おわりに

本連載ではオブジェクト指向、クラス設計やデザインパターンをメインに解説してきました。これらの技術を覚える必要があると感じている新人や若手エンジニアの方に分かりやすく学んでもらうことを目的としてきましたが、いかがでしたか。

デザインパターンやオブジェクト指向設計原則など、まだまだ紹介しきれないたくさんのパターンや原則などがあります。これらの学習方法としては、書籍を読んだりサンプルを眺めるだけではなく、どんどん自分でも実際にサンプルを作って試すほうが近道かと思います。

最後になりますが、本連載がこれからオブジェクト指向を勉強しようと考えているエンジニアの方々の少しでもお役に立てれば幸いです。最後までお付き合いいただき、ありがとうございました!

株式会社ビーサンク
Javaを使ったシステム開発に従事し、オブジェクト指向での設計から開発を得意としている。以前はデザインパターンを取り入れたクラス設計やリファクタリングでのコードの体質改善という作業も行っていた。自分の力がまだまだと自覚しており、JavaやUMLの資格も積極的に取得している。
仕事の傍らスキー1級やスノボ、テニス、また、野菜ソムリエ取得やフランス料理学校に通うなど、仕事よりも趣味の方に重きを置いているのが玉に瑕。
http://bexank.co.jp/

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています