Lewis's Tech Keep
[Kotlin] 코틀린 적응기 - 접근 제어, object 본문
시작
접근 제어는 차이가 있고 이를 인식 해두는 면이 중요하다.
object는 const value를 저장할 때 자주 쓸 것 같아서 기억해두면 좋을 것 같다!
배우고 있는 것
https://www.inflearn.com/course/java-to-kotlin
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()
}
'Kotlin > Kotlin 적응기' 카테고리의 다른 글
[kotlin] 코틀린 적응기 - 배열 & 컬렉션, 함수 (0) | 2024.10.01 |
---|---|
[Kotlin] 코틀린 적응기 - 중첩 클래스, data class & enum class & sealed class (0) | 2024.10.01 |
[Kotlin] 코틀린 적응기 - 클래스, 상속 (1) | 2024.10.01 |
[Kotlin] 코틀린 적응기 - 제어문, 반복문, 예외, 함수 (0) | 2024.09.30 |
[Kotlin] 코틀린 적응기 - 변수, 타입, 연산자 (0) | 2024.09.29 |