싱글턴 객체

싱글턴 객체

Scala에서 object 키워드로 만드는 것은 싱글턴(Singleton) 객체예요. 다시 말해, 객체는 정확히 하나의 인스턴스만 갖는 클래스를 정의해요. 객체는 마치 클래스 정의와 그 클래스의 유일한 인스턴스를 한 번에 만드는 것 같은 느낌이죠.

출처: Scala 3 Book — Singleton Objects

본문

Scala에서 object 키워드는 싱글턴 객체를 만들어요. 다시 말해, 객체는 정확히 하나의 인스턴스를 가진 클래스를 정의해요.

객체는 여러 용도로 쓰여요.

  • 유틸리티 메서드들의 모음(collection)을 만드는 데 쓰여요.
  • 컴패니언 객체(companion object)는 같은 파일을 공유하는 클래스와 같은 이름을 가진 객체예요. 이 상황에서 그 클래스는 컴패니언 클래스(companion class)라고 불러요.
  • 트레이트를 구현해서 모듈(module)을 만드는 데 쓰여요.

"유틸리티" 메서드

object는 싱글턴이므로 그 메서드는 Java 클래스의 static 메서드처럼 접근할 수 있어요. 예를 들어 이 StringUtils 객체는 문자열 관련 메서드들의 작은 모음이에요.

object StringUtils:
  def isNullOrEmpty(s: String): Boolean = s == null || s.trim.isEmpty
  def leftTrim(s: String): String = s.replaceAll("^\\s+", "")
  def rightTrim(s: String): String = s.replaceAll("\\s+$", "")

StringUtils는 싱글턴이므로 그 메서드를 객체에 직접 호출할 수 있어요.

val x = StringUtils.isNullOrEmpty("")    // true
val x = StringUtils.isNullOrEmpty("a")   // false

컴패니언 객체

컴패니언 클래스나 객체는 자기 컴패니언의 private 멤버에 접근할 수 있어요. 컴패니언 클래스의 인스턴스에 특정되지 않은 메서드와 값에는 컴패니언 객체를 사용해요.

이 예시는 컴패니언 클래스의 area 메서드가 컴패니언 객체의 private calculateArea 메서드에 접근하는 방식을 보여줘요.

import scala.math.*

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   // Double = 78.53981633974483

트레이트로 모듈 만들기

객체는 트레이트를 구현해서 모듈을 만드는 데도 쓰일 수 있어요. 이 기법은 두 트레이트를 가져다가 결합해 구체적인 object를 만들어요.

trait AddService:
  def add(a: Int, b: Int) = a + b

trait MultiplyService:
  def multiply(a: Int, b: Int) = a * b

// implement those traits as a concrete object
object MathService extends AddService, MultiplyService

// use the object
import MathService.*
println(add(1,1))        // 2
println(multiply(2,2))   // 4

더 알아보기