Lewis's Tech Keep

[Kotlin] 코틀린 적응기 - 접근 제어, object 본문

Kotlin/Kotlin 적응기

[Kotlin] 코틀린 적응기 - 접근 제어, object

Lewis Seo 2024. 10. 1. 21:30

시작

접근 제어는 차이가 있고 이를 인식 해두는 면이 중요하다.

object는 const value를 저장할 때 자주 쓸 것 같아서 기억해두면 좋을 것 같다!

 

배우고 있는 것

https://www.inflearn.com/course/java-to-kotlin

 

자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide) 강의 | 최태현 - 인프런

최태현 | 이 강의를 통해 Kotlin 언어의 특성과 배경, 문법과 동작 원리, 사용 용례, Java와 Kotlin을 함께 사용할 때에 주의할 점 등을 배울 수 있습니다., 요즘 대세인 코틀린을 공부하고 싶다면?⭐ J

www.inflearn.com

 

 

1. 접근 제어

java -> kotlin


public : 모든 곳에서 접근 가능 -> 동일

 

// 파일 최상단에서 사용 불가능
protected : 같은 패키지 or 상속받은 하위 패키지 -> 같은 패키지가 아닌 선언된 클래스에서만 가능

 

// 같은 모듈 (한번에 컴파일 되는 kotlin 코드, IDEA Module, Maven Project, Source Set)
default : 같은 패키지에서만 접근 가능 -> internal : 같은 모듈에서만 접근 가능


private : 선언된 클래스 내에서만 접근 가능 -> 동일

 

kotlin은 기본적으로 default 가 아니라 public이다. 접근 제어를 바꾼다면 그 부분에서 보통 다 키워드를 넣어준다.

// 생성자 접근 지시어를 붙이려면 constructor 키워드가 필요
// private 생성자 생성 방법
class Cat private constructor()
// 유틸 클래스 생성할 때 파일 생성 한 다음 밑에 코드 넣으면 잘 됨
fun isDirectoryPath(path: String): Boolean {
    return path.endsWith(path)
}

class Car(
    internal val name: String,
    private var owner: String,
    _price: Int
) {

    val price = _price
}

 

주의사항

 

kotlin코드를 java에서 쓰는 경우
- Java 코드가 상위 모듈이라면 kotlin이 바이트코드로 변할 때 public 이로 변하기 떄문에 접근가능
- Java 코드에서 kotlin의 protected는 같은 패키지 내에서 접근 가능해짐

 

2. object

static 처럼 쓰기

 

companion object 키워드를 통해 가능하다.

완전 static과 같지는 않다.

클래스에 종속되었다기보다 클래스와 동행하는 유일한 오브젝트다.

class Person private constructor(
    var name: String,
    var age: Int
){

    // static replacement
    // 클래스와 동행하는 유일한 오브젝트
    // 하나의 객체로 취급
    companion object {
        // val 만 있으면 런타임에 할당되지만
        // const val 이 있으면 컴파일 타임에 할당됨
        private const val MIN_AGE = 1
        
    }
}

 

하나의 객체로 취급된다.

따라서 interface 구현과 같은 것도 가능하다.

class Person private constructor(
    var name: String,
    var age: Int
){

    companion object : Log {
        override fun log() {
            println("로그")
        }
    }
}

interface Log {

    fun log()
}

 

jvmStatic

 

Java에서 가져다 쓸 때 진짜 static처럼 쓰고싶다면 @JvmStatic annotation 을 추가한다.

class Person private constructor(
    var name: String,
    var age: Int
){
    companion object {

        // annotation 추가 시 Java에서 static으로 사용가능
        @JvmStatic
        fun newBaby(name: String): Person {
            return Person(name, MIN_AGE)
        }
    }
}

 

singleton

 

singleton으로 생성하고 싶다면 클래스 파일 아래에 Singleton으로 생성해버리면 된다.

class Person private constructor(
    var name: String,
    var age: Int
){

}

object Singleton {
    val a: Int = 0
}


익명 클래스로 이용

 

object : interface { 구현 } 으로 익명 클래스를 사용할 수 있다.

fun main() {
    // 익명 클래스
    moveSth(object : Movable {
        override fun move() {
            println("익명 무브")
        }

        override fun fly() {
            println("익명 날기")
        }
    })
}

private fun moveSth(movable: Movable) {
    movable.move()
    movable.fly()
}
Comments