Scalaの特徴を紹介し、基本構文や関数、クラスなど、Scalaの基本的な機能について解説する入門連載
前回の記事「基本的なパターンマッチとScalaで重要な“関数”」では、パターンマッチの使用方法とScalaの関数を紹介しました。今回は、それらの知識を踏まえて、Scalaのクラスとオブジェクトの使い方を紹介します。また、以前紹介したパターンマッチで、オブジェクトをマッチ条件にする方法も紹介します。
なお本稿では、オブジェクト指向自体やクラスの概念、それらに関連した基本的な事柄は詳細に説明しません。オブジェクト指向の基礎について確認したい方は、以下の記事などをご覧ください。
5分で絶対に分かるオブジェクト指向
オブジェクト指向という考え方は、ソフトウェア開発の世界に随分浸透しました。とはいえ、きちんと説明できるという人は実はなかなかいないようです
情報マネジメント > アーキテクチャ 2007/3/6
いまさら聞けないJavaによるオブジェクト指向の常識
プログラマーの常識をJavaで身につける(11) Javaを学習する際に「オブジェクト指向」という言葉をよく耳にすると思いますが、いまさら聞けない人はぜひ読んでみてください
「Java Solution」フォーラム 2008/5/8
第1回記事では、Scala標準のREPLとScala IDEで動作を確認してみました。今後本記事のサンプルコードは、どちらで確認しても問題はありませんが、対話的に実行でき、1文ごとにコードの結果が分かって便利なので、基本的にはREPLを用いて説明していきます。
Scala IDEを使用する場合、第1回記事の『Scala IDE for Eclipseで「Hello Scala!」』を参照してプロジェクトを作成して実行してください。REPLを使用する場合は、コンソール上でscalaコマンドを実行し、REPLを起動してください。
JavaやRubyなどの言語と同様、Scalaでもクラスを使用できます。クラスはフィールドとメソッドを持つことができ、「new」キーワードを使用してインスタンス化できます。
またScalaでは、シングルトンオブジェクト(アプリ内にインスタンスが1つしか存在しないオブジェクト)を簡単に定義できる方法も提供しています。
まず、クラスの使用方法を紹介します。
Scalaでクラスを定義するには「class」キーワードを使用します。構文は、以下のようになっています。
class クラス名 { //フィールドやメソッドの定義 }
フィールドは「val」か「var」で定義し、メソッドは通常の関数と同じく「def」で定義します。
例として、プログラマを表す「Programmer」クラスを定義してみましょう。プログラマは使用言語をフィールドとして持ち、コーディングを行うメソッドを持っています。
※下記クラス定義をREPL上で入力してください
class Programmer { var language = "Scala" def coding() = println(language + "を使ってコーディングします") }
次に、定義したクラスをインスタンス化し、フィールドやメソッドを呼び出してみましょう。Javaと同じようにnewキーワードを使用してクラスをインスタンス化してフィールドやメソッドを呼び出せます。
scala> val pg = new Programmer pg: Programmer = Programmer@71f84d01 scala> pg.coding() Scalaを使ってコーディングします scala> pg.language = "Java" pg.language: java.lang.String = Java scala> pg.language res9: java.lang.String = Java scala> pg.coding() Javaを使ってコーディングします
上の例では、「pg.language」として直接フィールドにアクセスしているように見えますが、実際は自動的にアクセサメソッドが定義され、それを介してアクセスしています。
「language」フィールドを参照するときは同名のメソッドが呼ばれ、languageフィールドへ代入するときは、「language_=({代入する値}:String)」というメソッドが呼ばれています。
なお、フィールドをvalにした場合、参照用メソッドのみが提供されます。
クラスのインスタンス化実行時に初期化処理を行うため、コンストラクタを記述できます。まず、newキーワードでインスタンス化したときにメッセージを表しましょう。
class Programmer { //ここにインスタンス化時の処理を記述する println("Programmerインスタンスを生成します") var language = "Scala" def coding() = println(language + "を使ってコーディングします") } scala> val pg = new Programmer Programmerインスタンスを生成します pg: Programmer = Programmer@654cecee
Scalaのコンストラクタで処理を記述するには、クラス内に直接処理を記述します。これを「基本コンストラクタ」と呼びます。Javaでいえば、デフォルトコンストラクタ内で処理を書いたことと同等です。
では、基本コンストラクタが引数を受け取るには、どうしたらいいのでしょうか。Scalaでは、クラス名の後ろに引数を書いて、引数を受け取れます。任意の文字列を受け取り、「language」フィールドを初期化する基本コンストラクタを定義してみましょう。
class Programmer(var language:String) { println("Programmerインスタンスを生成します") println("language = " + language) def coding() = println(language + "を使ってコーディングします") } defined class Programmer scala> val pg = new Programmer("Java") Programmerインスタンスを生成します language = Java pg: Programmer = Programmer@4b31e246 scala> pg.coding() Javaを使ってコーディングします
上記の基本コンストラクタでは引数にvarを指定していますが、varやvalを指定しないで引数を記述すると、「language」フィールドへクラス外からアクセスできなくなります。
基本コンストラクタで引数を受け取り、なおかつlanguageを参照用に公開したい場合、下記のようにフィールドを宣言して受け取った引数を代入するか、コンストラクタの引数をvalで宣言します。
class Programmer(_language: String) { println("Programmerインスタンスを生成します") println("language = " + _language) val language = _language def coding() = println(language + "を使ってコーディングします") } class Programmer(val language: String) { println("Programmerインスタンスを生成します") println("language = " + language) def coding() = println(language + "を使ってコーディングします") }
次ページでは、さらにさまざまなScalaの文法やキーワードを紹介します。
Copyright © ITmedia, Inc. All Rights Reserved.