Kotlin 클래스 – Kotlin 생성자

이 튜토리얼에서는 Kotlin의 객체 지향 프로그래밍 개념에 대해 다룰 것입니다. Kotlin 클래스에 대해 자세히 설명하겠습니다. 또한 Kotlin 생성자, 접근 제한자 및 추상 클래스에 대해서도 살펴보겠습니다.

Kotlin 클래스

클래스는 함수와 속성을 그룹화하는 정의된 블루프린트입니다. Kotlin에서 클래스는 키워드 class 다음에 클래스 이름으로 정의됩니다. 본문은 중괄호 안에 작성됩니다.

class FirstClass {
}

클래스의 인스턴스는 다음과 같이 인스턴스화됩니다:

val firstClass =  FirstClass()
var new = FirstClass() //here new is the name of the var.

Java와는 달리 Kotlin에서는 new가 키워드가 아닙니다. Kotlin에서 기본적으로 클래스는 final입니다. 따라서 Java에서의 위 정의의 동등한 형태는 다음과 같을 것입니다:

public final class FirstClass {
}

따라서 Kotlin에서 기본적으로 클래스는 상속할 수 없습니다. 클래스를 비-final로 만들려면 키워드 open을 추가해야 합니다.

open class Me{
}

open 주석은 다른 사람들이 이 클래스를 상속할 수 있도록 허용합니다.

Kotlin 클래스 예제

class 생성 및 속성과 몇 가지 함수를 가진 클래스를 만들어봅시다. 이 클래스의 함수 및 속성에 어떻게 접근하는지 살펴보겠습니다. 더 나아가 멤버 속성을 설정하는 방법도 살펴보겠습니다.

class User {

    var loggedIn: Boolean = false
    val cantChangeValue = "Hi"
    
    fun logOn() {
        loggedIn = true
    }
    
    fun logOff() {
        loggedIn = false
    }
}

fun main(args: Array<String>) {

    val user = User()
    println(user.loggedIn) //false
    user.logOn()
    println(user.loggedIn) //true
    user.logOff()
    println(user.loggedIn) //false
    user.cantChangeValue = "Hey" //won't compile. Can't modify a final variable.

}

main 함수는 Test.kt 클래스에 속합니다. 멤버 및 함수에 접근하려면 도트 연산자를 사용해야 합니다. val 속성은 도트 연산자를 사용하여 다시 설정할 수 없습니다.

Kotlin init

Kotlin init 블록은 아래와 같이 정의됩니다.

class User {
    
    init{
        print("Class instance is initialised.")
    }

    var loggedIn: Boolean = false
    val cantChangeValue = "Hi"

    fun logOn() {
        loggedIn = true
    }

    fun logOff() {
        loggedIn = false
    }
}

클래스가 인스턴스화될 때 가장 먼저 실행되는 코드는 init 블록 안에 있습니다. init 블록은 클래스가 어떤 종류의 생성자로든 인스턴스화될 때마다 실행됩니다. 클래스에 여러 초기화 블록을 작성할 수 있습니다. 아래와 같이 순차적으로 실행됩니다.

class MultiInit(name: String) {

    init {
        println("First initializer block that prints ${name}")
    }

    init {
        println("Second initializer block that prints ${name.length}")
    }
}

fun main(args: Array) {
    var multiInit = MultiInit("Kotlin")
}

//다음이 로그 콘솔에 출력됩니다.
//Kotlin을 출력하는 첫 번째 초기화 블록
//6을 출력하는 두 번째 초기화 블록

Kotlin 클래스는 also 함수를 사용하여 선언 단계에서 속성을 출력할 수 있습니다. 아래와 같이 출력됩니다.

class MultiInit(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}")
    }
}

fun main(args: Array) {

    var multiInit = MultiInit("Kotlin")
}

//다음이 출력됩니다.
//첫 번째 속성: Kotlin
//Kotlin을 출력하는 첫 번째 초기화 블록
//두 번째 속성: 6
//6을 출력하는 두 번째 초기화 블록

Kotlin 생성자

Kotlin 생성자는 속성을 초기화하는 데 사용되는 특수 멤버 함수입니다. Kotlin의 생성자는 Java와는 다르게 작성되고 구조화됩니다. 기본적으로 클래스에는 아래와 같이 빈 생성자가 있습니다:

class Student {
    var name: String
    val age : Int

    init {
        name = "Anupam"
        age = 24
    }

    init {
        name = "Anupam Chugh"
        //age = 26
    }
}

