Groovy(グルービー)は、Java仮想マシン上で動作するスクリプト言語です。コンパイル不要でプログラムを手軽に実行できます。その構文はRubyから大きな影響を受けており、柔軟なプログラムを作成することができます。今回はGroovyの使い方や簡単なプログラムを紹介します。

人気のスクリプト言語「Groovy」とは

Groovyは、Java仮想マシン(JVM)上で動くオープンソースの言語です。オープンソースのプロジェクトを支援する団体であるApacheソフトウェア財団によって管理されています。元々は、James StrachanやBob McWhirterを中心にして、2003年に開発されました。とても人気があり、原稿執筆時点の2019年9月、TIOBEによるランキングでも11位以にランクインしています。

その人気の理由ですが、Java仮想マシン(JVM)上で動作する動的スクリプト言語であるという部分にあります。まず、JVMで動作するため、強力なJavaのAPIをはじめ、Javaで作成した膨大で豊富なライブラリを気軽に利用することができます。そして、Rubyや他のスクリプト言語のような、動的なスクリプト言語であるため、コンパイル作業を行うことなくプログラムをすぐに動かすことができます。

しかも、動的に実行するだけでなく、groovycコマンドを使うことで、GroovyのプログラムをJavaのクラスファイルにコンパイルし、出力することができます。つまり、JavaのライブラリをGroovyだけで作成することもできるのです。

GroovyはJavaの文法を大幅に簡易化したものと言えます。そのため、Javaに慣れているなら、Groovyも比較的簡単に使えるようになるでしょう。大きな違いとしては、変数の型宣言が不要なことや、メソッド呼び出しの括弧や行末のセミコロンが省略できることなどが挙げられます。いずれも、Javaを書いていて面倒だと思われる点が、大きく改善されている印象があります。

なお、Groovyの利用用途ですが、Web開発やAndroidアプリの開発、プログラムのテストやバッチ処理など、様々な場面でGroovyが使われています。

Groovyをインストールしてみよう

それでは、早速Groovyをインストールしてみましょう。

まず、Groovyを使うには、Javaのインストールが必要となります。GroovyはJava仮想マシン上で動くという特徴のためJavaは必須です。

原稿執筆時点の安定バージョンである、2.5.8を利用する場合、Java6以上(Java8が推奨されている)をインストールする必要があります。こちらから最新のJavaをインストールしましょう。

【Windowsの場合】

Javaをインストールしたら、その上で、公式サイトからGroovyをダウンロードしましょう。ここでは、安定版の2.5.8のSDK bundleバージョンをダウンロードしましょう。そして、ダウンロードしたZIPファイルを解凍します。

WindowsでGroovyが動くようにするには、環境変数の「JAVA_HOME」と「GROOVY_HOME」の二つを正しく設定する必要があります。Windows10であれば、Windowsメニューより「設定」ボタンをクリックします。そして「Windowsの設定」が出たら、検索ボックスに「環境変数を編集」と入力します。そして、[新規]のボタンを押して、環境変数を追加します。ここで、変数名に「JAVA_HOME」と記入し、変数値には、Javaをインストールしたフォルダのパスを指定します。同様の方法で、「GROOVY_HOME」を作成し、そこには、Groovyをインストールしたフォルダのパスを指定します。

  • 環境変数JAVA_HOMEとGROOVY_HOMEを設定する必要があります

    環境変数JAVA_HOMEとGROOVY_HOMEを設定する必要があります

【macOSの場合】

macOSでも、最初にJavaをインストールします。その上で、ターミナル.appを開き、コマンドラインからHomebrew経由でインストールするのが簡単です。最初にHomebrewをこちらからインストールします。そして、以下のコマンドを実行してGroovyをインストールしましょう。

brew install groovy

Groovy Consoleでプログラムを実行してみよう

Groovy Consoleは、Groovyに標準で同梱されている簡易開発環境です。これを使うと、プログラムを記述した後、実行ボタンを押すと、すぐにプログラムを実行できます。結果をすぐに確認することができるのでオススメです。

