Learn & Record

Kotlin (companion object, data class 데이터 클래스, 접근 제한자, 클래스의 상속, 추상클래스) 본문

Dev/Kotlin

Kotlin (companion object, data class 데이터 클래스, 접근 제한자, 클래스의 상속, 추상클래스)

Walker_ 2024. 4. 17. 15:03

1. Compaion object

class Dog {
    companion object {
        var name: String = "None"
        fun printName() {
            println("Dog 이름은 ${name}입니다.")
        }
    }
    fun walk() {
        println("Dog가 뛰어갑니다.")
    }
}

fun main() {
    Cat.name = "mikey"
    Cat.printName() // Cat의 이름은 mikey입니다.

    // companion object 안의 코드 사용하기
    Dog.name = "Linda"
    Dog.printName() // Dog 이름은 Linda입니다.
//    Dog.walk() // companion object 밖에 선언된 메서드는 사용하지 못함

    // companion object 밖에 코드 사용하기
    val dog = Dog()
    dog.walk() // Dog가 뛰어갑니다.
}

 

2. data class 데이터 클래스

데이터 클래스

코틀린은 간단한 값의 저장 용도로 데이터 클래스 data class를 제공
데이터 클래스의 기본 형식은 다음과 같음

data class 클래스이름 (val 파라미터1: 타입, var 파라미터2: 타입)

데이터 클래스를 정의할 때 class 앞에 data 키워드를 사용해야 하고, 생성자 파라미터 앞에 입력하는 var 또는 val 키워드를 생략 할 수 없음

생성하는 코드는 일반 클래스와 동일하게 작성
fun main() {
    // 정의 - 주로 코드 블록(클래스 스코프)을 사용하지 않고 간단하게 작성
    data class UserData(val name: String, var age: Int)

    // 생성 - 일반 class의 생성자 함수를 호출하는 것과 동일
    val userData = UserData("Michael", 21)

    // name은 val로 선언되었기 때문에 변경 불가능
//    userData.name = "sindy"

    // age는 var로 선언되었기 때문에 변경 가능
    userData.age = 19

    // 1) toString() 메서드와 copy() 메서드
    // 일반 클래스에서 toString() 메서드를 호출하면 인스턴스의 주소값을 반환하지만, 데이터 클래스는 값을 반환하기 때문에 실제 값을 모니터링 할 때 좋음
    println("userData는 ${userData}")
    println(userData.toString())

    // 또 copy() 메서드로 간단하게 값을 복사할 수 있음
    var newData: UserData = userData.copy()
    println(newData)
    
    /*
    이처럼 클래스와 사용법이 동일하지만 주로 네트워크를 통해 데이터를 주고 받거나, 혹은 로컬 앱의 데이터베이스에서 데이터를 다루기 위한 용도로 사용
     */

    data class Memo(val title:String, val content: String, var isDone: Boolean)
    val memo1 = Memo("마트 가기", "계란, 우유, 빵", false)

    /*
    데이터 클래스는 toString(), copy()와 같은 메서드를 자동으로 만들어줌.
    각 메서드의 역할은 다음과 같음.

    * toString() : 객체에 포함되어 있는 데이터를 출력하여 볼 수 있음. 생성자에 포함된 프로퍼티만 출력
    * copy() : 객체의 속성들을 복사하여 반환하는 메서드이며 인수로 받은 프로퍼티만 해당 값으로 바뀌어 복사해줌
     */
    val memo2 = memo1.copy(content = "칫솔, 과자") // content 프로퍼티 변경
    println(memo1.toString()) // Memo(title=마트 가기, content=계란, 우유, 빵, isDone=false)
    println(memo2.toString()) // Memo(title=마트 가기, content=칫솔, 과자, isDone=false)
}

 

3. 접근 제한자 

 - 접근 제한자는 "누구에게 클래스의 메서드와 변수를 공개할 것인가?"를 정하는 것.

 - 코틀린 클래스의 기본 속성과 메서드는 public

 - public 이외에도 private, protected, internal 접근 제한자가 있음

 

 - 각각의 접근 제한자 범위

 - pulbic : 코틀린의 기본 접근 제한자. 어디서나 접근 가능

 - internal : 같은 모듈 내에서 접근 가능

 - (안드로이드 개발 시에는 한 프로젝트 안에 있으면 같은 모듈이라고 보면 됨)

 - protected : 자식 클래스에서는 접근할 수 있음

 - private : 해당 클래스 내부에서만 접근 할 수 있음

 

4. 클래스의 상속

 - 코틀린에서 클래스의 상속받으려면 부모 클래스에 open 키워드를 추가해야 됨

 - 메서드도 자식 클래스에서 오버라이딩하려면 부모 클래스의 메서드에 open 키워드를 추가

 

fun main() {
    open class Flower {
        open fun waterFlower() {
            println("water flower")
        }
    }
    // 콜론 : 을 이용해 상속을 나타내면 됨
    class Rose: Flower() {
        override fun waterFlower() {
            super.waterFlower()
            println("Rose is water flower")
        }
    }
    val rose = Rose() // 객체 생성
    rose.waterFlower()
}

 

5. 추상클래스

 - 추상 클래스는 그 자체로는 객체를 만들 수 없는 클래스로, 일반적으로 추상 메서드가 포함된 클래스를 말함

 - 추상 메서드란 아직 구현되지 않고 추상적으로만 존재하는 메서드

 

 - 추상 클래스는 자체로는 직접 객체를 만들 수 없고 자식클래스에서 추상 메서드를 구현한 다음,

class `04_추상클래스` {
    abstract class Game {
        fun startGone() {
            println("게임을 시작했습니다.")
        }

        // 추상 메서드
        abstract fun printName()
    }

    class OverWatch : Game() {
        override fun printName() { // 추상메서드 구현
            println("오버워치입니다.")
        }
    }
}

fun main() {
    val overWatch = `04_추상클래스`.OverWatch()
    overWatch.startGone() // Game 클래스 메서드
    overWatch.printName() // OverWatch 클래스에서 구현한 메서드
}

 



공부 과정을 정리한 것이라 내용이 부족할 수 있습니다.

부족한 내용은 추가 자료들로 보충해주시면 좋을 것 같습니다.

읽어주셔서 감사합니다 :)