Kotlin 기본 문법7 - 클래스 추가

KWANWOO·2022년 1월 3일
0

Kotlin 언어 배우기

목록 보기
7/8
post-thumbnail

코틀린 기본 문법 정리7 - 클래스 추가

안드로이드 네이티브 앱 개발 공부를 위해 Kotlin의 기본적이면서도 중요한 문법들을 정리해보았다. 이 글은 앞서 작성한 클래스에 이어지는 내용이다.

1. companion object

자바의 static 대신에 사용되는 것으로 정적인 메소드나 변수를 선언할 때 사용한다.

class Book private constructor(val id: Int, val name: String){
    companion object {
        val myBook = "name"
        fun create() : Book = Book(id: 0, myBook)
    }
}
  • 아래의 예시와 같이 접근 가능
val book : Book = Book.Companion.create() //Book.create()로 작성가능
println("${book.id} and ${book.name})

companinon object의 이름을 설정할 수도 있다.

class Book private constructor(val id: Int, val name: String){
    companion object BookFactory {
        val myBook = "name"
        fun create() : Book = Book(id: 0, myBook)
    }
}
  • 아래의 예시와 같이 접근 가능
val book : Book = Book.BookFactory.create() //Book.create()로 작성가능
println("${book.id} and ${book.name})

companion object는 상속을 받을 수도 있다.

class Book private constructor(val id: Int, val name: String){
    companion object BookFactory: IdProvider {
        //override 필요!!!!
        override getId() : Int {
            return 1
        }
        val myBook = "name"
        fun create() : Book = Book(getId(), myBook)
    }
}

interface IdProvider {
    fun getId(): Int
}

2. object 클래스

object는 다른 클래스들과 다르게 PersonFactory 객체는 앱을 실행할 때 단 한번 생성되는 싱글톤 패턴을 적용한다.

object PersonFactory{
    val people : MutableList<Person> = mutableListOf<Person>()
    
    fun makePerson(name: String, age: Int) : Person {
        val person = Person(name, age)
        people.add(person)
        return person
    }
}

data class Person(val name: String, val age: Int)
  • 아래와 같이 people에 값을 추가할 수 있고 PersonFactory는 객체의 생성 없이 사용 가능하다. 이때 싱글톤 패턴이 적용되므로 people의 길이를 출력해보면 2가 나온다.
val person1 = PersonFactory.makePerson("Kim", 25)
val person2 = PersonFactory.makePerson("Lee", 21)

println(PersonFactory.people.size.toString()) // 2

3. 추상 클래스

클래스나 메소드 앞에 abstract를 붙여 추상 클래스 또는 추상 메소드를 정의한다. 추상 클래스에 추상 메소드가 있는 경우 반드시 자식 클래스에서 override가 필요하다.

  • 추상 클래스의 경우 abstract를 사용하고 따로 클래스나 메소드에 open 키워드를 사용하지 않아도 된다.
abstract Game {
    var name = "Kim"
    abstract fun start() // 재정의 필요!!!!
    fun end() = println("End Game")
}

class NewGame: Game() {
    override fun start() {
        println("Start Game")
    }
}

4. 인터페이스

코틀린에서는 interface 클래스 내부의 함수가 바디를 가질 수 있고 멤버 변수를 추상 변수로 만들어 사용할 수도 있으며, get() 또는 set()을 통해서 값을 지정할 수도 있다.

  • 아래는 인터페이스의 예시이다. 상속을 받을 경우에는 콜론(:)을 사용한다. 인터페이스는 함수를 무조건 override 해야한다.
interface Person {
    fun eat()
    fun sleep()
}

class Student : Person {
    override fun eat() {

    }

    override fun sleep() {

    }
}
  • 코틀린에서는 인터페이스에서도 함수를 구현할 수 있다. 이렇게 인터페이스에서 구현된 함수는 override 하지 않아도 된다.
  • abstract로 정의된 부분은 반드시 재정의 해야한다.
interface Person {
    fun eat() {
        println("eat")
    }
    fun sleep() {
        println("sleep")
    }

    abstract fun study() // override 필요!!!!
}

class Student : Person {
    override fun study() {

    }
}

코틀린 전체 기본문법 정리 끝!!!! (・`◡´・)ゝ

코틀린의 전체적인 기본 문법 정리가 끝났다. 총 7개의 포스팅으로 구성되었다. 이 중에서 클래스는 내용이 많아서 두 개의 포스팅으로 나누게 되었다.ㅎㅎ 전체적인 코틀린의 기본적인 문법을 정리하면서 느낀점은 대체적으로 자바보다 훨씬 코드가 간결해 졌다는 점이었다. 코틀린이 익숙해지면 자바를 사용할 때보다 더 깔끔한 코드를 작성할 수 있을 것 같은 느낌이 든다. 추가로 더 정리할 문법이 생각나면 그때 그때 추가할 예정입니당~!!

📄 Reference

profile
관우로그

0개의 댓글