5) 클래스와 객체

SOCICAL·2024년 6월 22일

android

목록 보기
16/20
post-thumbnail

# 클래스 선언과 인스턴스 생성

클래스: 객체를 생성하기 위한 청사진이다.
Kotlin에서 클래스를 선언하는 방법은 다음과 같다.

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

인스턴스를 생성하고 값을 할당하는 방법은 다음과 같다.

fun main() {
    val person = Person()
    person.name = "John"
    person.age = 30

    println("Name: ${person.name}, Age: ${person.age}")
}

# 생성자

Kotlin에서는 기본 생성자와 보조 생성자를 제공한다.

- 기본 생성자

기본 생성자는 클래스 헤더에 선언된다.

class Person(val name: String, var age: Int)

인스턴스를 생성할 때는 다음과 같이 생성자 매개변수를 제공한다.

fun main() {
    val person = Person("John", 30)
    println("Name: ${person.name}, Age: ${person.age}")
}

- 보조 생성자

보조 생성자는 constructor 키워드를 사용하여 선언된다.

class Person {
    var name: String
    var age: Int

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

보조 생성자를 사용하여 인스턴스를 생성할 수 있다.

fun main() {
    val person = Person("John", 30)
    println("Name: ${person.name}, Age: ${person.age}")
}

# 초기화 블록

  • 클래스가 인스턴스화 될 때 실행된다.
  • 주로 기본 생성자와 함게 사용 된다.
class Person(val name: String, var age: Int) {
    init {
        println("Name: $name, Age: $age")
    }
}

fun main() {
    val person = Person("John", 30)
}

# 상속

Kotlin에서 클래스는 기본적으로 final(상속 불가)입니다. 상속을 허용하려면 open키워드를 사용해야 한다.

open class Animal(val name: String) {
    open fun sound() {
        println("Animal makes a sound")
    }
}

class Dog(name: String) : Animal(name) {
    override fun sound() {
        println("Dog barks")
    }
}

fun main() {
    val dog = Dog("Buddy")
    dog.sound() // 출력: Dog barks
}

# 추상 크래스

추상 클래스는 인스턴스를 생성할 수 없으며, 추상 멤버는 반드시 하위 클래스에서 구현해야 한다.

abstract class Animal(val name: String) {
    abstract fun sound()
}

class Dog(name: String) : Animal(name) {
    override fun sound() {
        println("Dog barks")
    }
}

fun main() {
    val dog = Dog("Buddy")
    dog.sound() // 출력: Dog barks
}

# 인터페이스

  • 다중 상속을 허용한다.
  • 구현해야 할 메서드를 정의한다.
interface Drivable {
    fun drive()
}

class Car : Drivable {
    override fun drive() {
        println("Car is driving")
    }
}

fun main() {
    val car = Car()
    car.drive() // 출력: Car is driving
}

# 데이터 클래스

  • 주로 데이터 저장을 목적으로 한다.
  • equals(), hashCode(), toString() 등의 메서드를 자동으로 생성한다.
data class User(val name: String, val age: Int)

fun main() {
    val user = User("John", 30)
    println(user) // 출력: User(name=John, age=30)
}

# 객체 선언

Kotlin에서는 싱글톤 패턴을 객체 선언을 통해 쉽게 구현할 수 있다.

object Singleton {
    var name: String = "Singleton"

    fun printName() {
        println(name)
    }
}

fun main() {
    Singleton.printName() // 출력: Singleton
}

# 동반 객체

  • 클래스 내부에 선언된 객체이다.
  • 클래스의 정적 메서드와 변수를 정의하는 데 사용된다.
class MyClass {
    companion object {
        var name: String = "Companion"

        fun printName() {
            println(name)
        }
    }
}

fun main() {
    MyClass.printName() // 출력: Companion
}

(Kotlin 1.5+)

- 값 클래스를 사용한 간결한 데이터 구조

값 클래스는 메모리 효율적인 데이터 클래스를 만들 수 있다.

@JvmInline
value class UserId(val id: String)

fun main() {
    val user = UserId("1234")
    println(user.id) // 출력: 1234
}

- Sealed 클래스와 인터페이스

Sealed 클래스를 사용하면 상속 계층을 더 안전하게 관리 할 수 있다.

sealed class Result {
    data class Success(val data: String) : Result()
    object Failure : Result()
}

fun handleResult(result: Result) {
    when (result) {
        is Result.Success -> println("Data: ${result.data}")
        Result.Failure -> println("Operation failed")
    }
}

fun main() {
    val result: Result = Result.Success("Kotlin")
    handleResult(result) // 출력: Data: Kotlin
}

0개의 댓글