객체 지향 프로그래밍에서 특정 객체를 생성하기 위해 변수와 메소드를 정의하는 일종의 틀.
Kotlin의 클래스는
class
키워드를 사용하여 선언한다.
// 클래스 선언
class Car { /*...클래스의 본문...*/ }
// 헤더와 본문이 생략된 경우
class Empty
클래스의 이름
, 클래스 헤더(유형 매개변수, 기본 생성자 및 기타 항목 지정)
및 중괄호로 묶인 클래스 본문
으로 구성된다. 인스턴스는 클래스를 통해 만들어낸 서로 다른 속성의 객체이다.
new
키워드를 사용하지 않는다.인스턴스를 생성하려면, 일반 함수를 호출하듯 클래스의 생성자를 호출하면 된다.
class Car(val name: String, var price: Int)
class Music
val car1 = Car("cayenne", 15000)
val car2 = Car("santaFe", 3500)
val music1 = Music()
val music2 = Music()
클래스는 다음과 같은 것들을 포함할 수 있으며, 이를 클래스의 멤버라고 한다.
변수명.속성명
,변수명.함수명
등 의 형태로 클래스의 멤버를 사용할 수 있다.
class Car(var name: String, var price: Int) {
fun introduce() {
println("이 차는 $name 이고, 가격은 $price 만원 입니다.")
}
fun discount() {
price -= 1000
}
}
fun main() {
val car1 = Car("cayenne", 15000)
val car2 = Car("santaFe", 3500)
car1.name = "cayenne coupe"
car2.price = 3700
car1.discount()
car1.introduce()
car2.introduce()
}
객체 지향 프로그래밍에서 객체가 생성될 때 초기화시켜주는 함수를 의미한다.
class Constructor() { /*...*/ }
void
도 아니다.파라미터나 반환형이 없는 특수한 함수로, 생성자를 통해 인스턴스가 만들어 질 때 호출된다.
class Car(var name: String, var brand: String) {
init {
println("${this.brand}의 차 ${this.name}이 생성되었습니다.")
}
}
fun main() {
val car1 = Car("cayenne", "porsche")
val car2 = Car("santaFe", "hyundai")
}
this
: 인스턴스 자신의 속성이나 함수를 호출하기 위해 클래스 내부에서 사용되는 키워드.클래스 헤더의 일부이며, 클래스 이름 뒤에 작성한다.
class Person constructor(firstName: String) { /*...*/ }
class Person(firstName: String) { /*...*/ }
constructor
키워드를 생략할 수 있다.private
, protected
, internal
, public
init
키워드가 있는 초기화 블록(initializer blocks) 에 배치할 수 있다.var
혹은 val
이다.기본 생성자의 파라미터는 초기화 블록과 클래스 본문에 선언된 속성의 이니셜라이저에서 사용할 수 있다.
class Car(var name: String, var brand: String) {
init {
println("${this.brand}의 차 ${this.name}이 생성되었습니다.")
}
val uppercaseBrand = brand.uppercase()
}
fun main() {
val myCar = Car("santaFe", "hyundai")
println(myCar.uppercaseBrand)
}
// 출력
hyundai의 차 santaFe이 생성되었습니다.
HYUNDAI
기본 생성자는 클래스 속성의 기본값을 포함할 수 있다.
class Car(var name: String, var brand: String = "kia") {
init {
println("${this.brand}의 차 ${this.name}가 생성되었습니다.")
}
val uppercaseBrand = brand.uppercase()
}
fun main() {
val myCar = Car("EV6")
println(myCar.uppercaseBrand)
val secondCar = Car("AVANTE", "hyundai")
println(secondCar.uppercaseBrand)
}
// 출력
kia의 차 EV6가 생성되었습니다.
KIA
hyundai의 차 AVANTE가 생성되었습니다.
HYUNDAI
기본 생성자와 다른 형태의 생성자를 제공하여, 인스턴스 생성시 편의를 제공하거나 추가적인 구문을 수행할 수 있도록 한다.
class Car(var name: String, var brand: String) {
init {
println("초기화 블록: ${this.brand}의 차 ${this.name} 생성되었습니다.")
}
constructor(name: String, modelYear: Int) : this(name, "kia") {
println("보조생성자1: $modelYear ${this.name} 입니다.")
}
constructor() : this("알수없음", "알수없음") {
println("보조생성자2: 차량의 정보를 다시 입력해주세요.")
}
constructor(modelYear: Int) : this("k5", modelYear) {
println("보조생성자3: 연식을 이용하여 차량을 생성했습니다.")
}
}
fun main() {
val car1 = Car("AVANTE", "hyundai")
val car2 = Car("EV6", 2023)
val car3 = Car()
val car4 = Car(2018)
}
// 출력
초기화 블록: hyundai의 차 AVANTE 생성되었습니다. // car1
초기화 블록: kia의 차 EV6 생성되었습니다. //car2
보조생성자1: 2023 EV6 입니다. // car2
초기화 블록: 알수없음의 차 알수없음 생성되었습니다. // car3
보조생성자2: 차량의 정보를 다시 입력해주세요. // car3
초기화 블록: kia의 차 k5 생성되었습니다. // car4
보조생성자1: 2018 k5 입니다. // car4
보조생성자3: 연식을 이용하여 차량을 생성했습니다. // car4
constructor
키워드를 통해 보조 생성자를 선언한다.동일한 클래스의 다른 생성자에 대한 위임은
this
키워드를 사용한다.
this(name, "kia")
를 통해 기본 생성자 에게 위임.this("알수없음", "알수없음")
를 통해 기본 생성자 에게 위임.this("k5", modelYear)
를 통해 보조생성자1 에게 위임.클래스에 기본 생성자가 없더라도 위임은 암시적으로 발생하며 이니셜라이저 블록 또한 실행된다.
class Constructors {
init {
println("Init block")
}
constructor(i: Int) {
println("Constructor $i")
}
}
fun main() {
val a = Constructors(5)
}
// 출력
Init block
Constructor 5
🔗 reference1
🔗 reference2