클래스: 객체를 생성하기 위한 청사진이다.
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 }
값 클래스는 메모리 효율적인 데이터 클래스를 만들 수 있다.
@JvmInline value class UserId(val id: String) fun main() { val user = UserId("1234") println(user.id) // 출력: 1234 }
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 }