이 튜토리얼에서는 Kotlin의 객체 지향 프로그래밍 개념에 대해 다룰 것입니다. Kotlin 클래스에 대해 자세히 설명하겠습니다. 또한 Kotlin 생성자, 접근 제한자 및 추상 클래스에 대해서도 살펴보겠습니다.
Kotlin 클래스
클래스는 함수와 속성을 그룹화하는 정의된 블루프린트입니다. Kotlin에서 클래스는 키워드
class
다음에 클래스 이름으로 정의됩니다. 본문은 중괄호 안에 작성됩니다.
class FirstClass {
}
클래스의 인스턴스는 다음과 같이 인스턴스화됩니다:
val firstClass = FirstClass()
var new = FirstClass() //here new is the name of the var.
Java와는 달리 Kotlin에서는 new
가 키워드가 아닙니다. Kotlin에서 기본적으로 클래스는 final입니다. 따라서 Java에서의 위 정의의 동등한 형태는 다음과 같을 것입니다:
public final class FirstClass {
}
따라서 Kotlin에서 기본적으로 클래스는 상속할 수 없습니다. 클래스를 비-final로 만들려면 키워드 open
을 추가해야 합니다.
open class Me{
}
open
주석은 다른 사람들이 이 클래스를 상속할 수 있도록 허용합니다.
Kotlin 클래스 예제
class 생성 및 속성과 몇 가지 함수를 가진 클래스를 만들어봅시다. 이 클래스의 함수 및 속성에 어떻게 접근하는지 살펴보겠습니다. 더 나아가 멤버 속성을 설정하는 방법도 살펴보겠습니다.
class User {
var loggedIn: Boolean = false
val cantChangeValue = "Hi"
fun logOn() {
loggedIn = true
}
fun logOff() {
loggedIn = false
}
}
fun main(args: Array<String>) {
val user = User()
println(user.loggedIn) //false
user.logOn()
println(user.loggedIn) //true
user.logOff()
println(user.loggedIn) //false
user.cantChangeValue = "Hey" //won't compile. Can't modify a final variable.
}
main
함수는 Test.kt
클래스에 속합니다. 멤버 및 함수에 접근하려면 도트 연산자를 사용해야 합니다. val
속성은 도트 연산자를 사용하여 다시 설정할 수 없습니다.
Kotlin init
Kotlin init 블록은 아래와 같이 정의됩니다.
class User {
init{
print("Class instance is initialised.")
}
var loggedIn: Boolean = false
val cantChangeValue = "Hi"
fun logOn() {
loggedIn = true
}
fun logOff() {
loggedIn = false
}
}
클래스가 인스턴스화될 때 가장 먼저 실행되는 코드는 init
블록 안에 있습니다. init
블록은 클래스가 어떤 종류의 생성자로든 인스턴스화될 때마다 실행됩니다. 클래스에 여러 초기화 블록을 작성할 수 있습니다. 아래와 같이 순차적으로 실행됩니다.
class MultiInit(name: String) {
init {
println("First initializer block that prints ${name}")
}
init {
println("Second initializer block that prints ${name.length}")
}
}
fun main(args: Array) {
var multiInit = MultiInit("Kotlin")
}
//다음이 로그 콘솔에 출력됩니다.
//Kotlin을 출력하는 첫 번째 초기화 블록
//6을 출력하는 두 번째 초기화 블록
Kotlin 클래스는 also
함수를 사용하여 선언 단계에서 속성을 출력할 수 있습니다. 아래와 같이 출력됩니다.
class MultiInit(name: String) {
val firstProperty = "First property: $name".also(::println)
init {
println("First initializer block that prints ${name}")
}
val secondProperty = "Second property: ${name.length}".also(::println)
init {
println("Second initializer block that prints ${name.length}")
}
}
fun main(args: Array) {
var multiInit = MultiInit("Kotlin")
}
//다음이 출력됩니다.
//첫 번째 속성: Kotlin
//Kotlin을 출력하는 첫 번째 초기화 블록
//두 번째 속성: 6
//6을 출력하는 두 번째 초기화 블록
Kotlin 생성자
Kotlin 생성자는 속성을 초기화하는 데 사용되는 특수 멤버 함수입니다. Kotlin의 생성자는 Java와는 다르게 작성되고 구조화됩니다. 기본적으로 클래스에는 아래와 같이 빈 생성자가 있습니다:
class Student {
var name: String
val age : Int
init {
name = "Anupam"
age = 24
}
init {
name = "Anupam Chugh"
//age = 26
}
}
fun main(args: Array) {
val student = Student()
println("${student.name} age is ${student.age}")
student.name = "Your"
//student.age = 26 //컴파일되지 않음. age는 val입니다
println("${student.name} age is ${student.age}")
}
//다음이 콘솔에 출력됩니다:
//Anupam Chugh 나이는 24입니다
//당신의 나이는 24입니다
기본 생성자
Kotlin의 기본 생성자는 다음과 같이 클래스 헤더에 정의됩니다.
class User(var name: String, var isAdmin: Boolean) {
init {
name = name + " @ JournalDev.com"
println("Author Name is $name. Is Admin? $isAdmin")
}
}
기본 생성자의 정의는 클래스 헤더 내부에 있습니다. 주의: 명시적으로 var
로 지정하지 않는 한, 기본적으로 생성자 인수는 val
입니다.
class User(name: String, isAdmin: Boolean)
위의 코드에서는 name 및 isAdmin 모두 재할당할 수 없습니다. 또는 클래스 내의 멤버 속성에 생성자 인수를 할당할 수도 있습니다.
class User(name: String, val isAdmin: Boolean) {
var username = name
val _isAdmin = isAdmin
init {
username= username + " @ JournalDev.com"
println("Author Name is $name. Is Admin? $_isAdmin")
}
}
fun main(args: Array) {
var user = User("Anupam",false)
user.isAdmin = true //won't compile since isAdmin is val
user._isAdmin = true //won't compile. Same reason.
user = User("Pankaj",true)
}
//로그 콘솔에 다음이 출력됩니다.
//작성자 이름은 Anupam입니다. 관리자인가요? false
//작성자 이름은 Pankaj입니다. 관리자인가요? true
Kotlin 생성자 기본 값
Kotlin은 다음과 같이 생성자에서 기본값을 지정할 수 있도록 합니다.
class User(name: String, var website: String = "JournalDev") {
init {
println("Author $name writes at $website")
}
init {
website = website + ".com"
println("Author $name writes at $website")
}
}
fun main(args: Array) {
var user = User("Anupam","JournalDev")
user = User("Pankaj","JournalDev")
}
//다음은 콘솔에 인쇄됩니다:
//저자 Anupam은 JournalDev에서 글을 씁니다.
//저자 Anupam은 JournalDev에서 글을 씁니다..com
//저자 Pankaj은 JournalDev에서 글을 씁니다.
//저자 Pankaj은 JournalDev에서 글을 씁니다..com
보조 생성자
보조 생성자는 constructor
키워드를 접두사로 사용하여 클래스 내부에 작성됩니다. 다음 예제가 이를 보여줍니다.
class Student {
var name: String
val age : Int
constructor(name: String, age: Int)
{
this.name = name
this.age = age
}
fun printDetails()
{
println("Name is $name and Age is $age")
}
}
fun main(args: Array) {
var student = Student("Anupam", 24)
student.printDetails()
}
//다음은 콘솔에 인쇄됩니다.
//이름은 Anupam이고 나이는 24입니다.
보조 생성자의 가장 일반적인 사용법은 하위 클래스에서 클래스를 다른 방식으로 초기화해야 할 때입니다. 클래스에 기본 생성자가 포함되어 있는 경우, 보조 생성자는 선언에서 이를 참조해야 합니다. 선언은 this
키워드를 사용하여 이루어집니다.
class Student(var name: String, val age: Int) {
var skill: String
init {
skill = "NA"
}
constructor(name: String, age: Int, skill: String) : this(name, age) {
this.skill = skill
}
fun printDetails() {
if (skill.equals("NA"))
println("Name is $name and Age is $age")
else
println("Name is $name and Age is $age Skill is $skill")
}
}
//다음은 로그 콘솔에 인쇄됩니다:
//이름은 Anupam이고 나이는 24입니다.
//이름은 Anupam이고 나이는 24입니다. Skill is Kotlin
init
블록은 skill
멤버 속성을 초기화하는 데 사용됩니다. 보조 생성자는 : this
를 사용하여 기본 생성자로 위임합니다.
사용자 정의 게터 및 세터
지금까지 클래스의 인스턴스에서 도트 연산자를 사용하여 속성에 액세스하고 수정했습니다. 액세스를 사용자 정의하는 방법을 알아보기 위해 set
및 get
구문을 사용해 보겠습니다.
class Name{
var post: String = "default"
set(value) {if(!post.isNotEmpty()) {
throw IllegalArgumentException(" Enter a valid name")
}
field = value
print(value)
}
}
fun main(args: Array<String>) {
var name = Name()
name.post = "Kotlin Classes"
name.post = ""
name.post = "Kotlin Data Classes Our Next Tutorial"
}
다음은 로그 콘솔에 인쇄됩니다:
Kotlin Classes
Exception in thread "main" java.lang.IllegalArgumentException: Enter a valid name
at Name.setPost(Test.kt:16)
at TestKt.main(Test.kt:78)
세터의 field
변수는 이전 값 저장합니다. 게터를 추가해 봅시다.
class Name{
var post: String = "default"
set(value) {if(!post.isNotEmpty()) {
throw IllegalArgumentException(" Enter a valid name")
}
field = value
}
get() {
return field.capitalize()
}
}
fun main(args: Array) {
var name = Name()
name.post = "kotlin classes"
println(name.post)
name.post = "kotlin data Classes our next Tutorial"
println(name.post)
}
//다음이 인쇄됩니다:
//Kotlin 클래스
//Kotlin 데이터 클래스, 다음 강의
capitalize()
는 문자열의 첫 글자를 대문자로 만듭니다. 참고: 속성이 val
인 경우 set
메서드가 컴파일되지 않습니다.
Kotlin 가시성 수정자
- Public: 이 수정자가 있는 모든 클래스, 함수, 속성, 인터페이스 또는 객체는 보이며 어디에서나 액세스할 수 있습니다.
- 개인: 이 수정자로 정의된 클래스/함수는 동일한 파일 내에서만 액세스할 수 있습니다. 이 수정자가 있는 클래스/함수의 멤버/속성은 해당 블록 내에서만 액세스할 수 있습니다.
- 보호된: 이 수정자는 개인과 같지만 하위 클래스 내에서 가시성 및 액세스를 허용합니다.
- 내부: 이 수정자가 있는 클래스/인터페이스/함수는 동일한 모듈 내에서만 접근할 수 있습니다.
가시성 수정자는 생성자에도 적용됩니다. 기본 생성자에 수정자를 할당하려면 클래스 헤더의 생성자 옆에 키워드 constructor
를 지정해야 합니다.
class Student private constructor (var name: String, val age: Int) {
var skill: String
init {
skill = "NA"
}
constructor(name: String, age: Int, skill: String) : this(name, age) {
this.skill = skill
}
fun printDetails() {
if (skill.equals("NA"))
println("Name is $name and Age is $age")
else
println("Name is $name and Age is $age Skill is $skill")
}
}
fun main(args: Array) {
var student = Student("Anupam",24,"Kotlin")
student.printDetails()
}
//prints
//이름은 Anupam이고 나이는 24 기술은 Kotlin
개인 생성자는 클래스 외부에서 호출할 수 없습니다. 위의 코드에서 클래스를 다른 함수에서만 보조 생성자를 사용하여 인스턴스화할 수 있습니다.
Kotlin 추상 클래스
Java와 마찬가지로 Kotlin에서 추상 클래스를 선언하는 데 abstract
키워드를 사용합니다. 추상 클래스는 인스턴스화할 수 없습니다. 그러나 하위 클래스에서 상속될 수 있습니다. 기본적으로 추상 클래스의 멤버는 다른 대상이 명시되지 않는 한 비추상입니다.
abstract class Person(name: String) {
init {
println("Abstract Class. init block. Person name is $name")
}
abstract fun displayAge()
}
class Teacher(name: String): Person(name) {
var age : Int
init {
age = 24
}
override fun displayAge() {
println("Non-abstract class displayAge function overridden. Age is $age")
}
}
fun main(args: Array) {
val person = Teacher("Anupam")
person.displayAge()
}
//다음은 콘솔에 출력됩니다.
//추상 클래스. 초기 블록. 사람 이름은 Anupam
//비추상 클래스. 나이는 24
주의: 추상 클래스는 기본적으로 open
상태입니다. 따라서 하위 클래스화를 허용하려면 open 수정자를 추가하는 것이 필요하지 않습니다. override
키워드는 하위 클래스에서 메서드를 재정의하는 데 사용됩니다. 이 튜토리얼에서는 코틀린 클래스의 기본 사항을 다뤘습니다. 데이터 클래스, 실드 클래스, 상속 등과 같은 더 많은 내용이 아직 남아 있습니다. 다가오는 튜토리얼에서 이에 대해 다룰 것입니다. 참고 자료: 코틀린 문서
Source:
https://www.digitalocean.com/community/tutorials/kotlin-class-constructor