is-a
: 상위 클래스의 전부를 가져와 하나의 클래스 처럼 사용has-a
: 내부적인 속성에서 객체를 만들어 사용약한 has-a
: 클래스 간 주종관계 없이 단순하게 사용강한 has-a
: 클래스 간의 주종관계가 있어 따로 분리해서 사용할 수 없는 관계사용 has-a
: 필요 클래스를 매개변수 등으로 받아 필요한 시점에 사용시나리오 - 학생, 대학교, 주소의 3가지 클래스
class Address(
val country: String,
val city: String
class College(
val collegeName: String,
val collegeAddress: Address
)
class Student(
val studentName: String,
val studentAddress: Address,
val studentCollege: College
)
시나리오 - 자동차, 엔진, 생성의 3가지 클래스, 자동차 생성시 엔진 생성을 강제
class CarProduct(color: String, maxSpeed: Int): Car(color, maxSpeed){
lateinit var carEngine: CarEngine
fun setCar(){
carEngine = CarEngine()
carEngine.startEngine()
}
}
open class Car(val color: String, val maxSpeed: Int) {
fun carInfo() { println("$color $maxSpeed $name") }
}
class CarEngine {
fun startEngine() { println("엔진 가동") }
fun stopEngine() { println("엔진 중단") }
}
시나리오 - 계좌, 고객 2가지 클래스로 고객이 계좌의 기능을 사용하는 관점
class Account(val accountNo: Int, var balance: Int=0) {
fun deposit(amount: Int){
balance += amount
}
}
class Customer(var balance: Int) {
fun makedeposit(acc: Account){
acc.deposit(balance)
}
}
class Person {
val gender: String
get() = "male$age"
var age: Int = 3
get() {
return field + 1
}
private set(value) {
field = value + 1
}
}
operator
예약어를 사용해서 연산자에 해당하는 메서드를 재정의 할 수 있음.data class Price(val value: Int) {
operator fun plus(b: Price): Price {
return Price(value + b.value)
}
}
테이블 참고
infix
키워드를 사용하여 정의해야 함.infix fun Int.add(x:Int):Int{
return this + x
}
println(3.add(5)) // 8
println(3 add 5) // 8
class 앞에 data
를 붙여 데이터 보관 목적으로 클래스를 생성할 수 있다.
data class User(val name: String, val age: Int)
특징은 다음과 같다
val
또는 var
으로 선언해야 한다.abstract
open
sealed
inner
를 붙일 수 없다.equals()
hashCode()
toString()
componentN()
copy()
를 자동으로 구성해준다.Data Class가 상속이 안되는 이유로는
equals()
를 제대로 정의할 수 없기 때문이다
class Task {
var state: State = State.WAITING
fun printState() =
when(state){
State.WAITING -> println("Waiting..")
State.PROCESSING -> println("Processing..")
State.DONE -> println("Task done")
}
enum class State {
WAITING, PROCESSING, DONE
}
}
;
로 속성의 선언이 끝났음을 명시해야한다enum class Color(val r: Int, val g: Int, val b: Int) {
RED(255, 0, 0), GREEN(0, 255, 0), BLUE(0, 0, 255),
WHITE(255, 255, 255), BLACK(0, 0, 0), YELLOW(255, 255, 0);
fun rgb(): String =
"0x"+String.format("%02x", r)+String.format("%02x", g)+String.format("%02x", b)
}
fun main(){
println(Color.RED.rgb()) // 0xff0000
}