description
코틀린 클래스
1. 코틀린의 클래스는 자바와 마찬가지로 기본 public입니다.
2. 코틀린의 클래스 프로퍼티는 초기화해주어야 합니다. 그렇지 않은 경우 컴파일 에러가 발생합니다.
3. 멤버 가시성
클래스 내부의 멤버(프로퍼티, 메서드)마다 가시성이 설정 가능합니다.
public: 멤버를 어디서나 볼 수 있습니다.
internal: 컴파일 모듈 내부에서만 멤버를 볼 수 있습니다.
protected: 멤버가 속한 클래스와 그 하위 클래스에서만 볼 수 있습니다. (패키지 수준에서 protected X)
private: 멤버가 속한 클래스에서만 볼 수 있습니다.
4. 내포된 클래스
클래스 안에 클래스를 선언할 수 있습니다.
class Person2(val id: Id, val age: Int) {
class Id(val firstName: String, val familyName: String)
fun showMe() = println("${id.firstName} ${id.familyName}: $age")
}
fun main () {
val id = Person2.Id("John", "Doe")
val person = Person2(id, 25)
person.showMe()
}
5. 내부 클래스
내포된 클래스에 inner를 선언하면 내부 클래스가 되어 내부 인스턴스가 외부 인스턴스 1개에 속하게 됩니다.
내부 인스턴스는 자신이 소속된 외부 인스턴스의 멤버에 접근할 수 있습니다.
내부 인스턴스 생성 시에 자신이 소속된 외부 인스턴스를 명시해야 합니다.
this@Person2 처럼 소속된 외부 인스턴스로 접근할 수 있습니다.
class Person2(val firstName: String, val familyName: String) {
inner class Possession(val description: String){
fun showOwner() = println(fullName())
fun getOwner() = this@Person2
}
private fun fullName() = "$firstName $familyName"
}
fun main () {
val person2 = Person2("John", "Doe")
val wallet = person2.Possession("wallet")
wallet.showOwner()
}
6. 지역 클래스
함수 내에 클래스를 정의할 경우 이를 지역 클래스라고 부릅니다.
지역 클래스는 자신을 둘러싼 코드의 멤버에 접근 가능합니다.
fun main () {
var x = 1
class Counter{
fun increment() {
x++
}
}
Counter().increment()
println(x) //2
}
코틀린 생성자
1. 주 생성자
클래스의 머리부분을 함수처럼 선언하여 생성자를 정의합니다. 이렇게 정의하는 생성자는 1개만 가능하므로 주 생성자라고 부릅니다.
class Person2(firstName: String, familyName: String){
}
주생성자 파라미터는 프로퍼티 초기화나, init블록 안에서만 사용할 수 있습니다. 클래스 안의 메서드에서는 사용이 불가능합니다.
* init 블록
하나의 식으로 표현하기 힘든 초기화 로직을 실행해야 할 때 사용하는 블록입니다.
주 생성자 파라미터는 val이나 var을 붙이면 프로퍼티로 만들 수 있습니다.
앞선 예시에서 컴파일오류가 발생하였지만, val, var을 입력한 이후에는 메서드 안에서도 사용가능한 프로퍼티가 되어 컴파일 오류가 발생하지 않습니다.
2. 부 생성자
하나 이상의 생성자를 정의하고 싶을 때는 fun 함수 대신 constructor라는 예약어로 추가 생성자를 정의합니다.
참고로 자바에서 this연산자로 다른 생성자를 호출할 수 있었는데 코틀린의 경우는 ":" 이후에 this 연산자를 사용해야 합니다. 추가적으로 주생성자와 부생성자가 같이 존재한다면, 부생성자에서 반드시 주생성자를 호출하도록 구현해야 합니다.
'프로그래밍 언어 > Kotlin' 카테고리의 다른 글
[Kotlin] 프로퍼티 (0) | 2022.10.11 |
---|---|
[Kotlin] null 정리 (0) | 2022.10.11 |
[Kotlin] 코틀린 함수 (1) | 2022.10.08 |
[Kotlin] 코틀린 문자열과 배열 (1) | 2022.10.08 |
[Kotlin] 코틀린 기본 타입 (1) | 2022.10.07 |