딱 하나의 인스턴스만 있는 클래스 오브젝트이다.

참조될때 뒤늦게 lazy val 로 생성된다. 선언됐다고 만들어지는게 아니라 한번이라도 참조되어야 만들어진다.

탑레벨 값이고 오브젝트 하나가 singletone이다.

클래스로 감싸진 형태이거나 지역변수있을때, 정확히 lazy val로 동작한다

Defining a singletone object

object Box

object Logger:
  def info(message: String): Unit = println(s"INFO: $message")

info는 어디서든 임포트 될수 있다. utility 메소드를 만드는 것은 흔한 사용 사례이다.

다른 패키지에서 info를 쓰는 방법은 아래 예시 참고

import logging.Logger.info

class Project(name: String, daysToComplete: Int)

class Test:
  val project1 = Project("TPS Reports", 1)
  val project2 = Project("Website redesign", 5)
  info("Created projects")  // Prints "INFO: Created projects"

import는 정적경로를 필요로 하는데(대상이 필요), 그리고 오브젝트가 바로 정적경로이다.

클래스 내부에 종속되어 있는 경우, 클래스의 경로에 의존한다.

Companion objects

오브젝트가 클래스와 똑같은 이름으로 있을때 컴패니언 오브젝트라고 한다. 동반 클래스나 오브젝트는 동반자의 private 멤버에 접근할 수 있다. 인스턴스에 한정되지 않는 메소드를 만들때 동반 클래스나 오브젝트를 사용한다.

import scala.math.pow

case class Circle(radius: Double):
  import Circle.*
  def area: Double = calculateArea(radius)

object Circle:
  private def calculateArea(radius: Double): Double = Pi * pow(radius, 2.0)

val circle1 = Circle(5.0)

circle1.area

._ or * : 전체를 호출할때 사용