본문 바로가기
Data Platform/Scala

companion class와 companion object이 차이점은?

by 태하팍 2025. 3. 31.
반응형


companion  obejct만 알고 있었는데 갑자기 companion class라는게 나와서..
갑자기 머릿속에서 헷깔림이라는게 찾아왔습니다..;;

우선! 스칼라에서 헷깔리만한 친구들을 정리해보자!

용어 정리

용어 정의
class 일반 클래스, 인스턴스를 직접 만들 수 있음
case class 데이터 중심 클래스, 불변성과 편의 기능 자동 제공
companion class companion object랑 짝인 class (클래스 이름이 동일)
companion object와 이름이 같고, 같은 파일에 있는 클래스
object 싱글톤 객체, 인스턴스 없음, 전역 유틸/설정 용
companion object class랑 같은 이름, 같은 파일에 있는 object
apply, unapply object에 정의되는 팩토리/패턴 매칭 기능

* companion class는 특별한 문법이 있는게 아니라 그냥 companion object의 짝인 class를 부르는 이름!

예제) 아래의 소스에서 class MyClass는 companion class / object MyClass는 companion object!!
짝궁 관계라서 서로의 private 멤버에 접근이 가능!
결론적으로 class랑 companion class는 같습니다! 단, companion object가 있다면 해당 class를 companion class라고 부릅니다.
그래서 class&object비교에서 class의 특징이 companion class의 특징이 된다~라고 보시면 됩니다.

class MyClass(val name: String) {
  private def secret = "태하팍의 비밀은.."
}

object MyClass {
  def create(name: String): MyClass = new MyClass(name)

  def hack(c: MyClass): String = c.secret  // private 멤버 접근 가능!
}

class&object 비교

항목 class case class companion object object
인스턴스 생성 new 필요 new 없이 생성 가능 (Person("태하팍")) X 생성 안 함 (singleton) X
목적 객체 설계(붕어빵틀) 데이터 모델 + 패턴 매칭 helper 함수/팩토리 전역 상수/설정/함수 등
자동 생성 X equals, hashCode, toString, apply
등 자동 생성
X X
불변성 선택  불변(default) N/A N/A
패턴 매칭 X case 문에서 사용 가능 unapply 구현 시 가능 가능
팩토리 메서드 수동 구현 필요 apply 자동 생성됨 보통 apply, props, 헬퍼함수 제공 유틸 제공
스코프 접근 일반 클래스처럼 동작 일반 클래스처럼 동작 class의 private 멤버 접근 가능 전역적
예시 new User("태하팍") Person("태하팍") User.props() Config.MaxValue

같이 묶어서 이해하면 좋은 조합

조합 용도
case class + object 패턴 매칭용 메시지 (case class Hello(user: String) + object Hello)
class + companion object Actor, DB Entity, API 모델 등
object 단독 설정값, 전역 상수, 유틸리티 함수 묶음 (object MathUtils)


예제로 이해 마무리!

예제_class+companin object(feat. Akka)

class MyActor(name: String) extends Actor

object MyActor {
  def props(name: String): Props = Props(new MyActor(name))
}

예제_case class + pattern 매칭

case class Hello(user: String)

val msg = Hello("태하팍")

msg match {
  case Hello(name) => println(s"Hello, $name")
}

예제_단일 obejct(유틸성 코드)

object Config {
  val MaxConnections = 10
}

리마인드

class → 내가 직접 만들어서 쓰는 설계도(붕어빵틀 알쥬?)
case class → 데이터를 담기 위한 class (자동 기능들 덤!)
object → 전역에서 하나만 존재(싱글톤)하는 객체 (설정, 유틸, 헬퍼 함수용)
companion object → 클래스랑 이름 짝 맞춰서, 팩토리/유틸 헬퍼 담당
apply → 클래스 대신 ()로 인스턴스 생성 가능!
unapply → 패턴 매칭 지원

타이틀인 companion class와 companion object이 차이점은? 
이해완료! 쌉가능! ㅋㅋ

다시 Akka Actor 정리하러 고고!

 

반응형