fun main(args: Array) {
    
    val student = Student()
    println("${student.name} age is ${student.age}")
    student.name = "Your"
    //student.age = 26 //컴파일되지 않음. age는 val입니다
    println("${student.name} age is ${student.age}")

}

//다음이 콘솔에 출력됩니다:
//Anupam Chugh 나이는 24입니다
//당신의 나이는 24입니다

기본 생성자

Kotlin의 기본 생성자는 다음과 같이 클래스 헤더에 정의됩니다.

class User(var name: String, var isAdmin: Boolean) {

    init {
        name = name + " @ JournalDev.com"
        println("Author Name is $name. Is Admin? $isAdmin")
    }
}

기본 생성자의 정의는 클래스 헤더 내부에 있습니다. 주의: 명시적으로 var로 지정하지 않는 한, 기본적으로 생성자 인수는 val입니다.

class User(name: String, isAdmin: Boolean)

위의 코드에서는 name 및 isAdmin 모두 재할당할 수 없습니다. 또는 클래스 내의 멤버 속성에 생성자 인수를 할당할 수도 있습니다.

class User(name: String, val isAdmin: Boolean) {

    var username  = name
    val _isAdmin = isAdmin

    init {
        username= username + " @ JournalDev.com"
        println("Author Name is $name. Is Admin? $_isAdmin")
    }
}

fun main(args: Array) {

    var user = User("Anupam",false)
    user.isAdmin = true //won't compile since isAdmin is val
    user._isAdmin = true //won't compile. Same reason.
    user = User("Pankaj",true)
}

//로그 콘솔에 다음이 출력됩니다.
//작성자 이름은 Anupam입니다. 관리자인가요? false
//작성자 이름은 Pankaj입니다. 관리자인가요? true

Kotlin 생성자 기본 값

Kotlin은 다음과 같이 생성자에서 기본값을 지정할 수 있도록 합니다.

class User(name: String, var website: String = "JournalDev") {

    init {
        println("Author $name writes at $website")
    }

    init {
        website = website + ".com"
        println("Author $name writes at $website")
    }
}

fun main(args: Array) {

    var user = User("Anupam","JournalDev")
    user = User("Pankaj","JournalDev")
}

//다음은 콘솔에 인쇄됩니다:
//저자 Anupam은 JournalDev에서 글을 씁니다.
//저자 Anupam은 JournalDev에서 글을 씁니다..com
//저자 Pankaj은 JournalDev에서 글을 씁니다.
//저자 Pankaj은 JournalDev에서 글을 씁니다..com

보조 생성자

보조 생성자는 constructor 키워드를 접두사로 사용하여 클래스 내부에 작성됩니다. 다음 예제가 이를 보여줍니다.

class Student {
    var name: String
    val age : Int

    constructor(name: String, age: Int)
    {
        this.name = name
        this.age = age
    }

    fun printDetails()
    {
        println("Name is $name and Age is $age")
    }

}

fun main(args: Array) {

    var student = Student("Anupam", 24)
    student.printDetails()
}

//다음은 콘솔에 인쇄됩니다.
//이름은 Anupam이고 나이는 24입니다.

보조 생성자의 가장 일반적인 사용법은 하위 클래스에서 클래스를 다른 방식으로 초기화해야 할 때입니다. 클래스에 기본 생성자가 포함되어 있는 경우, 보조 생성자는 선언에서 이를 참조해야 합니다. 선언은 this 키워드를 사용하여 이루어집니다.

class Student(var name: String, val age: Int) {

    var skill: String

    init {
        skill = "NA"
    }

    constructor(name: String, age: Int, skill: String) : this(name, age) {
        this.skill = skill
    }

    fun printDetails() {
        if (skill.equals("NA"))
            println("Name is $name and Age is $age")
        else
            println("Name is $name and Age is $age Skill is $skill")
    }
}

//다음은 로그 콘솔에 인쇄됩니다:
//이름은 Anupam이고 나이는 24입니다.
//이름은 Anupam이고 나이는 24입니다. Skill is Kotlin

init 블록은 skill 멤버 속성을 초기화하는 데 사용됩니다. 보조 생성자는 : this를 사용하여 기본 생성자로 위임합니다.

사용자 정의 게터 및 세터

지금까지 클래스의 인스턴스에서 도트 연산자를 사용하여 속성에 액세스하고 수정했습니다. 액세스를 사용자 정의하는 방법을 알아보기 위해 setget 구문을 사용해 보겠습니다.

class Name{
    var post: String = "default"
    set(value) {if(!post.isNotEmpty()) {
        throw IllegalArgumentException(" Enter a valid name")
    }
                field = value
                print(value)
    }

}

