さっしーブログ

埼玉県在住のシステムエンジニアです。基本的には技術的な内容を中心に発信していきます。

Scala学習メモ

目次

本記事は学習過程でわからなかった単語などの意味をちょくちょく調べながらざっくりまとめたものです。
個人の備忘録としての内容ですので、ご理解ご了承ください。

1.ScalaのFutureとは

非同期処理を行う際に使用する標準ライブラリの名称。

2.Akkaとは

並行/分散プログラミングを行うためのライブラリ。
アクターというスレッドより小さい単位の実行コンポーネントがある。

3.メソッド定義

  • private そのクラス内だけからアクセス可能
  • protected 派生クラスからのみアクセス可能
  • private[this] 同じオブジェクトからのみアクセス可能
  • private[package] 同一パッケージに所属しているものからのみアクセス可能
  • protected[package] 派生クラスに加えて、同じパッケージに所属しているもの全てからアクセス可能

4.objectキーワード

シングルトンオブジェクトを宣言する際に使用する。

5.Unitキーワード

JavaやCでのvoidに相当する。戻り値がない場合に使用する。

6.コンパニオンオブジェクト

データ型と同じ名前のobjectです。
つまりはクラス名と同じ名前を付けたオブジェクトのこと。
そのデータ型を操作するためなどの関数が定義されている場所を示します。
同名のクラスのprivateメンバにアクセスすることが可能。

7.ケースクラス

プライマリコンストラクタ全てのフィールドを公開し、
equals()やhashCode()、toString()などの基本的なメソッドをオーバーライドしたクラスを生成します。
そして、そのクラスのインスタンスを生成するためのファクトリメソッドも生成します。

特徴としては以下となる
applyが定義されるので、newを使用せずにインスタンス化できます。
caseクラスのコンストラクタ引数は、すべてvalとして扱われます。
toStringやequals、copyなどのメソッドが提供されます。
unapplyが定義されるので、パターンマッチで使用することができます。

8.sealed

sealedとされたクラスは、同一ファイル内のクラスからは継承できますが、別ファイル内で定義されたクラスでは継承できないです。
ただし、sealedクラスを継承したクラスは別ファイルのクラスからも継承が可能です。

9.implicitについて

implicitの意味は「暗黙的な」です。
implicitを使用することにより暗黙的に何かをさせることが可能になります。

例えば型変換などです。
数値を出力する関数があったとします。
その関数に文字列を渡したらコンパイル時にエラーが発生しますよね。

ですが、このimplicitキーワードを付けた数値から文字列に変換する関数を定義しておけば、
数値を出力する関数に文字列をそのまま渡してもコンパイル時にimplicitキーワードが付いた関数定義の中から適用できそうな関数を自動で使用して勝手に変換してくれるのでコンパイル時にエラーが発生しません。

これはあくまで一例ですが、implicitを使用すればこのようなことが可能になります。

しかし、システムの規模が大きくるなるとメンテナンス性が悪くなりそうかもですね。

10.「::」と「:::」は何?

「::」は連結メソッドであり、リストなどの配列を連結する際に使用します。
では「:::」は何でしょうか?
こちらも連結メソッドで展開して配列を連結してくれます。

11.「==」「=!」

scalaではJavaと異なりString型のオブジェクトも「==」「=!」を使用して値の比較を行うことができる。
ちなみにJavaではプリミティブ型は「==」「=!」で比較して、参照型は「.equals」を使用して比較する必要がある。

12.yield

forで処理した結果を保持して起き処理後にリストに格納して返してくれる。

例えばこんな感じ。

scala> val items = List("sord","spear","bow")
items: List[String] = List(sord, spear, bow)
scala> val messages = for(item <- items) yield "this is " + item
messages: List[String] = List(this is sord, this is spear, this is bow)

以上