class 클래스명 {
var 변수
fun 함수() {
}
}
작성된 클래스를 사용하기 위해서는 생성자가 호출되어야 하는데, 코틀린은 프라이머리와 세컨더리 2개의 생성자를 제공함
클래스의 헤더처럼 사용할 수 있으며 constructor 키워드를 사용해서 정의하는데, 조건에 따라 생략할 수도 있음
class Person constructor(value: String) { }
생성자에 접근 제한자나 다른 옵션이 없다면 constructor 키워드를 생략할 수도 있음
클래스의 생성자가 호출되면 init 블록의 코드가 실행되고, init 블록에서는 생성자를 통해 넘어온 파라미터에 접근할 수 있음
class Person(value: String) {
init {
Log.d("class", "생성자로부터 전달받은 값은 ${value}입니다")
}
}
// init 초기화 작업이 필요하지 않다면 생략해도 됨
class Person(val value: String) {
fun process() {
print(value)
}
}
constructor 키워드를 마치 함수처럼 클래스 스코프 안에 직접 작성할 수 있음
또한, 파라미터의 개수나 타입이 다르다면 여러 개를 중복해서 만들 수 있음
class Person {
constructor (value: String) {
Log.d("class", "생성자로부터 전달받은 값은 ${value} 입니다")
}
}
생성자는 작성하지 않을 경우 파라미터가 없는 프라이머리 생성자가 하나 있는 것과 동일함
class Student {
init { }
}
아무런 파라미터 없이 클래스명에 괄호를 붙여주면, 생성자가 호출되면서 init 블록 안의 코드가 자동으로 실행됨
세컨더리 생성자의 경우 init 블록이 먼저 실행되고, constructor 블록 안의 코드가 실행됨
var kotlin = Kotlin()
오브젝트를 사용하면, 클래스를 생성자로 인스턴스화 하지 않아도 블록 안의 프로퍼티와 메소드를 호출해 사용할 수 있음
앱 전체에 한 개만 생성됨
object Pig {
var name: String = "Pinky"
fun printName() {
Log.d("class", "Pig의 이름은 ${name} 입니다")
}
}
Pig.name = "Mikey"
Pig.printName()
일반 클래스에 object 기능을 추가하기 위해 사용함
class Pig {
companion object {
var name: String = "None"
fun printName() {
Log.d("class", "Pig의 이름은 ${name} 입니다")
}
}
fun walk() {
Log.d("class", "Pig가 걸어갑니다")
}
}
// companion object 안의 코드 사용하기
Pig.name = "Linda"
Pig.printName()
// companion object 밖의 코드 사용하기
val cutePig = Pig()
cutePig.walk()
간단한 값의 저장 용도로 사용함
// 정의 - 주로 코드 블록을 사용하지 않고 간단하게 작성함
data class UserData(val name: String, var age: Int)
// 생성 - 일반 class의 생성자 함수를 호출하는 것과 동일함
var userData = UserData("Michael", 21)
// 일반 클래스처럼 사용하기
data class UserData(var name: String, var age: Int) {
init {
Log.d("UserData", "initialized")
}
fun process() { }
}
이처럼 클래스와 사용법이 동일하지만 주로 네트워크를 통해 데이터를 주고 받거나, 혹은 로컬 앱의 데이터베이스에서 데이터를 다루기 위한 용도로 사용함
상속 대상이 되는 부모 클래스는 open 키워드로 만들어야만 자식 클래스에서 사용할 수 있음
open class Parent {
var hello: String = "안녕하세요"
fun sayHello() {
Log.d("inheritance", "${hello}")
}
}
class Child: Parent() {
fun myHello() {
hello = "Hello!"
sayHello()
}
}
동일한 이름의 메소드나 프로퍼티를 사용할 필요가 있을 경우, override 키워드를 사용해서 재정의할 수 있음 (open 키워드를 붙어야 함)
open class BaseClass {
open fun opened() {
}
}
class ChildClass: BaseClass() {
override fun opened() {
}
}
코틀린은 클래스, 메소드, 프로퍼티에 대해 익스텍션을 지원하기 때문에, 이미 만들어져 있는 클래스에 메소드를 추가할 수 있음
fun 클래스.확장할 메소드() { }