Kotlin에서의 접근 제어
Java에는 4종류의 접근 지시어가 있다.
public : 모든 곳에서 접근 가능
protected : 같은 패키지 또는 하위 클래스에서만 접근 가능
default : 같은 패키지에서만 접근 가능 (기본값)
private : 선언된 클래스 내에서만 접근 가능
Kotlin에도 4종류의 접근 지시어가 있다.
public : 모든 곳에서 접근 가능 (기본값)
protected : 선언된 클래스 또는 하위 클래스에서만 접근 가능
internal : 같은 모듈에서만 접근 가능
private : 선언된 클래스 내에서만 접근 가능
* Kotlin에선 패키지를 namespaces를 관리하기 위한 용도로만 사용하고 가시성 제어에는 사용 X
* 모듈 : 한 번에 컴파일되는 Kotlin 코드
Kotlin에서의 Object 키워드
스태틱 함수와 변수
public class JavaPerson {
private static final int MIN_AGE = 1;
public static JavaPerson newBaby(String name) {
return new JavaPerson(name, MIN_AGE);
}
private String name;
private int age;
private JavaPerson(String name, int age) {
this.name = name;
this.age = age;
}
}
위 코드를 Kotlin코드로 바꿀 시 아래와 같이 변경된다.
class Person private constructor(var name: String, var age: Int) {
companion object {
val MIN_AGE = 1
fun newBaby(name: String): Person {
retrun Person(name, MIN_AGE)
}
}
}
Kotlin에서는 static이 존재하지 않고 companion object라는 동행 객체로 작성한다.
static : 클래스가 인스턴스화 될 때 새로운 값이 복제되는게 아니라 정적으로 인스턴스끼리의 값을 공유
companion object : 클래스와 동행하는 유일한 object
위 코드의 companion object 속 val 앞에 const 를 붙이지 않으면 런타임시 변수 할당
const 를 붙이면 컴파일시 변수를 할당을 한다.
또한 const는 상수로 기본 타입과 String에만 붙일 수 있다.
companion object는 하나의 객체로 간주되어 이름을 붙일 수 있고 interface도 구현할 수 있다.
또한 유틸성 함수를 넣어도 되지만 최상단 파일을 활용하는 것을 추천한다.
싱글톤
private static final JavaSingleton INSTANCE = new JavaSingleton();
private JavaSingleton() {}
public static JavaSingleton getInstance() {
return INSTANCE;
}
위 코드는 Java의 singleton이다.
object Singleton { var a: Int = 0 } 이와 같이 object만 붙여주면 끝이다.
익명클래스
public static void main(String[] args) {
moveSomething(new Movable() {
@Override
public void move() { System.out.println("움직인다~~"); }
@Override
public void fly() { System.out.println("난다!!!!") }
});
}
private static void moveSomething(Movable movable) {
movable.fly();
movable.move();
}
이런 식으로 Java에서는 익명 클래스를 만들 때 new Movable로 객체를 생성해줘야 했다.
하지만 Kotlin에서는 object : Movable {} 로 가능해서
아래 코드와 같이 바꿀 수 있다.
fun main() {
moveSomething(object : Movable {
override fun move() {
println("무브")
}
override fun fly() {
println("날다")
}
})
}
private fun moveSomething(movable: Movable) {
movable.move()
movable.fly()
}