読者です 読者をやめる 読者になる 読者になる

糸電話式のアレ

プログラミングのこと。毎日のこと。書いています。

Java使いからScala使いになるための手引き(2)

scala scaladojo

Level1)ScalaJavaと同じものが書けるようになる

記法編

宣言方法の違いについて

1.変数の宣言
var?val?型宣言はどう書くのよ?
まず、何はともあれ変数を宣言&初期化します。
varキーワードとvalキーワードを使うことで、変数を初期化できます。


JavaScriptを書いたことがあるなら、varキーワードを変数を宣言するときに使うことには違和感はないでしょう。
Scalaでは、変数を宣言するときにもう一つ、valキーワードを使うことができます。
これは、Javaで言うfinalキーワードを付けて変数宣言(定数の宣言ですね)をするのと同じだと思えばいいです。


関数型言語では、変数は定数であることが基本となります。
関数型言語の側面を持つScalaでは、Javaよりもfinal付きの変数が短く書けるように専用のキーワードが用意されていると思ってもらえば、このレベルでは差し支えありません。


final付き変数を多用するJavaプログラマは別として、基本的にはvarキーワードを宣言時に使うようにすれば、これまで通りの変数の宣言ができます。


さて、次にJavaにおいて変数宣言に欠かせなかった型の指定です。
Scalaでは、変数名の後に「:コロン」を付けて変数の型を指定します。


これまでの話をまとめると、











 JavaScala
String型の変数を宣言&初期化する

String myName="Supiderma!!!";

var myName:String="Supiderma!!!";

String型の定数を宣言&初期化する

final String myJob="Mashuroom hanter";

val myJob:String="Mashuroom hanter";


となります。


先ほどの説明で、「Javaでは欠かせなかった型指定」と言いましたが、Scalaでは欠かすことができます。
Scalaには、Javaにはない型推論という機構があります。これによりScalaでは型を省略して、変数の宣言を書くことができます。
慣れるまではこれまで通りに型を書いていて何も問題はありません。他人のコードを読むときに、Scalaでは型の指定がなくても大丈夫なんだと認識してもらえば結構です。
このレベルでは型が省略できることは、あまり気にしなくてよいでしょう。
ちなみに、上の例ようにScalaでも文末に「;セミコロン」を付けることができますが、これも省略可能です。


2.メソッドの宣言
def?型宣言はどう(ry
上記までで、変数の宣言をすることができるようになりました。
次に、メソッドを宣言&定義する方法を見てみましょう。


メソッドの宣言にはdefキーワードを使います。
defキーワードを付けてメソッド名を指定することで、メソッドが定義されます。
メソッドの返却値の型も、変数の宣言時と同じように後ろに付けます。


つまり、こうなります。(正確には両者は言語がデフォルトとするスコープの点で違いがあります)







String型を返却するメソッドを宣言&定義する
JavaScala

String myName="Supiderma!!!";
final String myJob="Mashuroom hanter";
String selfIntroduct(String name ,String job){
    return job + "\n" + name;
}

var myName:String="Supiderma!!!";
val myJob:String="Mashuroom hanter";
def selfIntroduct(name:String,job:String):String = {
    return job + "\n" + name;
}


このdefキーワードにはvarキーワードに対するvalキーワードのようなものはありません。
Javaではfinal付きの変数宣言は定数を意味しているのに対し、final付きのメソッドは継承不能メソッドの宣言を意味します。
Scalaにvarキーワードとvalキーワードがあるのは、Java(これまでの言語)との類似性と関数型言語の立場、両方を考えた場合の利便性からです。(注:筆者はそうなんだろうな、と思っています)


これに対して、関数型言語では継承と言う考え方はありません。
よって、Scalaでも継承に関する考え方は、同じオブジェクト指向と言う立場からJavaとそう変わりません。
他のオブジェクト指向に基づいた設計指針についてもJavaと同じように使うことができます。


3.列挙型の宣言
enumなんてないと怒られてしまう件について。
みんな大好き列挙型ですが、ScalaではJavaが持っていたenumキーワードはありません。
列挙型を実現するには、標準ライブラリのscala.Enumerationを継承したオブジェクトとして列挙体を実装する必要があります。

この詳しい説明は、後のLevelで行うことにします。