코드 여행 일기
코틀린의 클래스: 정의부터 상속, 데이터 클래스까지 본문
코틀린(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
}
언제 어떤 클래스를 사용할까?
- 일반 클래스: 일반적인 객체 지향 프로그래밍에서 데이터와 메서드를 묶어 사용할 때.
- 데이터 클래스: 주로 데이터를 저장하고 불변 객체를 사용할 때.
- 상속: 클래스 간의 공통 기능을 공유하고 재사용할 때.
- 인터페이스: 클래스가 구현해야 하는 계약을 정의할 때.
- 내부 클래스: 외부 클래스와 밀접하게 관련된 클래스를 정의할 때.
코틀린의 클래스 관련 기능을 활용하면 코드의 구조화와 재사용성을 크게 향상시킬 수 있습니다.
이 포스트가 코틀린의 클래스 개념을 이해하는 데 도움이 되길 바랍니다.
'코딩 > kotlin' 카테고리의 다른 글
코틀린의 함수: 정의부터 고차 함수까지 (0) | 2024.05.29 |
---|---|
코틀린의 while 문: 기초부터 응용까지 (0) | 2024.05.28 |
코틀린의 for 문: 반복 작업의 강력한 도구 (1) | 2024.05.27 |
코틀린의 when 문: 다중 조건 처리의 강력한 도구 (0) | 2024.05.26 |
코틀린의 if 문: 조건문부터 표현식까지 (0) | 2024.05.25 |