連載
» 2012年04月20日 00時00分 UPDATE

スケーラブルで関数型でオブジェクト指向なScala入門(5):Scalaのクラスとオブジェクト、パターンマッチ (1/3)

Scalaの特徴を紹介し、基本構文や関数、クラスなど、Scalaの基本的な機能について解説する入門連載

[中村修太,クラスメソッド株式会社]

前回のおさらいと今回の内容

 前回の記事「基本的なパターンマッチとScalaで重要な“関数”」では、パターンマッチの使用方法とScalaの関数を紹介しました。今回は、それらの知識を踏まえて、Scalaのクラスオブジェクトの使い方を紹介します。また、以前紹介したパターンマッチで、オブジェクトをマッチ条件にする方法も紹介します。

 なお本稿では、オブジェクト指向自体やクラスの概念、それらに関連した基本的な事柄は詳細に説明しません。オブジェクト指向の基礎について確認したい方は、以下の記事などをご覧ください。

r540x60_5minoo.gif

5分で絶対に分かるオブジェクト指向
オブジェクト指向という考え方は、ソフトウェア開発の世界に随分浸透しました。とはいえ、きちんと説明できるという人は実はなかなかいないようです
情報マネジメント > アーキテクチャ 2007/3/6

r5josuiki_icon.gif

いまさら聞けないJavaによるオブジェクト指向の常識
プログラマーの常識をJavaで身につける(11) Javaを学習する際に「オブジェクト指向」という言葉をよく耳にすると思いますが、いまさら聞けない人はぜひ読んでみてください
Java Solution」フォーラム 2008/5/8

 第1回記事では、Scala標準のREPLScala IDEで動作を確認してみました。今後本記事のサンプルコードは、どちらで確認しても問題はありませんが、対話的に実行でき、1文ごとにコードの結果が分かって便利なので、基本的にはREPLを用いて説明していきます。

 Scala IDEを使用する場合、第1回記事の『Scala IDE for Eclipseで「Hello Scala!」』を参照してプロジェクトを作成して実行してください。REPLを使用する場合は、コンソール上でscalaコマンドを実行し、REPLを起動してください。

Scalaのクラスとオブジェクト

 JavaRubyなどの言語と同様、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にした場合、参照用メソッドのみが提供されます。


Scalaの基本コンストラクタ

 クラスのインスタンス化実行時に初期化処理を行うため、コンストラクタを記述できます。まず、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の文法やキーワードを紹介します。

       1|2|3 次のページへ

Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

Focus

- PR -

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。