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