fun main(args: Array<String>) {

    var name = Name()
    name.post = "Kotlin Classes"
    name.post = ""
    name.post = "Kotlin Data Classes Our Next Tutorial"


}

다음은 로그 콘솔에 인쇄됩니다:

Kotlin Classes

Exception in thread "main" java.lang.IllegalArgumentException:  Enter a valid name
	at Name.setPost(Test.kt:16)
	at TestKt.main(Test.kt:78)

세터의 field 변수는 이전 값 저장합니다. 게터를 추가해 봅시다.

class Name{
    var post: String = "default"
    set(value) {if(!post.isNotEmpty()) {
        throw IllegalArgumentException(" Enter a valid name")
    }
                field = value
    }
    get() {
        return field.capitalize()
    }

}

fun main(args: Array) {

    var name = Name()
    name.post = "kotlin classes"
    println(name.post)
    name.post = "kotlin data Classes our next Tutorial"
    println(name.post)

}

//다음이 인쇄됩니다:
//Kotlin 클래스
//Kotlin 데이터 클래스, 다음 강의

capitalize()는 문자열의 첫 글자를 대문자로 만듭니다. 참고: 속성이 val인 경우 set 메서드가 컴파일되지 않습니다.

Kotlin 가시성 수정자

  • Public: 이 수정자가 있는 모든 클래스, 함수, 속성, 인터페이스 또는 객체는 보이며 어디에서나 액세스할 수 있습니다.
  • 개인: 이 수정자로 정의된 클래스/함수는 동일한 파일 내에서만 액세스할 수 있습니다. 이 수정자가 있는 클래스/함수의 멤버/속성은 해당 블록 내에서만 액세스할 수 있습니다.
  • 보호된: 이 수정자는 개인과 같지만 하위 클래스 내에서 가시성 및 액세스를 허용합니다.
  • 내부: 이 수정자가 있는 클래스/인터페이스/함수는 동일한 모듈 내에서만 접근할 수 있습니다.

가시성 수정자는 생성자에도 적용됩니다. 기본 생성자에 수정자를 할당하려면 클래스 헤더의 생성자 옆에 키워드 constructor를 지정해야 합니다.

class Student private constructor (var name: String, val age: Int) {

    var skill: String

    init {
        skill = "NA"
    }

    constructor(name: String, age: Int, skill: String) : this(name, age) {
        this.skill = skill
    }

    fun printDetails() {
        if (skill.equals("NA"))
            println("Name is $name and Age is $age")
        else
            println("Name is $name and Age is $age Skill is $skill")
    }
}

fun main(args: Array) {

    var student = Student("Anupam",24,"Kotlin")
    student.printDetails()
}

//prints
//이름은 Anupam이고 나이는 24 기술은 Kotlin

개인 생성자는 클래스 외부에서 호출할 수 없습니다. 위의 코드에서 클래스를 다른 함수에서만 보조 생성자를 사용하여 인스턴스화할 수 있습니다.

Kotlin 추상 클래스

Java와 마찬가지로 Kotlin에서 추상 클래스를 선언하는 데 abstract 키워드를 사용합니다. 추상 클래스는 인스턴스화할 수 없습니다. 그러나 하위 클래스에서 상속될 수 있습니다. 기본적으로 추상 클래스의 멤버는 다른 대상이 명시되지 않는 한 비추상입니다.

abstract class Person(name: String) {

    init {
        println("Abstract Class. init block. Person name is $name")
    }

    abstract fun displayAge()
}

class Teacher(name: String): Person(name) {

    var age : Int

    init {
        age = 24
    }

    override fun displayAge() {
        println("Non-abstract class displayAge function overridden. Age is $age")
    }
}

fun main(args: Array) {

    val person = Teacher("Anupam")
    person.displayAge()

}

//다음은 콘솔에 출력됩니다.
//추상 클래스. 초기 블록. 사람 이름은 Anupam
//비추상 클래스. 나이는 24

주의: 추상 클래스는 기본적으로 open 상태입니다. 따라서 하위 클래스화를 허용하려면 open 수정자를 추가하는 것이 필요하지 않습니다. override 키워드는 하위 클래스에서 메서드를 재정의하는 데 사용됩니다. 이 튜토리얼에서는 코틀린 클래스의 기본 사항을 다뤘습니다. 데이터 클래스, 실드 클래스, 상속 등과 같은 더 많은 내용이 아직 남아 있습니다. 다가오는 튜토리얼에서 이에 대해 다룰 것입니다. 참고 자료: 코틀린 문서

Source:
https://www.digitalocean.com/community/tutorials/kotlin-class-constructor