단일 오브젝트 (Object)
클래스와 메서드 설명할 때 잠깐 언급했던 오브젝트에 대해 더 알아보겠습니다. 스칼라의 object
는 자바의 단일(singleton) 인스턴스와 비슷합니다. JVM 프로세스 전체에서 딱 하나의 인스턴스가 존재하며, 따로 인스턴스를 생성하지 않고도 멤버 메서드나 변수에 접근해 쓸 수 있습니다.
object StringUtils {
def isNullOrEmpty(s: String): Boolean =
s == null || s.trim.isEmpty
}
자바로 생각하자면, StringUtils.isNullOrEmpty
라는 정적(static) 메서드를 선언한 것과 비슷합니다.
동반(companion) 오브젝트
단일 오브젝트만 홀로 써도 되지만, 똑같은 이름의 클래스와 더불어 쓸 때도 있습니다. 어떤 클래스와 오브젝트가 서로 이름이 같다면, 그 오브젝트를 동반(companion) 오브젝트라 부릅니다. 마찬가지로, 해당 클래스를 그 오브젝트의 동반 클래스라고 부릅니다. 동반 클래스나 오브젝트는 서로의 프라이빗(private) 멤버에 접근할 수 있습니다.
class Car(val cc: Int) {
import Car._
def taxPerYear: Int = taxPerCc(cc).intValue * cc
}
object Car {
// 배기량에 따른 cc당 자동차세 + 교육세 30%
private def taxPerCc(cc: Int) =
(if cc <= 1000 then 80
else if cc <= 1600 then 140
else 200) * 1.3
}
val car = new Car(2000)
car.taxPerYear // => 520000
이 예제에서 Car
라는 같은 이름으로, 동반 클래스와 오브젝트를 준비했고, 동반 오브젝트에 있는 taxPerCc
라는 프라이빗 메서드를, 동반 클래스에서 호출했습니다.