• ログインログイン
  • 新規登録新規登録

MENU

流行の技術に実際に触れてみよう 「Scala」と「PlayFramework」(2)

連載流行の技術に実際に触れてみよう 「Scala」と「PlayFramework」

ScalaとはJVM上で動作する関数型オブジェク指向言語です。簡潔な文法と実効速度に定評があり、国内でも徐々に浸透してきています。 流行の技術に実際に触れてみながら、動くものを作っていく開発レシピです。

前回までのプログラミング学習コラムに続き2回目の勉強内容です。

前回はScalaの開発環境構築方法について掲載させて頂きましたが、今回はScalaの入門の1回目の記事になります。今回はJavaと比較しながら、Scalaのオブジェクトを中心に特徴や機能を紹介させて頂きます。

スケーラブルな言語Scala

プログラマと共に成長する言語Scala

Scalaという名前は「スケーラブルな言語」を意味します。 ユーザの求めに応じて成長していけるように設計されているので、そのような名前になっています。 Scalaは小規模なスクリプトを書くことから、大規模なシステムを構築することまで、広範囲のプログラミングニーズに答えられます。

オブジェクト指向関数型言語

Scalaはオブジェクト指向と関数型プログラミング概念を静的な型付け言語にまとめあげたものです。2つのプログラミングスタイルは拡張性の麺でも相補的な強さを持っています。

関数型の機能を使用すれば、単純な部品から面白いものを素早く作ることができ、オブジェクト指向の機能を使えば大規模なシステムの構造を与えたり、新しいニーズに答えやすくなります。

なので、Scalaは新しいプログラミングパターンやコンポーネント抽象を表現でき、簡潔で読みやすいプログラムを書ける言語になりました。

Scalaのルーツ

Scalaはとても多くのプログラミング言語から影響を受けてきています。実際、Scalaの機能でScala独自のものはごく一部です。基本的な部分はJavaとC#が多く採用されています。クラス・パッケージ・式・ブロックはJavaとほぼ同じです。基本型・クラスライブラリはJavaそのものを使っています。その他ではSmallTalkやRubyよりオブジェクト指向を採用され、Erlangからはアクターが採用されています。

コードをながめる

前述の通り、Scalaは多くの基本的な機能をJavaから採用しているので、今回はJavaとコードを比較しながら、進めていきます。まずはシンプルなHelloWorldから見ていきます。

[Javaのコードの場合]

//HelloWorld.java
public class HelloWorld {
 public static void main (String[] args) {
 System.out.println("Hello World !!");
 }
}

[Scalaのコードの場合]

//HelloWorld.scala
object HelloWorld{
 def main(args: Array[String]) = {
 println("Helloworld")
 }
}

JavaとScalaのコードを見比べてみて、何が変わったか?

  1. セミコロンがなくなった
  2. 関数宣言が アクセス演算子 帰り値 関数名() から defに変わった。
  3. 関数の帰り値が省略可能になった。
  4. 変数の型の書式が変わった。 型 変数名 から 変数名:型になった。
  5. class ではなく、 object という予約語になった。

次は計算機コンピュータとして必須の機能である、電卓を実装します。

[Javaのコードの場合]

//Calc.java
public class Calc {
 public static void main (String[] args) {
 final int two = Calc.add(1,1);
 final int one = Calc.sub(2,1);
 final int six = Calc.mul(3,2);
 final int five = Calc.div(10,2); 
 }
 public static int add(int num1,int num2){
 return num1 + num2;
 }
 public static int sub(int num1,int num2){
 return num1 - num2;
 }
 public static int mul(int num1,int num2){
 return num1 * num2;
 }
 public static float div(float num1, float num2){
 if(num2 == 0) throw new IllegalArgumentException("divide by zero");
 return num1/num2;
 }
}

[Scalaのコードの場合]

//Calc.scala
object Calc{
 def main(args: Array[String]) = {
 val two = Calc.add(1,1)
 val one = Calc.sub(2,1)
 val six = Calc.mul(3,2)
 val five = Calc.div(10,2)
 }
 def add(num1 : Int, num2 : Int) : Int = num1 + num2
 def sub(num1 : Int, num2 : Int) : Int = num1 - num2
 def mul(num1 : Int, num2 : Int) = num1 * num2
 def div(num1 : Float, num2 : Float) = {
 import java.lang.IllegalArgumentException
 if(num2 == 0)
 new IllegalArgumentException("devide by zero")
 else
 num1 / num2
 }
}

