次世代型プログラミング言語Scala入門:未経験者に必須の知識総まとめ!
[AD] Scalaアプリケーションの開発・保守は合同会社ミルクソフトにお任せください
はじめに
こんにちは。編集責任者の堀内です。
この度はScalapediaをご覧いただき、また、Scalaというプログラミング言語に興味を持っていただき、ありがとうございます。
この記事を読んでいるあなたは、Scalaに関しては全くの初心者で、以下のような疑問や希望をお持ちなのではないでしょうか。
- 「どうやらScalaというプログラミング言語があるらしい。いったいどんな言語だろう?」
- 「Scalaが面白いって聞いた。ちょっとScalaを試してみて、いろいろ感覚を掴みたい」
以下ではそのご期待に応え、前半では次世代のプログラミングを担うScalaについての概要を説明し、後半ではScalaを使ったプログラミングの初歩に実際に触れていきます。
実は、Scalaは近年のプログラミング言語の流行を先取りしている言語で、メジャーな言語にいま続々と追加されている新機能を当初より備えていた「極めて先見の明のある」言語なのです。
これによって高い生産性を誇っています。
そのうえ、Scalaの表現力の高さには比肩するものがなく、「書いていて楽しい」といってハマってしまう人も多いという、たいへん珍しい言語なのです。
みなさんには、この記事を通じてScalaの魅力を感じていただければ幸いです。
プログラミング初心者の方へ
世の中にはプログラミング言語がたくさんありますよね。
Scalaも数あるプログラミング言語の中の一つです。
プログラミング言語としては他にも、C言語、C++、Java、JavaScript、PHP、Ruby、Python、Swift、Kotlin、R、COBOL、Fortran、VBScriptなどといったものを挙げることができます。
もし「実はどれも聞いたことないし、よくわからない」という場合には、この記事を読み進める前に以下の記事をご覧ください。
さて、この記事では次のような疑問にお答えしていきます。
- Scalaってどんなプログラミング言語?何に使うの?
- Scalaの最新版は?今後のリリース予定は?
- Scalaがデータ分析によく使われている理由は?
- Scalaって高単価なの?
- Scalaって難しいの?
- 次世代Scalaがあるって本当?新機能は?
- Scalaを使うべき?
- Scalaを学ぶにはどうすればいい?
この記事を読み終わる頃には、Scalaについて一通りわかる状態になっているはずです!
早速見ていきましょう。
Scalaは「ハイブリッド型」のプログラミング言語
Scalaは「スカラ」と読みます。英語圏では「スカーラ」「スケィラ」と発音されることが多いです。
Scalaは、高い生産性を誇る「ハイブリッド型」のプログラミング言語です。
Scalaはいったい何と何のハイブリッド言語なのでしょうか。
いくつかの側面から説明することができます。
- オブジェクト指向プログラミングと関数型プログラミング
- JavaとHaskell
- 静的型付け言語と動的型付け言語
- JavaとRuby
- マルチプラットフォーム
- JVMとJavaScriptとネイティブ環境
動的型付け | 静的型付け | |
---|---|---|
オブジェクト指向 | Ruby | Java |
関数型 | Elixir | Scala |
オブジェクト指向 | ハイブリッド | 関数型 |
---|---|---|
Java | Scala | Haskell |
オブジェクト指向 | "better Java" | ハイブリッド | 関数型 |
---|---|---|---|
Java | Kotlin | Scala | Haskell |
Scalaの概要
Scalaの歴史
Scala(スカラ)は スイス連邦工科大学(EPFL:École polytechnique fédérale de Lausanne)のMartin Odersky教授によって開発されたプログラミング言語です。
当時はJavaが大流行していた一方で、多くの指摘や批判がJavaに寄せられていました。
Odersky教授はJavaへの指摘を解決し、批判を解消する方法を考えました。
その結果、「関数型」というプログラミングパラダイムを導入することによってJavaの抱える問題が解決できることに気づいたのです。
彼は2001年からScalaの開発に着手し、2004年1月にバージョン1をリリースしました。
そして2006年の3月に現行のシリーズとなるバージョン2をリリースしました。
その後さらに改善を進め、メジャーバージョンアップに匹敵するような変更を何度も重ね、今に至ります。
現在の最新版は2.13.2
です(2020年5月現在)。
バージョン2が出てからすでに15年経過しており、採用実績も十分にあり(後述)、その点では十分枯れているといえます。
今後のリリース予定は?
現在、次期メジャーバージョンアップのScala 3(コードネーム:Dotty)の開発が進行中です。
Scalaは当初よりオブジェクト指向プログラミングと関数型プログラミングを両立し、高いレベルで統合することを企図していました。
その試みはバージョン2ですでにある程度達成されたといえますが、さらに安全で使いやすいプログラミング言語へと洗練することを目標としています。
次世代Scalaの開発は順調に進んでおり、早ければ2020年中にリリース予定です。
果たして年内に間に合うのでしょうか?楽しみですね。
Scala 3の開発進捗に関する最新情報についてはこちらの記事を参照してください。
また、この記事では後ほどScala 3の新機能をご紹介します。
「Scala」の由来は「階段」「スケーラブル」
次に、「Scala」という名前に込められた願いを見てみましょう。
Scalaという名前の語源は2つあります。
ひとつはイタリア語の「階段」を表す"scala"です。
Scalaによってあなたがより高いレベルのプログラミングへと段階的に導かれていってほしい、という願いが込められています。
もうひとつは"scalable language"から取っています。 Scalaの概念が大規模なプログラムへも対応可能であることを期待しています。
Scalaのロゴの由来も「階段」
Scalaのロゴは、同じく階段が由来になっています。
EPFLの建物には吹き抜けに大きな螺旋階段があり、これとScalaの頭文字である「S」を絡めてロゴとしています。
ScalaはJavaに似た汎用的なプログラミング言語
Scalaはさまざまな用途に対して汎用的に用いられるプログラミング言語です。
これといって用途が限られているわけではありませんが、使用される場面として多いのは、インターネットや広告、金融、データ分析などの先進的な分野です。
Scalaは聞いたことがなくても、Javaという言語を知っている方は多いでしょう。
Javaは多くの企業の業務アプリケーションや、インターネット上のサービスを構築するために用いられており、世界で最も使われているプログラミング言語の一つです。
Scalaは、様々あるプログラミング言語のなかでは、Javaに近い言語です。 Javaというと一般的にはお硬いイメージがありますが、Scalaはそれよりも新しく、先進的でモダンな言語です。
Scalaの特長はふたつあります。
ひとつは、Javaとの相互運用性が確保されていることにより、幅広い場面で利用できる点です。
もうひとつは、オブジェクト指向プログラミングと関数型プログラミングが融合されていることにより、先進的でモダンである点です。
ScalaはJavaの親戚
さきほど、ScalaはJavaに近い言語であると述べました。
この「近さ」の理由は、ScalaはJavaのプラットフォーム上で動作し、さらにJavaとの相互運用性を確保していることです。
ScalaはJava仮想マシンで動く
ScalaとJavaの「近さ」の理由は、Scalaの動作環境にあります。
JavaはJava仮想マシン(JVM:Java Virtual Machine)というJava専用のプラットフォーム上で動作します。
ScalaはそのJava仮想マシン上で動作するように設計されています。
詳しくいうと、ScalaのコードはJavaのバイトコードにコンパイルされ、JVM上で実行されます。
このようにJVM上で動くJava以外の言語はいわゆる「JVM言語」と呼ばれます。
ScalaもJVM言語の一つです。他にはKotlinやGroovy、Clojureなどがあります。
Scalaは今でこそJava仮想マシン上だけでなくネイティブ環境やJavaScript上でも動作しますが、長い間Javaプラットフォームをメインに動作していました。
かつては.NETプラットフォームでも動作していましたが、現在はサポートされていません。
ScalaはJavaとの相互運用性を確保している
ScalaはJavaとの相互運用性を確保しています。
「相互運用性」という言葉に馴染みのない方も多いでしょう。
相互運用性とは、ScalaからJava、JavaからScalaのコードを自由に使うことができることです。
これはつまり、Javaコミュニティがこれまで四半世紀に渡って培ってきた豊富になライブラリ群を自由に使用できるということです。
Javaという巨人の方に乗ることで、さらに高いレベルのプログラミングを手軽に実現しようというのがScalaのコンセプトなのです。
ScalaはJavaとの親和性を重視している
また、相互運用性を確保しただけでなく、ScalaにおいてもJava風味のコードを書けるよう設計することで、 Javaを経験した人がScalaに対してスムーズに馴染めるように最大限配慮されています。
なぜここまでJavaとの親和性を重視しているのかといえば、かつてJavaの開発に携わっていた人によって開発されたのがScalaだからです。
その人とはスイス連邦工科大学教授のMartin Odersky先生です。
Javaにジェネリクスを導入するのに中心的な働きをした人物です。
彼は既存のプログラマが新しい言語に馴染めることを重要視しており、それがJavaとの親和性を重視することにつながっています。
ここで一旦まとめます。
Java経験者にとっては親しみやすい構文を備え、さらにJavaエコシステムの資産を活かせるよう、Javaとの相互運用が可能なように設計されているということがScalaの特長です。
いわば、ScalaはJavaに対して独自要素を加えたプログラミング言語として捉えるのがちょうど良いでしょう。
Scalaは手軽で安全に「関数型プログラミング」ができる次世代型言語
さて、たとえJavaとよく似ていて移行が簡単だったとしても、新しく加えた独自性が大したことなければScalaを使う意味はほとんどないのですが、果たしてその点はどうでしょうか。
Scalaとしての独自性とは何か?というと、「関数型プログラミング」です。
これによってScalaは、その見た目とは裏腹にJavaとは全く別物と言っていいほどの使用感を備える言語になりました。
いつの時代も、得てしてプログラムは開発していくうちに肥大化してスパゲッティコードになりがちなものです。
しかも多くの人にとっては、Javaは特に冗長なコードになりがちな言語というイメージ・実体験があります。
しかし、Scalaを使って関数型プログラミングを導入することにより、維持費用の安い、簡潔で安全なプログラムを書くことができるようになります。
Scalaは表現力豊かな次世代型言語
Scalaの最大の特長は表現力の豊かさです。
この表現力の豊かさというのは、Scalaが関数型言語である点によります。
何らかの難しい概念などを表現するために必要な記述量が、他の言語に比べて圧倒的に少ないです。
もちろん、もともと難しい概念は当然ながら難しいままなので、そのこと自体は注意する必要がありますが、
読んで理解するべきコードがそもそも少ないことにより、他の言語で書かれたプログラムと比べた場合には大幅に理解しやすい内容となります。
これを裏返せば、他の一般的な言語で書かれた処理や概念は、Scalaであれば同等の機能性をもちながらも大幅に少ない記述量で実現できてしまうということです。
理解しやすいプログラムを書きやすいので、人間にとってやさしい次世代型の言語と言えます。
可能性が広がるだけじゃない!リスクへの対応も万全
Scalaは関数型というパラダイムにより高度に抽象的なプログラミングを実現している言語ですが、類似の言語の中でも「Javaと同じくJVMで動く」というのが強みです。
これは何を意味するかというと、Scalaの導入が想定以上にうまくいかなかった場合でも、使い慣れたJavaのコードを使用することができます。
あるいは、Scala自体にも「Java寄りのScala」を書くという選択肢が用意されており、これによってJavaからの段階的な移行ができるようになっています。
つまり、可能性が広がるだけでなく、実際の開発現場で想定されるリスクへの対処法が明確で安心できるわけですね。このことこそが「Scalaが選ばれる理由」というわけです。
Scalaの特徴
Scalaの特筆すべき点について述べましたが、その他のScalaを特徴づけている点についても触れておきましょう。
ScalaはJVM、JavaScript、ネイティブ環境で使用できるマルチプラットフォーム言語
Scalaは標準ではJava仮想マシン上で動かすことになりますが、実はJavaScript上やネイティブ環境でも動きます。
それぞれについて見ていきましょう。
Scala.jsでJavaScriptのコードを出力することができる
ScalaがJavaScript上で動くというのはどういうことかというと、ScalaをコンパイルしてJavaScriptのコードを出力することができるということです。
ScalaにはScala.jsというプラグインがあり、正式版(1.0.0)が2020年の2月にリリースされています。
これにより、JavaScriptで書くことが求められるアプリケーションをScalaで書くことができます。
Scalaの便利な標準ライブラリを使用できる上に、型安全性によってバグを未然に防げる確率が飛躍的に高まります。
JavaScriptを使用するのであればぜひご検討ください。
ネイティブ環境でもScalaが使用できる
最近ではネイティブ環境でもScalaを使用できるようになりました。
ネイティブ環境でScalaを使用する方法は2つあります。Scala NativeとGraalVMです。
Scala NativeはScalaをLLVM用に出力するプラグインです。
(Scala Native,https://scala-native.readthedocs.io/)
また、GraalVMはさまざまな言語を実行できる環境です。
このように、Scalaを使用できる場面は近年ますます広がっています。
Scalaは多種多様のプロジェクトで採用される実績豊富な言語
Scalaは大規模なデータを高速に処理することが得意です。
安定稼働を求められるシステムに適しています。
Scalaが利用されている代表的な事例として、Twitterを挙げることができます。
TwitterがScalaを採用したのは2009年頃、RubyからScalaへと完全に移行したのは2011年頃です。
TwitterはRubyからScalaへと移行することによって、不安定だったシステムを安定的に運用できるようになりました。
また、機能追加の頻度も大きく増えました。
その後Twitterは東日本大震災の際の大量のトラフィックを捌き切り、今では日本に欠かせないインフラとなりました。
まさに、TwitterはScalaが支えているといっても過言ではありませんね。
Twitterの成功を見て、他にも金融機関、クラウド事業者、広告配信、モバイル・Webアプリケーションなど多くの業界において広く使われるようになりました。
既に投資銀行や証券会社、超大手メーカーなどにおいて導入・運用事例があります。
あまり目立っていないだけで、近年ではかなり普及していると言えるでしょう。
TwitterがScalaに移行してから既に10年近い時が経過しています。
もちろんその間もアップデートは続いていますし、Scalaの開発・運用に関する知見が蓄積されてきています。
つまり、Scalaは最近新しく出てきた言語というではなく、既に十分に「枯れた」技術なのです。
Scalaは高い生産性をもつのが特長
Scalaには以下のような特長があります。
これらの特長によって、高い生産性を実現することができます。
- Javaエコシステムの膨大な資産を自由に活用できる
- 処理が高速
- 非同期処理・分散処理を開発しやすい
- 表現力が高く、設計者の意図を伝えやすい
- 記述量が少なく、コンパクトなプログラムが書ける
- 堅牢で安全なプログラムが書ける
- 保守性の高いプログラムが書ける
Scalaのデメリット
Scalaは難しい?
Scalaのデメリットとして「Scalaは難しい」と言われることがありますが、たしかにその通りです。
Scalaは比較的難しい方の言語です。
ただ、それは「日本語って難しいね」とよく言われるのと同じことです。
もっと簡単な言語があるからといって乗り換えますか?
あるいは「『米』『ご飯』『ライス』は紛らわしいので統一しよう」という話になりますか?そうではありませんよね。
「ご飯」に統一すると、「米」は「炊く前のご飯」、「ライス」は「平たい皿に盛りつけたご飯」とわざわざ書かない限り伝わらなくなってしまいます。
難しさとは自由度です。難しさを捨ててしまうと日本語の機微、僅かな違いを表現する力までもを捨ててしまうことになります。 Scalaも同様に、難しい一方で、書いた人の意図を伝えたり表現したりする自由度が高い、いわば「解像度の高い」言語です。
もちろん、よくある表現に限って用意されている「簡単な」言語を使えば、その限られた表現だけを使うことによって"語彙や文法レベルでは"簡単に表現することはできます。
しかし表現されている内容自体が簡単になるわけではない、ということに注意してください。
あらかじめ用意された表現の範囲外となるような難しい内容を表現しようとすると、途端に冗長な表現になってしまいます。
これでは、たとえ語彙が簡単でも「簡単に表現できている」とは言えません。
極端な例えですが、「小学6年生までで教わる言葉や国語の文法では、法律や契約書のような文章を読み解けないし、記述することも難しい」ということと全く同じことです。
簡単な言語は、シンプルなプログラムを作りやすい。
ただし、複雑なものを表現しようとすると冗長な表現になってしまい、スパゲッティコードを生み出すことになります。
Scalaが登場したことにより、多様な業務要件をシンプルに表現し、ありのままに実装する、ということができるようになりました。
Scalaも日本語も同じように、高度な表現のできる言語なのです。
難しさを乗り越えれば豊かな表現力、それによる圧倒的な生産性の向上を手に入れることができます。
あなたはどちらを取りますか?
他の言語との比較
Javaとの違いについては上述したとおりです。
C言語とC++との関係を知っている方には、「Java++みたいなもの」だと思ってもらえればわかりやすいでしょう。
C言語にオブジェクト指向プログラミングを追加したのがC++でした。
Javaに関数型プログラミングを追加したのがScala、ということです。
Scalaは、Android開発で用いられるKotlinのベースとなった言語でもあります。
Kotlinの主要な構文はScalaから引き継がれています。
ScalaをAndroidプラットフォームに乗るようチューニングしたのがKotlinです。
Scalaは主にどんな用途に使われているの?
TwitterのようなWebアプリケーションのバックエンドサーバとして用いられることが多いです。
とくに、高速に処理する必要があったり、大規模になりうる/既に大規模であるシステムには非常に向いています。
また、小さい規模のアプリケーションであっても、安定性や堅牢性が求めれられる状況にも適しています。
あるいは、ビッグデータなどデータ分析の用途で使用されます。
これは、Sparkという分散処理フレームワークが存在しており、SparkをScalaで利用している人が多いためです。
Scalaが活躍できるシーンは非常に幅広いのです。
Scalaが高単価な理由
はじめに言っておかなければならないことがあります。
そもそも、Scalaの転職に関していえば、プログラミング完全未経験者の入る余地はほぼありません。
ただし、業務でプログラミングをしたことのある人であれば可能性はかなりあります。
Scalaエンジニアが高単価であるというのは近年知られつつあります。
言語別の求人年収ランキングをきっかけにScalaを知った人も多いようです。
高単価の状況はここ5年ほど続いています。
なぜ高単価が続いているのかというと、需要と供給のバランスが悪いからです。
Scalaエンジニアを求める企業が圧倒的に多く、それに対してScalaエンジニアが非常に少ないのです。
Scalaエンジニアが枯渇しているのは、上述の「難しさ」に起因しています。
まず、難しいと思って敬遠している人が多いです。
また、学習を始めてみた人も、実際に難しいと感じて学習をやめてしまう人も多いです。
書籍を読んでいると、要求知識がとても多く見えてしまうんですね。
実際に本には大量に文章が書かれていますから無理もないです。
ただ、本というのはそもそも網羅的に説明するのが仕事なのですから、それを見て圧倒されてしまうのは至極当然。
気落ちする必要はありません。
Scalaのもつ豊かな表現力を説明するにはそれだけの文章量が必要なわけですが、
他の言語と同じことをするだけなら他の言語と顕著な差はありません。
イメージで損している部分があります。
つまり、「Scalaを使って仕事してみたい」という気持ちはあれど、 「Scalaの使える職を探す」ところまでは達していない、達しなかった人がほとんどなのです。
あまりにも枯渇しているので、Scala未経験であっても他の言語を経験したことさえあれば検討してくれる企業が多くあります。
というのも、Scala未経験でも良い、というのはScala経験者に限定してしまうと人材がほとんど求人市場に流通していないからです。
複数の言語を使ったことがあれば尚良しです。
Scalaを身につけようという学習意欲があることが重要です。
あなたが既にJavaの経験者なら特にチャンスです。
Javaの経験さえあればかなり有利です。
「Scalaは難しい」というイメージを乗り超えるだけで、Scalaの高単価が手に届くところまで近づいてきます。
Scalaの求人市場、転職事情については以下の記事で詳しく解説しています。
Scalaの経験はキャリアにとってプラス
Scalaのように全面的に関数型プログラミングに対応している言語に限らず、ほかの多くの言語でも関数型言語のように扱えるようなアップデートが追加されつつあります。
たとえば有名なのはSwiftです。 Objective-Cをより使いやすくするために新しく開発されましたが、この際、関数型プログラミングができるような機能が多数追加されています。
また、Androidのために開発されたKotlinも同様です。
位置づけはObjective-Cに対するSwiftのように、Javaに対してKotlinがあるようなイメージです。
Scalaから一部機能を除去して焼き直すことにより、Javaの経験者にとってさらに扱いやすくなっています。
その分表現力は限定されるのですが、限られた範囲内で最大限の関数型プログラミングができるような言語となっています。
Rubyに対してはElixirという関数型言語が開発されたりしています。
Webアプリケーションに特化した言語としてElmという言語も開発されました。
いずれも関数型言語です。
JavaScriptも元々関数型のようなところがあります。
つまり、関数型言語の扱い方、関数型プログラミングの考え方が必要されつつあります。
Scalaを習得しておくと今後のキャリア形成に役立つでしょう。
例えばKotlinはScalaができるならほぼ勉強なしに使えると言われています。
様々な言語の案件に柔軟に対応できるようになることは個人だけでなく、組織にとってもメリットとなります。 即応力が高まり、生産性の高い状態を長期間維持することができます。
ぜひこれを機にScalaを採用してみてください。
Scala人材は高単価だけどプロジェクトに採用すべき?
翻って、果たしてプロジェクト開発に用いるプログラミング言語としては採用すべきなのでしょうか。
Scalaエンジニアは確かに高単価ですが、採用すべきです。
Scalaを用いることに寄って、プログラムを簡潔に書くことができ、保守性が高く、安全なプログラムを書くことができます。
生産性の向上によってお釣りがきます。
Scalaエンジニアは枯渇しているけども、それでもなおScalaを採用するだけの価値があります。
社内で育成できる体制を取れるのであれば間違いなく採用すべきです。
その体制を作ることが難しいのであれば、少しずつ、小さく始めていくのが良いのではないでしょうか。
Scala人材を採用するならぜひScalapediaを活用しましょう!
多くの場合、新規にScalaプロジェクトを始めるにあたって、Scalaエンジニアを採用したいことでしょう。
そこで、Scalapediaに求人広告を掲載して、Scalaエンジニアに採用活動をアピールしませんか?
Scalapediaは、多くのScalaエンジニアが利用する解説サイトです。
Scalapediaに求人広告を掲載することにより、貴社の採用活動を促進しませんか?
広告掲載について、詳しくはこちらのページを参照してください。
また、Scala案件のある会社に採用されたいエンジニアさんからの応募もお待ちしております。
Webアプリケーションフレームワーク
ScalaのWebアプリケーションフレームワークとしてデファクトスタンダードとなっているのが、Play Frameworkです。
Play Frameworkについては別の記事で解説する予定です。
Scalaを学ぶ方法
書籍で学ぶ
Scalaを深く学ぶには書籍がおすすめです。
Scalaに関する書籍については以下の記事で紹介しています。
成長に役立つコミュニティ・イベント
- Scalajp
- ScalaMatsuri
- PlayFrameworkユーザー会
Scalaに入門する
Scalaを試すだけであれば、Scastieというサイトを使うとよいでしょう。
ScastieはオンラインのScala実行環境です。
ScastieはScalaの開発元が公式に用意したツールですので、安心して利用することができます。
作成したプログラムは、エクスポートすることによって手元でも動かすことができます。
Scalaの標準ライブラリだけでなく、外部ライブラリを使用することもできるので大変便利です。
詳しくは以下のページを参照してください。
開発環境を構築するには
「本格的に開発したい」「手元で動かしてみたい」という場合には開発環境を構築しましょう。
開発環境を構築するには、こちらの記事を参照してください。
最初の一歩(Hello! Worldをする)
Hello! Worldをするには、こちらの記事を参照してください。
Scalaの初歩的な書き方を学ぶ
変数を宣言する
まずは変数を宣言してみましょう。
変数は以下のようにして宣言することができます。
val x = "immutable"
val
で宣言する変数はイミュータブルな変数といって、再代入のできない変数です。
実質的には定数です。
再代入できるミュータブルな変数を定義するには、var
キーワードを使います。
var x = "mutable" x = "Yes. This is mutable."
ただし、var
を使用するとコードの見通しが悪くなり、不具合の温床となります。
Scalaにおいては、基本的にval
でミュータブルな変数を宣言しながらプログラミングします。
変数を宣言する方法について、詳しくはこちらの記事を参照してください。
基本のデータ型を知る
Scalaには以下のような基本のデータ型(「基本型」と呼びます)があります。
名称 | 説明 | 使用例 |
---|---|---|
String | 文字列 | val x: String = "これは文字列です" |
Int | 整数 | val x: Int = 1 |
Double | 浮動小数点数 | val x: Double = 0.1 |
Boolean | 真偽値 | val x: Boolean = true |
他にもShort
、Long
、Float
、Byte
などの型があります。
型を指定して変数を宣言するには、変数名の後ろに型名を付記してあげましょう。
val (変数名): (型名) = ...
基本型については、個別の記事で解説する予定です。
コメントを書く
一行コメントを書くにはスラッシュ2本 //
を記述します。
// ここはコメントになります println("ここはコメントになりません") // ここはコメントになります
複数行のコメントを書くには、コメントアウトしたい箇所を /*
と */
で挟みます。
/* ここはコメントになります */
コメントについてはこちらのページで詳しく解説しています。
ブロックを書く
複数行にわたる処理は {}
でまとめることができます。
ブロックの最後の行の結果が返ります。
val x = { val a = 1 + 1 a + 2 } println(x)
ブロックは3を返すので、変数x
の値は3となります。
3
ブロックについて詳しくはこちらの記事を参照してください。
メソッドを宣言する
以下のようなメソッドを定義してみましょう。
このメソッドは、基本型のInt
を引数に取り、これを2倍にして返り値としています。
def double(n: Int): Int = { n + n }
実際に使ってみましょう。
double(100)
200
このように、渡した値が2倍になって返ってくればOKです。
メソッドについては、個別の記事で詳しく解説しています。
リストを使う
Scalaにおいてリストを使いたい場合は、Seq
クラスを使います。
val list = Seq(100, 200, 300)
Scalaのリストについては個別の記事で解説する予定です。
リストの要素を順次処理する2つの方法
リストの要素を順次処理してみましょう。
順次処理する方法には2つあります。
map
メソッドを使用する方法と、for
式を使用する方法です。
それぞれ見てみましょう。
map
メソッドで順次処理する
先程宣言したリストに対して、map
メソッドを使って順次処理をしてみましょう。
list.map(x => double(x))
以下のように、各要素がすべて2倍になっていればOKです。
Seq(200, 400, 600)
map
メソッドについては、以下の記事でさらに詳しく解説しています。
for
式で順次処理する
今度は、先程のリストに対してfor
式を使って順次処理をしてみましょう。
for (x <- list) yield (double(x))
こちらも、以下のように、各要素がすべて2倍になっていればOKです。
Seq(200, 400, 600)
for
式については、以下の記事でさらに詳しく解説しています。
分岐をする2つの方法
Scalaで分岐処理をする方法は実はいくつもあるのですが、最も代表的なものを2つ紹介します。
if
式とmatch
式です。
if
式で分岐する
場面に応じて異なる挨拶をするプログラムを書いてみましょう。
とっても雑な例ですが、以下のように、もし朝なら「おはよう」、そうでなければ「こんにちは」を返すメソッドを宣言してみましょう。
def greet(isMorning: Boolean): String = if (isMorning) { "おはよう" } else { "こんにちは" }
早速このメソッドを使ってみましょう。
greet(true) greet(false)
以下のように出力されればOKです。
おはよう
こんにちは
if
式については、個別の記事でさらに詳しく解説しています。
match
式で分岐する
先程のようなif
式では、朝かどうかで判定しているので、夜の場合には対応できていませんでした(もちろん「こんにちは」でも十分ですが。笑)
今度はmatch
式を使って、より柔軟に対応していきましょう。
時間帯に加えて、始まりの挨拶なのか終わりの挨拶なのかも加味してみましょう。
def greet(isStart: Boolean, hour: Int): String = (isStart, hour) match { case (true, _) if 5 <= hour || hour < 12 => "おはよう" case (true, _) if 12 <= hour || hour < 18 => "こんにちは" case (true, _) => "こんばんは" case (false, _) if 5 <= hour || hour < 18 => "さようなら" case (false, _) => "おやすみ" }
これにより、夜の場合と終わりの挨拶にも対応できました。
だいぶ複雑になりましたね。
greet(true, 7) greet(true, 13) greet(true, 18) greet(false, 15) greet(false, 20)
以下のような出力となっていればOKです。
おはよう
こんにちは
こんばんは
さようなら
おやすみ
match
式については、個別の記事でさらに詳しく解説しています。
クラスを定義する
クラスを定義するには、class
キーワードを使用します。
class クラス名
と記述します。
ここではサイコロを表すクラス Dice
を定義します。
class Dice: def roll: Int = scala.util.Random.nextInt(6) + 1
Dice
クラスはサイコロを振るためのメソッドroll
を持っています。
サイコロを2つ投げて、出た目を足してみましょう。
val d1 = new Dice val d2 = new Dice println(d1.roll + d2.roll)
結果は例えばこんな感じになります。
7
クラスについてはこちらの記事で詳しく解説しています。
トレイトを定義する
トレイトとは、特定のクラスに共通する性質をまとめたものです。
トレイトを定義するには、trait
キーワードを使用します。
ここではサイコロのようなものを表すトレイトを作成し、目の個数に応じて複数のサイコロを定義してみます。
trait DiceLike: val number: Int // the number of faces def roll: Int = scala.util.Random.nextInt(number) + 1
DiceLike
クラスはサイコロを振るためのメソッドroll
を持っています。
目の個数は具体的には定められていません。
それでは具体的に、目が6つの普通のサイコロと、正二十面体に20個の目が配置された特殊なサイコロを定義してみましょう。
class NormalDice extends Dice: val number: Int = 6 class SpecialDice extends Dice: val number: Int = 20
サイコロを生成してそれぞれ振ってみます。
val normal = new NormalDice val special = new SpecialDice println(normal.roll) println(special.roll)
結果はたとえば以下のようになります。
4 18
関数を定義する
メソッドと似たようなものに関数があります。
メソッドとは異なり、関数は値として受け渡しをすることができます。
上述のメソッドと同様な処理を行う関数を定義してみましょう。
val double = (n: Int) => { n + n }
右矢印 =>
の左側は引数、右側には処理の内容を記述します。
関数はメソッドと同じように使うことができます。
println(double(100))
200
このように、渡した値が2倍になって返ってくればOKです。
関数については、個別の記事で詳しく解説しています。