https://developer-syubrofo.tistory.com/354 포스팅에서 코틀린 파일 타입에 대해서 알아 보았습니다. 각 타입별로 상세하게 내용을 다루기 위해 개별 포스팅을 진행합니다. 이번 시간에는 class에 대해서 알아 보겠습니다.
클래스 선언과 생성자
[클래스 선언]
자바와 같이 키워드는 class를 사용하여 선언합니다.
class Person { /*...*/ }
클래스 선언은 클래스 이름, 클래스 헤더(유형 매개변수, 기본 생성자 및 기타 몇 가지 지정) 및 중괄호로 둘러싼 클래스 body으로 구성됩니다. 헤더와 본문은 모두 선택 사항입니다. 클래스에 body가 없으면 중괄호를 생략할 수 있습니다.
class Empty
자바는 기본적으로 중괄호를 이용한 클래스 body가 필수적인데, kotlin과 대비되는 부분입니다.
[생성자]
클래스는 한 개의 기본 생성자와 한 개 이상의 보조 생성자를 가질 수 있습니다. 기본 생성자는 클래스 헤더에 선언되며 클래스 이름과 선택적 매개변수 뒤에 옵니다.
class Person constructor(firstName: String) { /* ... */ }
💡 클래스 헤더란?
클래스 이름과 뒤따르는 기본 생성자(Primary constructor) 부분을 의미합니다.
기본 생성자에 주석이나 가시성 수정자(visibility modifier)가 없으면 constructor키워드를 생략할 수 있습니다.
class Person(firstName: String) { /* ... */ }
기본 생성자는 클래스 헤더에서 클래스 인스턴스와 해당 속성을 초기화합니다. 클래스 헤더에는 실행 가능한 코드가 포함될 수 없습니다. 객체 생성 중에 코드를 실행하려면 클래스 본문 내부에 init 블록을 사용합니다. init 블록은 init 키워드 뒤에 중괄호를 붙여 선언합니다. 실행하려는 코드는 중괄호 안에 작성합니다.
인스턴스를 초기화하는 동안 초기화 블록은 속성 초기화 블록과 함께 클래스 body에 나타나는 것과 동일한 순서로 실행됩니다.
class InitOrderDemo(name: String) {
val firstProperty = "First property: $name".also(::println)
init {
println("First initializer block that prints $name")
}
val secondProperty = "Second property: ${name.length}".also(::println)
init {
println("Second initializer block that prints ${name.length}")
}
}
아래는 실행 순서입니다.
기본 생성자의 파라미터는 다음과 같이 활용될 수 있습니다.
- init 블록에서 사용
- 클래스 바디에서 속성 초기화를 선언할 때 사용
코틀린은 속성을 선언하고 기본 생성자에서 이를 초기화하기 위한 간결한 구문을 제공합니다.
class Person(val firstName: String, val lastName: String, var age: Int)
이러한 선언에는 클래스 속성의 기본값도 포함될 수 있습니다.
class Person(val firstName: String, val lastName: String, var isEmployed: Boolean = true)
클래스 속성을 선언할 때 쉼표를 사용하여 구분지을 수 있습니다.
class Person(
val firstName: String,
val lastName: String,
var age: Int, // trailing comma
) { /*...*/ }
일반 속성과 마찬가지로 기본 생성자에 선언된 속성은 변경 가능 ( var ) 또는 읽기 전용 ( val )이 될 수 있습니다.
생성자에 주석이나 가시성 수정자가 있는 경우 constructor 키워드가 필요하며 수정자가 앞에 옵니다.
class Customer public @Inject constructor(name: String) { /*...*/ }
💡 가시성 수정자(visibility modifier)란?
클래스, 함수, 프로퍼티, 생성자 등의 접근 범위를 제어하는 데 사용됩니다. private, protected, public, internal 네가지가 있습니다.
자바의 접근지정자인 public, protected, private, default와 유사합니다.
[보조 생성자]
클래스는 다음과 같은 접두사로 보조 생성자를 constructor 키워드로 선언할 수 있습니다.
class Person(val pets: MutableList<Pet> = mutableListOf())
class Pet {
constructor(owner: Person) {
owner.pets.add(this) // adds this pet to the list of its owner's pets
}
}
클래스에 기본 생성자가 있는 경우, 각 보조 생성자는 기본 생성자에게 직접 또는 다른 보조 생성자를 통해 간접적으로 위임해야 합니다. 같은 클래스의 다른 생성자에게 위임하는 것은 this키워드를 사용하여 수행됩니다.
class Person(val name: String) {
val children: MutableList<Person> = mutableListOf()
constructor(name: String, parent: Person) : this(name) {
parent.children.add(this)
}
}
위 코드는 자바 개발자라면 난해할 수 있는데 분석을 해보면 다음과 같습니다.
1. 새로운 Person 객체가 보조 생성자를 통해 생성될 때
- 보조 생성자는 먼저 기본 생성자를 호출합니다.
- 기본 생성자가 name을 초기화한 후, 보조 생성자의 로직이 실행됩니다.
2. 부모 객체와 자식 객체 간의 관계를 설정합니다.
- 생성된 자식 객체를 부모 객체의 children 리스트에 추가합니다.
위의 코드는 다음과 같이 보조 생성자를 호출할 수 있습니다.
fun main() {
// 부모 객체 생성 (기본 생성자를 사용)
val parent = Person("Parent")
// 자식 객체 생성 (보조 생성자를 사용)
val child1 = Person("Child1", parent)
val child2 = Person("Child2", parent)
// 부모의 children 리스트 출력
println("${parent.name}'s children: ${parent.children.map { it.name }}")
}
init 블록의 코드는 효과적으로 기본 생성자의 일부가 됩니다. 기본 생성자에 대한 위임은 보조 생성자의 첫 번째 문장에 액세스하는 순간에 발생하므로 모든 init 블록과 속성 초기화 코드는 보조 생성자의 본문보다 먼저 실행됩니다.
클래스에 기본 생성자가 없더라도 위임은 여전히 암묵적으로 발생하고 초기화 블록은 계속 실행됩니다.
class Constructors {
init {
println("Init block")
}
constructor(i: Int) {
println("Constructor $i")
}
}
실행 결과는 다음과 같습니다.
추상이 아닌 클래스가 생성자(기본 또는 보조)를 선언하지 않으면 인수가 없는 public 가시성 수정자를 가진 기본 생성자가 생성됩니다. 클래스에 공개 생성자가 없도록 하려면 기본 가시성 수정자(public)가 아닌 빈 기본 생성자를 선언합니다.
class DontCreateMe private constructor() { /*...*/ }
클래스 부가 정보
[객체 생성]
클래스 인스턴스를 만들려면 생성자를 일반 함수인 것처럼 호출합니다. 생성된 인스턴스를 변수에 할당할 수 있습니다.
코틀린에서 new 라는 키워드가 없으므로 자바처럼 객체를 생성하지 않습니다.
val invoice = Invoice()
val customer = Customer("Joe Smith")
[클래스 멤버]
클래스의 멤버는 다음과 같이 구성됩니다.
- 생성자와 init 블록
- 함수
- 속성
- 중첩클래스와 이너클래스
- Object 선언
Object는 싱글톤을 의미합니다.
https://kotlinlang.org/docs/classes.html#abstract-classes
GPT
'[개발] 언어 > Kotlin' 카테고리의 다른 글
[kotlin] Visibility modifiers (가시성 수정자) (0) | 2025.01.02 |
---|---|
[kotlin] class/file 타입 알아보기 (0) | 2024.12.29 |
[kotlin] print 문 사용하기 (1) | 2024.12.28 |
코틀린 소개 (0) | 2024.07.29 |