https://kotlinlang.org/docs/classes.html
Kotlin(코틀린) 공식문서를 참고하여 학습해보자.
Classes(클래스)
kotlin 클래스는 class 키워드로 사용된다.
class Person { /*...*/ }
클래스 선언은 class name, class header(매개변수, 기본 생성자 및 기타 사항 지정) 및 중괄호로 묶인 class body(바디)으로 구성된다.
header와 body는 선택사항이다. 클래스에 body가 없으면 중괄호를 생략해도 된다.
class Empty
Constructor(생성자)
코틀린은 하나의 필수 Primary Constructor(기본 생성자)와 하나 이상의 Secondary Constructor(보조 생성자)를 가진다.
기본 생성자는 클래스 헤더의 일부이고, 클래스 이름과 선택적 유형 매개변수 뒤에 온다.
class Peerson constructor(firstName: String) { /*...*/ }
기본 생성자에 annotaion(주석) 또는 visibility modifiers(가시성 수정자)가 없다면 constructor 키워드 생략 가능하다.
코드를 가지지 않으며 class body 내의 init block을 이용해 초기화한다.
파라미터로 받은 값은 class body 내의 각 property들의 초기화에 사용할 수 있다.
class Person(firstName: String) { /*...*/ }
기본 생성자는 코드를 포함할 수 없다.
Initialization code(초기화 코드)는 init 키워드가 접두사에 붙은 initializer blocks(초기화 블록)에 배치할 수 있다.
아래는 기본 생성자 예시이다.
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}")
}
}
initializer blocks(초기화 블록)에서 기본 생성자 매개변수를 사용할 수 있다.
class body에 선언된 property initializers(속성 초기화)에서도 사용이 가능하다.
class Customer(name: String) {
val customerKey = name.uppercase()
}
기본 생성자에서 properties(속성)을 선언과 초기화를 한 번에 할 수 있다.
class Person(val firstName: String, val lastName: String, var age:Int = 0)
- read-only와 mutable에 따라 val과 var를 사용한다.
- 이러한 선언에는 클래스 속성의 기본값도 넣을 수 있다.
생성자에 annotations 또는 visibility modifiers가 있는 경우 constructor 키워드가 필요하고 수정자가 그 앞에 온다.
class Customer public @Inject constructor(name: String) { /*...*/ }
Constructor를 선언하지 않으면 인자를 받지 않는 기본 생성자가 생긴다.
기본 생성자 실습
1. 파라미터가 없는 생성자인 Test 클래스를 선언하고 객체를 생성해보자.
2. 정수형 숫자 2개를 받아서 생성자에서 변수 x, y를 초기화하고 (x, y)의 형식으로 출력하는 Position 클래스를 선언하고 그 객체를 2개 이상 생성해보자.
3. Position 클래스에서 x, y 변수를 생성자의 파라미터로 바로 선언하고 초기화하도록 코드를 수정하자.
Secondary Constructor(보조 생성자)
클래스는 접두사에 constructor 키워드로 보조 생성자를 선언할 수 있다.
class Person(val pets: MutableList<Pet> = mutableListOf())
class Pet {
constructor(owner: Person) {
owner.pets.add(this)
}
}
만약 기본 생성자가 있는 클래스라면, 각 보조 생성자는 직접적으로 기본 생성자를 호출하거나 다른 보조 생성자를 통해 기본 생성자를 호출한다. 동일한 클래스의 다른 생성자에 대한 위임은 this 키워드를 사용하여 수행된다.
class Person(val name: String) {
val children: MutableList<Person> = mutableListOf()
constructor(name: String, parent: Person) : this(name) {
parent.children.add(this)
}
}
initializer blocks(초기화 블록)의 코드는 기본 생성자의 일부가 된다.
기본 생성자에 대한 위임은 보조 생성자의 첫 번째 명령문으로 발생하므로 모든 초기화 블록과 속성 초기화 코드는 보조 생성자의 본문보다 먼저 실행된다.
클래스에 기본 생성자가 없더라도 위임은 여전히 암시적으로 발생하고 초기화 블록은 계속 실행된다.
class Constructor {
init {
println("Init block")
}
constructor(i: Int) {
println("Constructor $i")
}
}
non-abstract class(비추상 클래스)가 생성자(기본 또는 보조)를 선언하지 않으면 인수 없이 기본 생성자로 생성된다.
생성자의 visibility(가시성)은 공개된다.
클래스에 public constructor(공개 생성자)가 포함되지 않도록 하려면, 기본이 아닌 가시성을 가진 비어있는 기본 생성자를 선언해야한다.
class DontCreateMe private constructor () { /*...*/ }
📝 JVM에서 모든 기본 생성자 매개변수에 기본값이 있는 경우, 컴파일러는 기본값을 사용할 매개변수가 없는 생성자를 추가하여 생성한다. 이를 통해 매개변수가 없는 생성자를 통해 class instances(클래스 인스턴스)를 생성하는 Jackson 또는 JPA와 같은 라이브러리와 함께 코틀린을 더 쉽게 사용할 수 있다.
class Customer(val customerName: String = "")
보조 생성자 실습
1. 앞에서 작성한 Position 클래스에 정수형 파라미터를 하나만 받아 x, y 모든 변수에 해당 값을 설정한느 Secondary Constructor를 추가하라.
Creating instances of classes (클래스의 인스턴스 생성)
클래스의 인스턴스를 생성하려면 생성자가 일반 함수인 것처럼 호출하면 된다.
val invoice = Invoice()
val customer = Customer("Joe Smith")
🧐 Kotlin(코틀린)에는 new 키워드가 없다.
Class members(클래스 멤버)
클래스에는 이것들이 포함될 수 있다.
- Constructors and initializer blocks(생성자와 초기화 블록)
- Functions(함수)
- Properties(속성)
- Nested and inner classes(중첩 및 내부 클래스)
- Object declarations(객체 선언)
'프로그래밍 > Kotlin' 카테고리의 다른 글
Kotlin(코틀린) - var 와 val (0) | 2022.05.31 |
---|---|
Kotlin(코틀린) - Inheritance(상속) (0) | 2022.04.05 |