Groovy Consoleを起動するには、Windowsでは、Groovyのbinフォルダの中にある「groovyConsole.bat」をダブルクリックします。macOSでは、ターミナルで「groovyConsole」と打ち込んでみましょう。すると、Groovy Consoleが起動します。

まず、一番簡単な以下のプログラムを実行してみましょう。メニューから[Script > Run]をクリックすると、記述したプログラムをすぐに実行できます。

println 2 + 3 * 4

プログラムを実行すると、以下のように表示されます。

  • GroovyConsoleを起動するとエディタが起動します

    GroovyConsoleを起動するとエディタが起動します

Groovyらしいプログラム

続けて、簡単でGroovyらしいプログラムを紹介します。1から10までの数を加算するプログラムは、以下のように記述できます。

n = 0
(1..10).each { n += it }
println n
  • 1から10までの数を加算するプログラムを実行したところ

    1から10までの数を加算するプログラムを実行したところ

連続する数値を順に処理したい場合、『(1..10)..each { ... }』のように記述することで繰り返し処理を記述できます。このとき、ループ変数は、自動的に変数itとなります。注目したいのは、特に変数定義をしなくても、変数nを初期化して利用できている点です。

また、上記のプログラムで「n = 0」のところで、変数nの型を明示して「int n = 0」と変数型をintと宣言した後、値を初期化することもできます。

FizzBuzz問題を解いてみよう

続けて、いつも本連載でやっているように、FizzBuzz問題を解いてみましょう。FizzBuzz問題とは以下のようなプログラムです。

1から100までの数字を出力する際に、3の倍数の時「Fizz」、5の倍数の時「Buzz」、3と5の倍数の時「FizzBuzz」と表示するプログラムを作って下さい。

そして、Groovyで作成したFizzBuzzのプログラムは以下の通りです。

// FizzBuzz判定を行う関数を定義 --- (*1)
def isFizz(n) { n % 3 == 0 }
def isBuzz(n) { n % 5 == 0 }
def fizzbuzz(n) {
  if (isFizz(n) && isBuzz(n)) return "FizzBuzz"
  if (isFizz(n)) return "Fizz"
  if (isBuzz(n)) return "Buzz"
  n
}
// 1から100までの数を順に判定する --- (*2)
(1..100).each {
  println fizzbuzz(it)
}

Groovy Consoleでプログラムを実行すると、以下のように結果が表示されます。

  • Groovy ConsoleでFizzBuzz問題を求めるプログラムを実行したところ

    Groovy ConsoleでFizzBuzz問題を求めるプログラムを実行したところ

どうでしょうか。非常に簡潔にFizzBuzz問題を解くことができました。もう少し詳しく見ていきましょう。(*1)の部分では、FizzBuzzの各値を判定する関数を定義しています。Groovyでは最後に指定した値が関数の戻り値となります。そして、(*2)の部分では先ほど見たように、eachメソッドを利用して、繰り返し数値をFizzBuzz判定して出力するというものになっています。

まとめ

以上、今回は、Java仮想マシン上で動くスクリプト言語のGroovyについて紹介しました。Rubyのように柔軟でありながら、JavaのAPIや過去に作ったJavaのライブラリを手軽に利用できるのがメリットです。

なお、Groovyのライバルとしては、同じJava仮想マシンで動くKotlinやScalaの存在を挙げることができます。いずれの言語も、Javaをより簡単に記述することを目標に開発されています。さらに、Kotlinと同じように、Groovyも公式でAndroidアプリの開発をサポートしていると明言しています。Groovyのような柔軟な言語でAndroidアプリの開発が出来るのは嬉しい点です。

Javaの資産を活かしつつ、柔軟なプログラムが作れるGroovyは今後も様々な場所で使われていくことでしょう。

自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2004年度未踏ユース スーパークリエータ認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。