JavaとScalaのコードを見比べてみて、何が変わったか?

  1. 定数が final ではなく、 val になった
  2. 関数が def になった
  3. ブロックの途中で import 可能になった

では、JavaとScalaのそれぞれの仕様について、もう少し詳しくみてみましょう。

Scalaの型はJavaのものを流用していますが、プリミティブなデータ型はありません。その代わりに、それらの頭文字を大文字に変更したクラスのデータ型を使用します。Javaにあったプリミティブなデータ型はなくなり、すべてのデータがオブジェクトになったため、Scalaは純粋なオブジェクト指向言語と呼ばれています。ScalaとJavaの型対応表を用意しましたので、こちらを見ていただけるとわかりやすいと思います。

定数・変数

Javaの定数は変数定義の接頭語として final をつけることにより値の変更を不可にしますが、Scalaは val という予約を使い、定数を定義します。Scalaの定数はJavaのものと同様に再代入することができません。

[Java 流の定数]

static final int ID = 1;

[Scala流の定数]

val ID = 1

変数は var という予約後を使用します。こちらはJavaの変数と同様に再代入することができます。

関数

Javaの関数は必ずクラスの中に定義する必要があるため、

アクセス演算子 帰り値 関数名(引数型 引数名)

と決まっていました。

Scalaにおける関数はクラスの中でなくても、関数のなかやC言語のようにグローバル関数も定義することができます。Scalaの関数は

def 関数名 : 帰り値 (引数名:引数型) = 式 

となっています。使わない場合は引数、引数のかっこ も省略可能で結果から推論するので、省略可能です。ただし、値を返す関数に関しては defの後に = をつける必要があります。また、引数の型は必ず定数になります。その他、値を返す際に明示的に return を入力する必要がありません。 最後に定義した値を返すことを推論します。

//Stringを返すと推論
def hello = "Hello"

演算子

基本的にJavaのものと同一ですが、++, ーーと3項演算子を使用することはできません。またScalaの演算子はJavaの演算子とは異なり、各種オブジェクトの関数として定義されています。またScalaの演算子はJavaの演算子とは異なり、各種オブジェクトの関数として定義されています。

例えば、Int型が持つ 「+」メソッドは数値オブジェクトの足し算を実行し、実行結果を返す。というものになります。 現にScalaではクラスのアクセス演算子を . ではなく、半角スペースで表現することも可能で、より自然な表現を実現しています。

セミコロン推論

Scalaは以下の条件にあたはまらない場合、文末にセミコロンを省略可能です。

  • 文末に文法的に文末と認められない単語がある場合
  • 次の行頭が文の先頭として認められない単語である場合
  • ()や[]が閉じられていない状態で文末になっている場合

型推論

Scalaは変数や関数の帰り値の型が明示的な場合は省略することができます。

//msgはString型として推論
val msg = "Hello"
//hello関数の帰り値はStringと推論
def hello = "Hello"
//引数の型は推論しない
def add(num1,num2) = num1 + num2

まとめ

今回は最初なので、Javaと比較しながらScalaの仕様を紹介させて頂きました。 Scalaはとても柔軟な言語で省略して書けばまるでLLのように書くことも、省略しなければJavaのようにきちんとしたコードを書くこともできます。 また、関数型言語の機能を多く持っている言語ですが、今回のようにほぼそれらを使用せずにコーディングすることもできます。

Scalaはユーザの要求に応じて成長し、スケールする言語だからこそできる事であり、他の言語には真似できないことだと思います。 次回はScalaの関数型言語らしい機能を紹介したいと思います。

オススメ記事一覧

もっと見る
完全無料!

1で登録完了!

エンジニアの仕事・年収や選考ノウハウ記事が読めるほか、
会員にはプログラミング講習やES・面接対策などリアルな無料サポートも充実。
ここだけの求人情報も多数。

今すぐ新規会員登録
Page Top