코틀린에서는 java의 static인 정적인 메서드를 만들 수 있는 키워드를 지원하지 않는다. 대신 companion object를 사용해서 정적인 메서드를 사용할 수 있다. 클래스 안에 정의된 객체 중 하나에 companion이라는 특별한 표시를 붙이면 그 클래스의 동반 객체로 만들 수 있다. 동반 객체의 프로퍼티나 메소드에 접근하려면 그 동반 객체가 정의된 클래스 이름을 사용한다.
Class A {
companion object {
fun method1(){
println("메서드1 실행")
}
}
}
//다른 클래스
A.method1()
동반 객체를 사용하면 java의 static 처럼 다른 클래스에서 companion object로 생성된 class A의 인스턴스를 접근하여 method1() 함수를 호출할 수 있다.
let() 함수는 블록에 자기 자신을 인수로 전달하고 수행된 결과를 반환한다. 인수로 전달한 객체는 it으로 참조한다. let() 함수는 안전한 호출 연산자 ?. 와 함께 사용하면 null값이 아닐때만 실행할 수 있다.
val result = str?.let {
Integer.parseInt(it)
}
위 코드는 str이 null이 아닐때만 정수로 변환하는 작업을 하고 출력한다.
with() 함수는 인수로 객체를 받고 블록에 리시버 객체로 전달하고 수행된 결과를 반환한다. 리시버 객첼고 전달된 객체는 this로 접근할 수 있다. this는 생략이 가능하다.
with(str) {
println(toUpperCase())
}
with() 함수는 안전한 호출이 불가능하기 때문에 str이 null값이 아닐때만 사용해야한다.
apply() 함수는 블록에 객체 자신이 리시버 객체로 전달되고 이 객차가 반환된다. 객체의 상태를 변화시키고 그 객체를 다시 반환할 때 사용된다.
val result = car?.apply {
car.setColor(Color.RED)
car.setPrice(1000)
}
run() 함수는 익명 함수처럼 사용하는 방법과, 객체에서 호출하는 방법을 모두 제공한다. 익명 함수처럼 사용할 때는 블록의 결과를 반환하고 블록안에 선언된 변수는 모두 임시로 사용되고 없어지는 변수이다. 복잡한 계산에 임시변수가 많을때 주로 사용된다.
val avg = run {
val korean = 100
val english = 80
val math = 50
(korean + english + math) / 3.0
}
run 블록이 끝나면 run 블록에 있던 korean, english, math 변수들은 사라진다.
안전한 호출을 사용할 수 있어 with() 함수보다 유용하게 사용된다.
str?.run {
println(toUpperCase())
}
본 글은 [오준석의 안드로이드 생존코딩] 의 내용을 발췌한 것입니다.