kmizuの日記

プログラミングや形式言語に関係のあることを書いたり書かなかったり。

Scalaはオブジェクト指向言語です(1)

こんなタイトルを付けてみましたが、これは単なる冗談でなく、「関数型」というなんだか小難しそうなイメージが定着している概念を知ること無く、JavaプログラマにScalaを説明してみようという試みです。この記事で、少しでもScalaに対するとっつきずらさを払拭できたらなあと思っています。

Scalaの主な機能

  • クラス:Javaのクラスと記法が違いますが、大体同じです。

    class A {
    }
    


  • トレイト:メソッドも実装できる便利なインタフェースです。

    trait A {
      def hoge() { println("hoge") }
    }
    class B extends A {}
    new B().hoge
    

    インタフェースにメソッドが定義できて嬉しいですね。


  • オブジェクト:GoFのシングルトンパターンを言語レベルでサポートしただけです。

    object A {
      val i = 10
    }
    

    とかやると、Aという名前でシングルトンオブジェクトにアクセスできます。


  • 無名関数:使い易い無名クラス


    (x: Int) => x + 1というなんだか難しそうな表記は、単に、

    new Function1[Int] {
      def apply(x: Int): Int = x + 1
    }
    

    の簡易記法です。Javaで言えば、

    new Function1<Integer>() {
      public Integer apply(Integer x) { return x + 1; }
    }
    

    ですね。無名クラスをよく使う人にとっては嬉しい機能だと思います。


  • パターンマッチ:強化版switch文のようなものです。

    x match {
      case 1 =>
      case 2 =>
      case 3 =>
    }
    

    とか書きます。caseの後はswitchのcaseと似たようなものですが、文字列とか色々書けて便利です。Javaは整数とenumしか指定できなくて不便ですよね。あと、break書き忘れてfall throughする心配もありません。


  • 文末にセミコロンが要りません

    println("Hello")
    

    セミコロンをいちいち書くのは面倒ですよね。


  • whileもあります

    var i = 1
    while(i < 10) {
      println(i)
      i += 1
    }
    

    普通にJavaのように書けて安心です。


  • case class:単にちょっとした自動生成コードを吐いてくれるだけの機能


    case classってなんか怖そうですが、仕組みは単純です。

    case class A
    

    と書くと、Scalaの中の人が頑張って

    class A
    object A {
      def apply(): A = new A
      ...
    }
    

    みたいなコードを自動生成してくれます。enumでもJavaの中の人が頑張って色々自動生成してくれますが、それと同じようなものです。


  • ジェネリクスJavaと大体同じように書けます。記法がちょっと違うだけです。

    class Hoge[T] {
      def hoge(t: T): T = t
    }
    

    これは、Java

    public class Hoge<T> {
      T hoge(T t) { return t; }
    }
    

    と同じ意味です。


  • 型推論:面倒な記述を削減してくれます。
    Javaで、

    Map<Integer, String> map =  new HashMap<Integer, String>();
    

    とか似たようなことを二度も書かされて面倒ですよね。Scalaなら、

    val map = new HashMap[Integer, String]();
    

    と書くだけでOKです。mapの型はよきにとりはからってくれるので、実行時エラーの心配はありません。

まだ他にもいくつかありますが、とりあえず今日はここまで。関数型というなんか難しそうな概念を知らなくても、Scalaの事を理解する事は十分可能だ、ということを伝えたいと思います。もちろん、関数型の概念を知っているに越したことは無いのですが、知らなくてもScalaを使うことはできます。