Coding Memo

Kotlin 클래스 본문

Language/Kotlin

Kotlin 클래스

minttea25 2020. 12. 30. 19:23

Class

 

Kotlin은 객체지향 언어의 특징도 가지고 있다.

 

Java와 동일하고 property (속성)과 함수들을 포함하고 있고 '.' 연산자로 참조를 할 수 있다.

 

참고: Java와 달리 Kotlin에서는 파일명과 class 명이 일치하지 않아도 된다.


생성자 (Constructor)

 

좀 특이하다.

선언 부분 자체가 생성자가 된다. 생성자 영역이 따로 없다.

 

따라서 Java에서 했던 속성들을 초기화하는 작업은 'init'이라는 함수에서 할 수 있다.

init 함수는 인자나 return 값이 없는 조금 특이한 함수이고, 클래스 생성 시에 자동으로 실행된다.

 

다음의 예시를 보자.

fun main() {
    var Person1 = Person("Mike", 20, 160)
    var Person2 = Person("Joe", 21, 170)
    Person1.printInfo()
    Person2.printInfo()
}

class Person(name: String, age: Int, height: Int) {
    var name = ""
    var height = -1
    var age = -1

    init {
        this.name = name
        this.height = height
        this.age = age
    }

    fun printInfo() {
        println("name=$name, age=$age, height=$height")
    }
}

 

class 선언 부분 자체가 생성자 처럼 되어 있다. 이런 생성자를 '기본 생성자'라고 한다.

인스턴스를 생성을 하면서 init이 실행이 되어 각각의 속성에 값이 할당이 되어있다. 

 

참고: init 함수는 참조 할 수 없다.

init 함수는 참조 불가

 

class 선언 부분에서 맴버멤버 변수를 아예 선언해버릴 수도 있다. 따라서 따로 멤버 변수를 선언하지 않아도 된다.

class Person(var name: String, var age: Int, var height: Int) {

    init {
    }

    fun printInfo() {
        println("name=$name, age=$age, height=$height")
    }
}

이렇게 해도 결과는 전의 예시와 같다.

생성할 때 각 속성에 값을 할당하기 때문에 어차피 null 값을 가질 수 없는 형태이다.


보조 생성자 (secondary constructor)

 

기본 생성자 외에 보조 생성자라는 생성자가 있다.

Java에서 여러가지 생성자를 만들 수 있다는 점을 생각하면 될 거 같다.

constructor() 함수를 이용하고 여러 개를 만들 수 있다.

property에 default 값을 넣어주고 싶을 때 사용할 수도 있다.

 

주의할 점은 함수 뒤에 ':this' 를 이용해서 기본 생성자를 상속받아야 한다.

보조 생성자 호출 -> 기본 생성자 호출



fun main() {
    var Person1 = Person("Mike", 20, 160, "US")
    var Person2 = Person("Joe", 21, 170)
    var Person3 = Person("null")
    Person1.printInfo()
    Person2.printInfo()
    Person3.printInfo()
}

class Person(var name: String, var age: Int, var height: Int, var nation: String) {

    init {
    }

    constructor(name: String, age: Int, height: Int) : this(name, age, height, "Korea")
    constructor(name: String):this(name, -1, -1, "null")

    fun printInfo() {
        println("name=$name, age=$age, height=$height, nation:$nation")
    }
}

보조 생성자 예시 결과

Person1은 기본생성자

Person2는 첫 번째 보조 생성자

Person3는 두 번째 보조 생성자

를 이용하여 인스턴스를 생성했다.

 

참고: secondary constructor에서는 var을 허용하지 않는 것 같다. 따라서 따로 선언을 해주거나 기본 생성자에서 선언을 해주어야 한다.

보조 생성자 var 허용 안함


클래스의 상속 (Class Inheritance)

 

Java나 C++과 마찬가지로 클래스 간에 상속을 할 수 있다.

상속 지정 방법: 클래스 선언 뒤에 ': [클래스 이름]' 을 붙이면 된다. (C++ 과 동일) 또한 단순히 클래스 이름만 붙여주는 것 대신에 슈퍼클래스의 생성자 자체를 작성해주어야 한다.

(물론, 생성자에 인자가 없다면 '()' 없이 해도 무방하다.)

2개 이상을 상속하려 할 때는 ','를 사용한다.

ex) class Eagle() : Animal(), Bird() {}

 

주의할 점: super class가 되는 class의 선언 앞부분에 'open' 키워드를 붙여 주어야 된다.

(클래스의 상속에서의 오버 라이딩(overriding)을 할 때에도 슈퍼클래스에서는 'open'을 붙여야 하고, 서브클래스에서는 해당 함수에 'override'를 붙여주어야 한다.)

 

super class의 속성에 접근하기 위해서는 'super'를 사용한다. (Java와 동일)

open class Book(var name: String, var price: Int) {
    var code = 0
    open fun printInfo() {
        println("name=$name, price=$price")
    }
}

class Novel(name: String, price: Int) : Book(name, price) {
    init {
    }

    override fun printInfo() {
        println("name=$name, price=$price")
        println(super.code)
        println("type: novel")
    }
}

Book 클래스를 슈퍼클래스로, Novel 클래스를 서브 클래스로 하기 위해서 Book 클래스 선언 부분에 open을 붙여주었다.

printInfo()라는 함수를 오버 라이딩하기 위해서 슈퍼클래스의 printInfo 함수 선언 앞부분에 open을 붙여주었다.

서브클래스인 Novel 클래스에서 printInfo라는 슈퍼클래스에서과 같은 이름의 함수를 쓰기 위해 (즉, 오버 라이딩하기 위해) 선언 부분 앞에 override를 붙여주었다.

슈퍼클래스의 속성인 code에 접근하기 위해 super를 사용하였다.


추상 클래스 (Abstract Class)

 

Java와 C++과 마찬가지로 Kotlin에도 추상 클래스가 있다. (물론 Interface도 있다.)

Java와 동일하게 abstract 키워드를 이용해서 class를 만들면 된다.

 

(당연하지만, 추상 클래스에서의 추상 함수는 body가 있으면 안 되고, 상속을 받은 클래스에서는 반드시 해당 함수를 구현해야 한다.)

 

fun main() {
    var book1 = Novel("Harry Potter", 10000)
    book1.printInfo()
    println("Title: ${book1.getBookTitle()}")
}

abstract class Book(var title: String, var price: Int) {
    fun getBookTitle(): String {
        return title
    }
    fun getBookPrice(): Int {
        return price
    }
    abstract fun printInfo()
}

class Novel(title: String, price: Int) : Book(title, price) {
    init {
    }

    override fun printInfo() {
        println("type: novel, name=$title, price=$price")
    }
}

 

추상 클래스 예시 결과

 

'Language > Kotlin' 카테고리의 다른 글

Kotlin 인터페이스  (0) 2021.01.02
Kotlin 고차 함수 / 람다 함수  (0) 2020.12.31
Kotlin 접근 제어자  (0) 2020.12.30
Kotlin 조건문/반복문  (0) 2020.12.30
Kotlin 기본 (memo#1)  (0) 2020.12.29