4.クラスとオブジェクト


4.1クラス、フィールド、メソッド

class ChecksumAccumulator {
// 여기에서 클래스를 정의
// 멤버(member) : 클래스 내에 정의된 필드와 메소드
// 메소드는 def 로 정의하며 실행할 코드를 담는다.
    var sum = 0
}

// 클래스를 인스턴스화 할 때, 스칼라 런타임은 해당 객체의 상태 (각 변수들의 내용)을 담아둘 메모리를 확보

val acc = new ChecksumAccumulator
val csa = new ChecksumAccumulator

acc.sum = 3

  • メモリ内の各オブジェクトのシェイプは、次のようになります.


  • CheckSumccumulatorで定義されている和はvar(可変)であるため,後で他のInt値をsumに再割り当てることができる.
    ex ) acc.sum = 3

  • accはval(immutable)ですが、accが参照するオブジェクトの内部を変更できます.

  • accとcsaはval(immutable)であるため、他のオブジェクトを割り当てることはできません.
  • オブジェクトの堅牢性


    オブジェクトのステータスをインスタンスが存在するときに常に正しく維持します.
    $ cassTest.scala
    package com.ahnlab.scala
     
    class classTest{
      private var sum = 0           // 비공개 필드(private) 으로, 외부에서 직접 접근할 수 없다. 클래스 내부의 함수에서만 접근이 가능하다.
     
      def add(b: Byte): Unit = {    // 클래스 내부의 함수에서 비공개 필드 상태를 변경
        sum += b
      }
      def checksum(): Int = {       // 비공개 필드를 return
        return (sum & 0xFF)
      }
    }
    -----------------------------------
    $ test.scala
    package com.ahnlab.scala
     
    object test extends App{
      println("Hello, World!")
      val acc = new classTest
      val asc = new classTest
     
      acc.add(10)                   // 클래스 함수를 통해 sum 필드 변경
      println(acc.checksum())       // return 을 통해 sum을 확인할 수 있다.
     
    }
    Scaraは、メンバーを公開(public)として宣言するためにアクセス修飾子を定義しない.(Javaのpublic)基本アクセスレベルは完全公開です.

    スカラーのパラメータタイプ(val)

    class classTest{
      private var sum = 0          
      def add(b: Byte): Unit = {    # 파라미터 b 는 val로 기본으로 정의된다.
        b = 1  # 파라미터를 재정의하게 되면, 컴파일 에러가 발생.
        sum += b
      }

    スカラー推奨プログラミングスタイル

  • スカラーは、returnが明示的に使用されていなくても、メソッドの最後の計算値を返します.
    ->メソッドを最小の機能ユニットとして設計し、各機能を小さなモジュールに分割してプログラミングすることを推奨します.

    4.2セミコロン推論


    セミコロン(;)省略できます.
    1行に複数の文を入れるには、セミコロンで区切らなければなりません.
    val s = "hello"
    val a = "world"; println(a)
    
    -------
    x
    +y
    # 스칼라는 위 프로그래밍을 x와 +y로 파싱한다. 의도가 x + y라면, 아래와 같이 괄호로 감싸서 표현할 수 있다.
    (x
    +y)
    
    # 아래와 같이 +를 줄의 끝에 넣어서 표현할 수 있다. (스칼라는 줄 끝에 연산자 배치하는 게 일반적인 코딩 스타일 이다.)
    x +
    y +
    z

    セミコロン推論規則


    以下の3つの場合でなければ、セミコロンと同じ扱いになります.

  • 一部の行の末尾は、コマンドで終わる単語では終わりません.ピリオド(.)羅中尉演算子など行の末尾.

  • 次の行の一番前は冒頭にできない言葉で始まります.

  • 行(...)あるいは同じ括弧の間に,[...]同じ括弧の間で終了します.どうせこの場合、内部に複数の文章があるわけにはいかない.
  • 4.3モノトーンオブジェクト


    scalaクラスにはjavaとは異なる静的メンバーはありません.(静的変数、静的メソッド)
    代わりにモノトーンオブジェクト(Singleton object)が提供される.
    モノトーンオブジェクトは、キーワードobjectとして定義されます.
    単一の色調オブジェクトの名前がクラスと同じである場合、それはクラスの仲間オブジェクトであり、クラスは仲間クラスである.
    ただし、クラスとそれに伴うオブジェクトは、同じソースファイルで定義する必要があります.
    クラスと仲間オブジェクトは、相手のプライベートメンバーにアクセスできます.
    
    // 클래스 ChecksumAccumulator 정의
    class ChecksumAccumulator{
      private var sum = 0
      def add(b: Byte) = sum += b
      def checksum(): Int = return (sum & 0xFF)
    }
    
    
    // 싱글톤 객체 ChecksumAccumulator 정의
    object ChecksumAccumulator extends App{
      private val cache = mutable.Map.empty[String, Int]
      def calculate(s: String) : Int =
        if (cache.contains(s))
          cache(s)
        else {
          val acc = new ChecksumAccumulator    // 여기서의 ChecksumAccumulator 는 class이다. new는 클래스를 인스턴스화 할 때만 사용한다.
          for (c <- s)
            acc.add(c.toByte)
          val cs = acc.checksum()
          cache += (s -> cs)          // 한번 계산한 checksum을 캐싱하기 위한 변경 가능한 맵
          cs
        }
    }

  • 上記のcacheは、メモリを犠牲にすることで計算時間を節約し、パフォーマンスの問題を引き起こす可能性があります.(ただの例です)
    →通常、メモリの問題を解決できる場合は、キャッシュ、scalaを使用することをお勧めします.collection、jcl、WeakHashMapなどの弱いmapを使用することが望ましい.

  • モノトーンオブジェクトのメソッドは、Java静的メソッドと同様に呼び出すこともできます.

  • モノトーンオブジェクト名の後にポイントを付け、メソッド名を使用して呼び出すことができます.
    ChecksumAccumulator.calculate("test test")

  • シングルトーンオブジェクトは1階層定義タイプではありません.(スカラレベルの抽象では)
    →オブジェクト定義のみの場合、そのオブジェクトタイプのオブジェクトを作成できません.(パートナークラスを定義する必要があります.)

  • モノトーンオブジェクトは、スーパークラス拡張(extend)またはブレンドトレイ(mixin)を使用できます.

  • クラスとモノトーンオブジェクトの違い
    →モノトーンオブジェクトはパラメータを受け入れることができず、クラスは受け入れることができます.

  • コンパイラは、合成クラスの例としてモノトーンオブジェクトを実装し、静的変数によって参照します.
    →Checksumccumulatorモノトーンオブジェクト用に作成されたクラスの名前はChecksumccumulator$

  • 伴生クラスのないモノトーンオブジェクトを独立オブジェクト(独立モノトーンオブジェクト)と呼びます.
  • →必要なツール方法をまとめて使う
    →スカラーアプリケーションを作成するためのエントリポイント

    4.4スカラーアプリケーション


    スカラープログラムを実行するには、Array[Stringを一意のパラメータとして受信し、デバイスに戻るmainを含むmainという独立したモノトーンオブジェクトの名前を知る必要があります.
    // Summer 애플리케이션 정의
    
    
    import ChecksumAccumulator.calculate	// ChecksumAccumulator 객체의 calculate 메소드를 임포트한다.
    
    object Summer {
    	// 애플리케이션의 시작점
    	def main(args: Array[String]) = {
       	for (arg A- asgs)
           println(arg + ": " + calculate(arg))
       }
    }
    リファレンス
    Scaraはいつもjavalangおよびscalaパッケージのメンバーを暗黙的にインポートします.また、scalaパッケージのPredefというモノトーンオブジェクトのメンバーも常にインポートされます.
    (Predef.println, Predef.console, Predef.assert)
  • Summerアプリケーションを実行するには、Summerを使用します.scalaファイルとして保存
  • チェックサムアキュムレータを呼び出し、チェックサムアキュムレータとともにオブジェクトのチェックサムアキュムレータとして使用します.scalaという名前のファイル
  • に保存
    ※ScalaはJavaのように公開クラスやファイル名を作成することはできません.ただしjavaのように、クラス名とファイル名を同じ名前にすることをお勧めします.(プログラマーの仕事を便利にするために)
  • Summer.scalaまたはChecksumAccumator.scalaはスクリプトではないため、ファイルを実行できません.したがって、基本スカラーコンパイラscalacを使用します.
  • $ scalac ChecksumAccumulator.scala Summer.scala
    ※ただしコンパイル時間が遅い.コンパイラを起動するたびに、ソースコードを処理する前にjarファイルの内容を確認し、他の初期化操作を実行します...
    したがって、fcs(Fast Scala Compiler)と呼ばれるスカラーコンパイラデーモンを使用することができます.scalacまたはfscはJava Classファイルを生成します.
    Scala Infratorは、ScalaコードをJavaバイトコードにコンパイルし、クラスローダに読み込んで実行するメカニズムを使用します.
    $ fsc ChecksumAccumulator.scala Summer.scala
    mainメソッドを使用したSummerアプリケーションを実行できるようになりました.
    $ scala Summer of love

    4.5アプリケーショントレイ


    scalaはscalaですアプリケーショントレイを提供します.
  • トレイを使用するには、定義するモノトーンの後にextends Appとして宣言します.
  • mainメソッドを宣言するよりも、mainメソッドに挿入したいコードをextends Appと同じように宣言した単一トーンオブジェクトとして定義します.
  • import ChecksumAccumulator.calculate
    
    object FallWinterSpringSummer extends App {
    	for (season <- List("fall", "winter", "spring")) pr ntln(season + " + calculate(season))
    }