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 정리하러 고고!

'Data Platform > Scala' 카테고리의 다른 글
case class와 companion object 그리고 case object (0) | 2025.03.31 |
---|---|
Scala를 처음 접하는 초보자를 위한 입문 가이드_01 (0) | 2025.03.21 |
couchbase와 같은 키/벨류의 key design?? (0) | 2016.04.15 |
(기초) 스칼라 데이터 구조(컬렉션) (0) | 2016.03.25 |
(기초) 스칼라 문법 (0) | 2016.03.25 |