코틀린에서 클래스는 자바와 마찬가지로 class 키워드를 통해 선언합니다
클래스의 멤버는 생성자, 변수, 함수, 클래스로 구성되고
코틀린의 생성자는 constructor라는 키워드로 선언하는 함수입니다
그리고 코틀린에서는 클래스 내에 클래스를 선언할 수 있습니다
class DevelUser{
var name = "Devel"
constructor(name: String){
this.name = name
}
fun TestFun(){
println("name : $name")
}
}
자바의 경우에 멤버가 없고 선언부만 있는 클래스는 의미가 없지만
코틀린에서는 클래스의 생성자를 본문이 아닌 선언부에 작성할 수 있기 때문에
본문이 없는 클래스도 의미가 있습니다
코틀린에서 객체를 생성할때 new 키워드를 사용하지 않습니다
위에서 만든 DevelUser 객체를 만들 때 클래스의 이름으로 생성을 합니다
val user = DevelUser("devel")
user.TestFun()
주 생성자
class DevelUser constructor(){} // 주 생성자 선언
class DevelUser(){} // constructor 키워드 생략 예
class DevelUser{} // 매개변수가 없는 주 생성자 자동 선언
class DevelUser(name: String, data: Int){} // 매개변수가 있는 주 생성자
코틀린 클래스는 생성자를 주생성자와 보조 생성자로 구분합니다
한 클래스 안에 주생성자만 선언할 수도 있고 보조 생성자만 선언할 수도 있습니다
또한 둘다 선언하여 사용할 수도 있습니다
주 생성자라는 말이 처음에 아리송한데 class 키워드 옆에 클래스의 이름에
매개변수 및 constructor가 붙는 게 주 생성자라고 이해하시면 될 거 같습니다
주생 성자는 init 키워드를 이용해서 본문을 구현할 수 있습니다
init 영역은 반드시 선언되어야 되는 부분은 아니지만 본문을 구현할 때 사용합니다
class DevelUser(name: String, data: Int){
init{
println(" init in... ")
}
}
fun main(){
val user = DevelUser("devel", 30);
}
위에 코드는 실행하면 init in..이라는 문구를 출력하게 됩니다
init은 사용할 때 주의해야 하는 점이 생성자의 매개변수는 지역변수이기 때문에
클래스 내의 다른 함수에서 사용할 수 없다는 것입니다
class DevelUser(name: String, data: Int){
init{
println("name : $name, data : $data") // 성공!!!
}
fun TestFun(){
println("name : $name, data : $data") // 에러!!!
}
}
위에서 처럼 주생성자의 매개변수는 init 외에 접근할 수 없습니다
다른 함수에서 매개변수에 접근해야 한다면 다음과 같은 방법을 사용합니다
class DevelUser(name: String, data: Int){
var name: String
val data: Int
init{
this.name = name
this.data = data
}
}
init에서 클래스 내의 var,val로 매개변수를 대입하여 사용하게 되면
다른 함수에서도 매개변수의 값을 사용할 수 있습니다
또 다른 방법으로는 주생성자 매개변수에 타입을 지정해주는 방법입니다
class DevelUser(val name: String, var data: Int){
fun TestFun(){
println("name : $name, data : $data")
}
}
위 코드처럼 매개변수에 val, var 키워드를 통해 주생성자를 구성하게 되면
클래스 내의 함수에서 매개변수에 접근이 가능합니다
'언어 > 코틀린' 카테고리의 다른 글
[Kotlin] 널 안전성이란? (2) | 2022.07.20 |
---|---|
[Kotlin] 조건문 When (2) | 2022.06.13 |
[Kotlin] 함수 선언 (2) | 2022.06.13 |
[Kotlin] 데이터 타입 (2) | 2022.06.10 |
[Kotlin] 변수 선언 (1) | 2022.06.10 |
댓글