【Scala】Scala ~ 基本編 / クラス ~

■ はじめに

https://dk521123.hatenablog.com/entry/2023/03/10/193805
https://dk521123.hatenablog.com/entry/2023/03/12/184331

の続き。

今回は、クラス周辺について扱う。

試す環境
https://scastie.scala-lang.org/CEpZy3v4Taa0MCStp3LCYg

目次

【1】クラス
【2】抽象クラス
【3】ケースクラス
【4】継承
【5】トレイト - Trait
【6】シングルトンオブジェクト - object
【7】implicit

【0】Javaとの違い

色々変わっとる、、、

* Interface がなくなった(代わりに「【4】トレイト - Trait」)

【1】クラス

https://scala-text.github.io/scala_text/class.html

1)構文

class <クラス名> '(' (<引数名1> : <引数型1>, <引数名2>: <引数型2> ...)? ')' {
  (<フィールド定義> | <メソッド定義> )*
}

2)コンストラク

// コンストラクタで値を設定する場合は、クラス名の後ろの()内にフィールドを定義
class ClassExample(val x: Int, var y: Int, z: Int = 0) {

https://qiita.com/takudo/items/8731612acbe7eae83183

3)アクセス権限

* Javaと比べてパッケージやクラスレベルでの詳細なアクセス権限が設定できる
名前 キーワード 説明
公開(public) なし どこからでも参照可能
非公開 private それを定義しているクラス、オブジェクト内からのみ参照可能
限定公開 protected それを定義しているサブクラスからのみ参照可能
スコープ指定非公開 private[scope] scopeはアクセス可能
スコープ指定限定公開 protected[scope] 対象のサブクラスとscopeはアクセス可能

4)メソッド

* 以下の関連記事を参照のこと。

Scala ~ 基本編 / メソッド ~
https://dk521123.hatenablog.com/entry/2023/03/03/000000

5)サンプル

// クラス定義
class DemoClass(val id: Int, var name: String,val age: Int = 30) {
  val HELLO = "Hello"
  var greeting: String = "Hi"

  // メソッド定義(def)
  def sayHello(): String = {
    s"Hello, ${this.name}"
  }
}

// 呼び出し側
val obj = new DemoClass(1, "Mike")
// id=1, name=Mike, age=30
println(s"id=${obj.id}, name=${obj.name}, age=${obj.age}")
println(obj.sayHello())

【2】抽象クラス

// クラスの前にabstract 修飾子をつける
abstract class DemoAbstract Class {

【3】ケースクラス

1)普通のクラスとの違い

[1] new を使わなくても生成可能
[2] 指定しなくても基本コンストラクタのフィールドにvalが付与
[3] 自動的に equals/canEqual/hashCode/toString/copy() を実装
[4] コンパニオンオブジェクトを自動生成し、apply/unapply()を自動実装

https://qiita.com/chimeiwang/items/b776c032bc4d4b687c32

【4】継承

1)構文

class <クラス名> <クラス引数> (extends <スーパークラス>)? (with <トレイト名>)* {
  (<フィールド定義> | <メソッド定義>)*
}

2)継承させない - final

final class ClassName

【5】トレイト - Trait

* traitキーワードで定義

cf. trait = 特性

https://scala-text.github.io/scala_text/trait.html

1)構文

trait <トレイト名> {
  (<フィールド定義> | <メソッド定義>)*
}

2)サンプル

trait Person {
  val name: String
  def sayHello(): Unit = print()
}

3)用語整理:ミックスイン(Mix-in)とは?

* クラスがトレイトを継承すること

4)注意

* クラスパラメータ(コンストラクタの引数)を取ることができない
* 通常クラスのようにコンストラクタを持つことはできない

【6】シングルトンオブジェクト - object

https://scala-text.github.io/scala_text/object.html

1)構文

object <オブジェクト名> extends <クラス名> (with <トレイト名>)* {
  (<フィールド定義> | <メソッド定義>)*
}

【7】implicit

* 以下の関連記事を参照のこと。

Scala ~ 基本編 / メソッド ~
https://dk521123.hatenablog.com/entry/2023/03/03/000000

関連記事

Scala ~ 環境構築編 ~
https://dk521123.hatenablog.com/entry/2023/03/10/193805
Scala ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2023/03/12/184331
Scala ~ 基本編 / メソッド ~
https://dk521123.hatenablog.com/entry/2023/03/03/000000
Scala ~ 基本編 / コレクション ~
https://dk521123.hatenablog.com/entry/2023/03/13/000345
ScalaYAML
https://dk521123.hatenablog.com/entry/2023/03/16/012034