Closed lminsu closed 3 weeks ago
예제 코드
// Car 클래스 정의
// company는 생성자 파라미터, model은 생성자 파라미터이자 프로퍼티
class Car(company: String, val model: String) {
// 프로퍼티(멤버 변수)
private var speed: Int = 0
// 초기화 블록
init {
// 초기화 블록에서는 생성자 파라미터인 company 사용할 수 잆음(물롬 프로퍼티인 model도 사용 가능함)
println("A $company $model has been created.")
}
// 멤버 함수(메소드)
fun accelerate(increment: Int) {
speed += increment
println("The $model accelerates to $speed km/h.")
}
fun updateSpeed(speed: Int) {
this.speed = speed // 파라미터의 이름(speed)와 프로퍼티의 이름(speed)가 같아서 this를 사용하여 구별
println("Updated speed of $model to $speed km/h.")
}
// 다른 자동차와 speed를 비교하는 함수
fun compareSpeedWith(otherCar: Car) {
if (this.speed > otherCar.speed) { // 여기서는 this를 사용해도 되고 안 해도 됨, if (speed > otherCar.speed) 와 동일함
println("This $model is faster than the ${otherCar.model}.")
} else if (speed < otherCar.speed) { // } else if (this.speed < otherCar.speed) { 와 동일
println("The ${otherCar.model} is faster than this $model.")
} else {
println("Both cars have the same speed.")
}
}
// 리턴 타입이 잇는 멤버 함수(메소드)
fun getCarInfo(): String {
return "Car Info: Model = $model, Speed = $speed km/h"
}
companion object {
// companion object 내에서도 함수 및 변수 정의 가능
fun createTeslaModelX(): Car {
return Car("Tesla", "Model X")
}
}
}
fun main() { // Car 타입의 인스턴스 생성 val myCar = Car("Toyota", "Camry") myCar.accelerate(20) // 속도를 20만큼 올리는 메소드 호출(0에서 20으로 변경됨) // named parameter를 사용하여 함수 호출, myCar.updateSpeed(60)와 동읾 myCar.updateSpeed(speed = 60) // 속도를 60으로 변경하는 메소드 호출(20에서 60으로 변경됨)
val carInfo = myCar.getCarInfo() // 리턴 타입이 있는 함수 호출
println(carInfo)
val otherCar = Car.createTeslaModelX() // companion object에 정의된 함수는 "Car."으로 호출 가능
myCar.compareSpeedWith(otherCar) // 다른 인스턴스와 spped를 비교하는 함수 호출
}
- 출력 로그
A Toyota Camry has been created. The Camry accelerates to 20 km/h. Updated speed of Camry to 60 km/h. Car Info: Model = Camry, Speed = 60 km/h A Tesla Model X has been created. This Camry is faster than the Model X.
- 개념 설명:
- Class
- `Car`는 class 예시
- 클래스를 보고 인스턴스를 생성할 수 있음
- 클래스는 `클래스로부터 생성된 인스턴스`를 설명하는 프로퍼티(멤버 변수)와 메소드(멤버 함수)들이 정의되어 있음
- Instance(object(객체)랑 같은 말)
- myCar는 Car 클래스의 인스턴스. 각각의 인스턴스는 각각의 상태를 가지고 있고, Car에 정의된 메소드들을 호출할 수 있음
- Constructor Parameter(생성자 파라미터)
- company와 model은 생성자 파라미터, 이것들은 Car 인스턴스가 생성될 때 필요한 것들임
- company와 다르게 model은 프로퍼티로도 사용됨(앞에 val이 붙어 있음), 클래스 내부 전체에서 사용 가능
- company는 model과 다르게 프로퍼티가 아님(앞에 val이 없음), init 블록 내에서만 사용 가능함
- init 블록
- init 블록은 인스턴스가 생성된 직후 바로 수행됨
- 여기서는 Log를 찍고 있음
- 생성자 파라미터랑 프로퍼티들을 사용할 수 있음(여기서는 companyk model, speed)
- ⚠️ 만약 speed가 init 블록 밑에 정의되어 있었으면 init 블록 안에서 사용 못함, init 블록 위에 정의된 프로퍼티들만 init 블록에서 사용 가능
- Property(member variable, 멤버 함수)
- model: val(value)로 선언된 프로퍼티, class 안, 밖에서 전부 사용 가능, 값은 못 바꿈
- speed: private var(variable)로 선언되 프로퍼티, 클래스 안에서만 사용 가능, 값 바꿀 수 있음
- Method(member function)
- accelerate(increment: Int)
- 자동차의 스피드를 주어진 숫자만큼 증가시키는 함수
- updateSpeed(speed: Int)
- 주어진 파라미터로 받은 speed를 자신의 speed로 업데이트하는 함수(파라미터와 프로퍼티를 구분하기 위해 this를 사용함)
- compareSpeedWith(otherCar: Car)
- 파라미터로 받은 Car 인스턴스의 speed와 자신의 speed를 비교하는 함수
- getCarInfo(): String
- 리턴 타입이 있는 함수
- 자신의 프로퍼티들의 값들을 설명하는 String을 리턴함
- Companion Object
- Car 인스턴스가 아닌 Car 클래스에 속해 있는 함수
- createTeslaModelX() 함수는 Car 인스턴스를 생성하지 않아도 호출될 수 있음
- createTeslaModelX()는 테슬라 모델 X의 정보를 가지고 있는 Car 인스턴스를 생성 후 리턴