kotlin/기초

kotlin 문법 기초 - 4

blogger903 2024. 7. 23. 07:03
728x90

kotlin 개발전 문법관련 기초내용 정리 포스트입니다

인프런 - 코틀린 문법부터 실무까지 (자바 to 코틀린 실무) 강의를 보면서 예시 코드를 다르게 하여 포스팅합니다
typescript, java 개발 경험이 있습니다

다루는 내용

- 생성자

- 상속

- data class

- setter, getter

생성자

주 생성자 초기화 블록

kotlin에는 클래스 선언시 함수파라미터처럼 넘길수 있는데 이걸 주 생성자라고 하고 한개 밖에 사용못합니다
init block에서 클래스 객체 생성될 때 실행됌

class Person2(val name: String, var age: Int) {
    init {
        println("Initializing a new Person instance")
        println("Name: $name, Age: $age")
    }
}

fun main() {
    val person = Person2("Alice", 30)
    println(person)

}

init block은 여러개 달수 있음

class Rectangle(val width: Int, val height: Int) {
    val area: Int

    init {
        println("First initializer block")
        area = width * height
    }

    init {
        println("Second initializer block")
        println("Area of the rectangle: $area")
    }
}



fun main() {
    val rect = Rectangle(5, 3)
}

val, var 없이 사용
val이나 var 없이 선언된 생성자 매개변수는 초기화 블록이나 프로퍼티 초기화에서만 사용할 수 있습니다
이들은 클래스의 메서드 내에서 직접 접근할 수 없습니다 (프로퍼티가 아니기 때문)

class Person2(name: String, age: Int) {
    init {
        println("Name: $name, Age: $age")  // 가능
    }

    val upperCaseName = name.toUpperCase()  // 가능

    fun printDetails() {
        println("Name: $name")  // 컴파일 오류! name은 프로퍼티가 아님
        println("Upper case name: $upperCaseName")
    }
}



fun main() {
    val person = Person2("Human", 1)
}

init 블록없이 필드 초기화

class Person2(name: String, age: Int) {
    val upperCaseName = name.uppercase()
    var adjustedAge = age + 1
}

fun main() {
    val person = Person2("Alice", 30)
    println("${person.upperCaseName} is ${person.adjustedAge} years old")
}

 

디폴트 파라미터 

다음과 같이 nullable한 필드에 대해서 디폴트 값을 준 경우에는

생성할때 id필드가 필수값이 아니게 됩니다.

class AssignedRole(  
    val id: AssignedRoleId? = null,  
    val role: Role,  
    val organizationUser: OrganizationUser,  
    val startDate: LocalDateTime,  
    val endDate: LocalDateTime,  
    val isActive: Boolean,  
    val createdAt: LocalDateTime,  
    val updatedAt: LocalDateTime,  
)

 

상속

기본 상속 예시

open class Person(val name: String, val age: Int) {
    open fun introduce() = "I'm $name, $age years old"
}

class Student(name: String, age: Int, val studentId: String) : Person(name, age) {
    override fun introduce() = "${super.introduce()}. My student ID is $studentId"
}

val student = Student("Alice", 20, "A12345")
println(student.introduce())

수퍼클래스 생성자 없는 경우

open class Vehicle {
    var brand: String
    constructor(brand: String) {
        this.brand = brand
    }
}

class Car(brand: String, val model: String) : Vehicle(brand) {
    fun getInfo() = "$brand $model"
}

val car = Car("Toyota", "Corolla")
println(car.getInfo())  

data class

sealed class ApiResponse {
    abstract fun handle()

    data class Success(val data: String) : ApiResponse() {
        override fun handle() = println("Success: $data")
    }

    data class Error(val code: Int, val message: String) : ApiResponse() {
        override fun handle() = println("Error $code: $message")
    }

    object Loading : ApiResponse() {
        override fun handle() = println("Loading...")
    }
}

fun main() {

    ApiResponse.Success("Data loaded").handle()  
    ApiResponse.Error(404, "Not found").handle() 
    ApiResponse.Loading.handle()                 
}

data class 프로퍼티는 var, val 선언이 가능하다. 다만 모든 프로퍼티를 val로 만들어서 data class를 불변 클래스로 만드는 것을 권장합니다
shallow copy이기 때문에 원시값 타입이 아닌 참조타입이 필드에 있는 경우 copy를 오버라이드 해야 깊은 복사가 됩니다
copy 메서드를 통해 새로운 불변 객체를 생성하기 쉽습니다

setter, getter

코틀린에서는 기본적으로 프로퍼티를 선언할 때 public한 getter와 (var의 경우) setter를 자동으로 생성합니다

setter, getter

class Person2 {
    var name: String = ""
    var age: Int = 0
}

custom setter, getter

class Person2 {
    var name: String = ""
        get() = field.uppercase()
        set(value) {
            field = "Name: $value"
        }

    var age: Int = 0
        get() = field
        set(value) {
            field = if (value >= 0) value else throw IllegalArgumentException("Age can't be negative")
        }
}

private setter

class Person2 {
    var name: String = ""
        private set

    var age: Int = 0
        private set

    fun updateInfo(newName: String, newAge: Int) {
        name = newName
        age = newAge
    }
}


fun main() {

    val person = Person2()
    person.updateInfo("Alice", 30)
    println("${person.name}, ${person.age}")  
}

'kotlin > 기초' 카테고리의 다른 글

kotlin 코루틴 정리 - 1  (0) 2024.08.25
kotlin 문법 기초 - 3  (0) 2024.07.17
kotlin 문법 기초 - 2  (1) 2024.07.14
kotlin 문법 기초-1  (0) 2024.07.10