4.クラスとオブジェクト
4.1クラス、フィールド、メソッド class ChecksumAccumulator {
// 여기에서 클래스를 정의
// 멤버(member) : 클래스 내에 정의된 필드와 메소드
// 메소드는 def 로 정의하며 실행할 코드를 담는다.
var sum = 0
}
// 클래스를 인스턴스화 할 때, 스칼라 런타임은 해당 객체의 상태 (각 변수들의 내용)을 담아둘 메모리를 확보
val acc = new ChecksumAccumulator
val csa = new ChecksumAccumulator
acc.sum = 3
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
}
スカラー推奨プログラミングスタイル
->メソッドを最小の機能ユニットとして設計し、各機能を小さなモジュールに分割してプログラミングすることを推奨します.
4.2セミコロン推論
セミコロン(;)省略できます.
1行に複数の文を入れるには、セミコロンで区切らなければなりません.val s = "hello"
val a = "world"; println(a)
-------
x
+y
# 스칼라는 위 프로그래밍을 x와 +y로 파싱한다. 의도가 x + y라면, 아래와 같이 괄호로 감싸서 표현할 수 있다.
(x
+y)
# 아래와 같이 +를 줄의 끝에 넣어서 표현할 수 있다. (스칼라는 줄 끝에 연산자 배치하는 게 일반적인 코딩 스타일 이다.)
x +
y +
z
セミコロン推論規則
以下の3つの場合でなければ、セミコロンと同じ扱いになります.
val s = "hello"
val a = "world"; println(a)
-------
x
+y
# 스칼라는 위 프로그래밍을 x와 +y로 파싱한다. 의도가 x + y라면, 아래와 같이 괄호로 감싸서 표현할 수 있다.
(x
+y)
# 아래와 같이 +를 줄의 끝에 넣어서 표현할 수 있다. (스칼라는 줄 끝에 연산자 배치하는 게 일반적인 코딩 스타일 이다.)
x +
y +
z
一部の行の末尾は、コマンドで終わる単語では終わりません.ピリオド(.)羅中尉演算子など行の末尾.
次の行の一番前は冒頭にできない言葉で始まります.
行(...)あるいは同じ括弧の間に,[...]同じ括弧の間で終了します.どうせこの場合、内部に複数の文章があるわけにはいかない.
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
}
}
// 클래스 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 애플리케이션 정의
import ChecksumAccumulator.calculate // ChecksumAccumulator 객체의 calculate 메소드를 임포트한다.
object Summer {
// 애플리케이션의 시작점
def main(args: Array[String]) = {
for (arg A- asgs)
println(arg + ": " + calculate(arg))
}
}
※ScalaはJavaのように公開クラスやファイル名を作成することはできません.ただしjavaのように、クラス名とファイル名を同じ名前にすることをお勧めします.(プログラマーの仕事を便利にするために)
$ 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ですアプリケーショントレイを提供します.
import ChecksumAccumulator.calculate
object FallWinterSpringSummer extends App {
for (season <- List("fall", "winter", "spring")) pr ntln(season + " + calculate(season))
}
Reference
この問題について(4.クラスとオブジェクト), 我々は、より多くの情報をここで見つけました https://velog.io/@dev_jhjhj/4.-클래스와-객체テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol