클래스 관계
- 상속관계(
is-a
) : 클래스를 상속해서 하나의 클래스 처럼 사용.
- 연관관계(
has-a
) : 클래스를 상속하지 않고 내부적인 속성에 객체를 만들어서 사용.
- 결합관계(
약한 has-a
) : 연관관계를 구성하는 방식 중 클래스 간 주종관계 없이 단순하게 사용하는 관계.
- 조합관계(
강한 has-a
) : 연관관계를 구성하는 방식 중 클래스 간의 주종관계가 있어 따로 분리해서 사용할 수 없는 관계
결합(Aggregation)관계
- 약한 has-a 관계임
- 단순하게 사용될 클래스의 객체를 속성으로 만들어 사용함.
- 클래스간 동일한 생명주기일 필요는 없음.
- 즉, 한 클래스의 객체가 소멸해도 다른 클래스의 객체는 계속 활용할 수 있음.
fun main() {
val collegeAddress: Address = Address(country = "대한민국", "관악구")
val college: College = College("서울대", collegeAddress)
println(college)
}
data class Address(
val country: String,
val city: String
data class College(
val collegeName: String,
val collegeAddress: Address
)
실행결과
College(collegeName=서울대, collegeAddress=Address(country=대한민국, city=관악구))
조합(Composition)관계
- 결합관계보다 더 결합이 강한 관계임.
- 두 클래스는 주종 관계이고, 생명주기도 동일함.
- 즉, 두 클래스는 항상 같이 생성되고, 같이 소멸하는 구조일 경우에만 사용함.
fun main() {
val myCar = Car(
color = "Red",
maxSpeed = 3000,
name = "Ray"
)
myCar.carEngine = CarEngine()
myCar.run {
carEngine.startEngine()
carInfo()
carEngine.stopEngine()
}
}
class CarEngine {
fun startEngine() { println("엔진 가동") }
fun stopEngine() { println("엔진 중단") }
}
class Car(val color: String, val maxSpeed: Int, val name: String) {
lateinit var carEngine: CarEngine // 필드 주입
fun carInfo() { println("$color $maxSpeed $name") }
}
실행결과
엔진 가동
Red 3000 Ray
엔진 중단
의존(Dependency)관계
- 한 클래스가 다른 클래스의 기능이다 행동에 의존하고 있을 나타내는 관계임.
class CPUx86() {
fun process() { ... }
}
class Computer() {
val cpu = CPUx86()
fun start() {
cpu.process() { ... }
}
}
- Computer 클래스는 CPUx86 클래스에 의존하고 있음.
- Computer 클래스는 CPUx86 클래스 생성에 대한 책임을 가지고있음.
- 위 코드는 높은 결합도를 유지하고 있음.
- CPUx86 클래스의 변경에 Computer 클래스도 변경됨.
- 즉, 높은 결합도는 작은변경에도 많은 영향을 주는 것임.