코드 여행 일기

코틀린의 클래스: 정의부터 상속, 데이터 클래스까지 본문

코딩/kotlin

코틀린의 클래스: 정의부터 상속, 데이터 클래스까지

할짝개발자 2024. 5. 30. 22:09
728x90
반응형

코틀린(Kotlin)은 객체 지향 프로그래밍을 지원하며, 클래스를 사용하여 데이터를 구조화하고 기능을 정의할 수 있습니다. 이번 포스트에서는 코틀린의 클래스와 관련된 다양한 개념들을 자세히 알아보겠습니다.


 

클래스 정의

코틀린에서 클래스를 정의하는 기본 문법은 다음과 같습니다:

class 클래스이름 {
    // 프로퍼티
    // 메서드
}

 

예제: 간단한 클래스 정의

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

    fun introduce() {
        println("안녕하세요, 저는 ${name}이고, 나이는 ${age}살 입니다.")
    }
}

fun main() {
    val person = Person()
    person.name = "홍길동"
    person.age = 25
    person.introduce() // 출력: 안녕하세요, 저는 홍길동이고, 나이는 25살입니다.
}

 

이 예제에서 Person 클래스는 name과 age라는 두 개의 프로퍼티와 introduce라는 메서드를 가지고 있습니다.

 

생성자

코틀린 클래스는 기본 생성자(primary constructor)와 보조 생성자(secondary constructor)를 가질 수 있습니다.

 

기본 생성자

기본 생성자는 클래스 헤더에 정의됩니다.

class Person(val name: String, var age: Int) {
    fun introduce() {
        println("안녕하세요, 저는 ${name}이고, 나이는 ${age}살입니다.")
    }
}

fun main() {
    val person = Person("홍길동", 25)
    person.introduce() // 출력: 안녕하세요, 저는 홍길동이고, 나이는 25살입니다.
}

 

보조 생성자

보조 생성자는 constructor 키워드를 사용하여 정의됩니다.

class Person {
    var name: String
    var age: Int

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

    fun introduce() {
        println("안녕하세요, 저는 ${name}이고, 나이는 ${age}살입니다.")
    }
}

fun main() {
    val person = Person("홍길동", 25)
    person.introduce() // 출력: 안녕하세요, 저는 홍길동이고, 나이는 25살입니다.
}

 

프로퍼티

코틀린 클래스의 프로퍼티는 변수 선언과 비슷합니다. 프로퍼티는 기본값을 가질 수 있으며, 커스텀 접근자(getter, setter)를 정의할 수 있습니다.

 

기본 프로퍼티

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

 

커스텀 접근자

class Person {
    var name: String = "Unknown"
        get() = field.uppercase()
        set(value) {
            field = value.trim()
        }
    var age: Int = 0
        set(value) {
            field = if (value > 0) value else 0
        }
}

 

이 예제에서 name 프로퍼티는 항상 대문자로 반환되며, age 프로퍼티는 0보다 큰 값만 설정됩니다.

 

상속

코틀린에서는 :를 사용하여 상속을 구현합니다. 기본적으로 모든 클래스는 Any 클래스를 상속받습니다.

 

예제: 상속

open class Person(val name: String, var age: Int) {
    open fun introduce() {
        println("안녕하세요, 저는 ${name}이고, 나이는 ${age}살입니다.")
    }
}

class Student(name: String, age: Int, val studentId: String) : Person(name, age) {
    override fun introduce() {
        println("안녕하세요, 저는 ${name}이고, 나이는 ${age}살이며, 학생 번호는 ${studentId}입니다.")
    }
}

fun main() {
    val student = Student("홍길동", 20, "12345")
    student.introduce() // 출력: 안녕하세요, 저는 홍길동이고, 나이는 20살이며, 학생 번호는 12345입니다.
}

 

이 예제에서 Student 클래스는 Person 클래스를 상속받고, introduce 메서드를 오버라이드합니다.

 

인터페이스

코틀린의 인터페이스는 메서드 선언과 구현을 모두 포함할 수 있습니다.

 

예제: 인터페이스

interface Drivable {
    fun drive()
}

class Car : Drivable {
    override fun drive() {
        println("차가 달립니다.")
    }
}

fun main() {
    val car = Car()
    car.drive() // 출력: 차가 달립니다.
}

 

이 예제에서 Car 클래스는 Drivable 인터페이스를 구현합니다.

 

데이터 클래스

데이터 클래스는 데이터 저장을 위해 주로 사용되는 클래스로, data 키워드를 사용하여 정의됩니다. 자동으로 equals, hashCode, toString 메서드가 생성됩니다.

 

예제: 데이터 클래스

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

fun main() {
    val person1 = Person("홍길동", 25)
    val person2 = Person("홍길동", 25)

    println(person1) // 출력: Person(name=홍길동, age=25)
    println(person1 == person2) // 출력: true
}

 

내부 클래스와 중첩 클래스

코틀린에서는 클래스 내에 다른 클래스를 정의할 수 있습니다. 기본적으로 중첩 클래스는 정적 클래스이며, 내부 클래스는 inner 키워드를 사용하여 정의합니다.

 

예제: 내부 클래스

class Outer {
    private val bar: Int = 1
    inner class Inner {
        fun foo() = bar
    }
}

fun main() {
    val outer = Outer()
    val inner = outer.Inner()
    println(inner.foo()) // 출력: 1
}

 

언제 어떤 클래스를 사용할까?

  • 일반 클래스: 일반적인 객체 지향 프로그래밍에서 데이터와 메서드를 묶어 사용할 때.
  • 데이터 클래스: 주로 데이터를 저장하고 불변 객체를 사용할 때.
  • 상속: 클래스 간의 공통 기능을 공유하고 재사용할 때.
  • 인터페이스: 클래스가 구현해야 하는 계약을 정의할 때.
  • 내부 클래스: 외부 클래스와 밀접하게 관련된 클래스를 정의할 때.

 

코틀린의 클래스 관련 기능을 활용하면 코드의 구조화와 재사용성을 크게 향상시킬 수 있습니다.

이 포스트가 코틀린의 클래스 개념을 이해하는 데 도움이 되길 바랍니다. 

 

728x90
반응형