Android Development with Kotlin - Classes and Objects |
이 정리글은 Kotlin in Action 책을 보고 실무에 Kotlin 을 사용하던 사람이 몰랐던 내용이나 remind 하고 싶은 내용을 위주로 정리한 글입니다.
제대로 내용을 파악하시려면 책을 구매해서 읽어보세욤~
-
Kotlin 은 write-only property 는 지원하지 않는다.
-
Primary constructor 가 정의되어 있다면 secondary constructor 에서 반드시 불러줘야 한다.
-
Primary constructor 가 없는데 parent 가 non-empty constructor 를 가지고 있다면 그 녀석을 호출해주어야 한다.
-
class Fruit(name:String) / No getter / No setter / constructor parameter class Fruit(val name:String) / getter / No setter / property class Fruit(var name:String) / getter / setter / property
-
data class 는 equals, hashCode, toString, copy, componentN 를 기본 구현한다.
data class 는 abstract, inner, sealed 가 될 수 없다.
-
operator overloading
a + b / a.plus(b)
a - b / a.minus(b)
a * b / a.times(b)
a / b / a.div(b)
a % b / a.rem(b)
a..b / a.rangeTo(b)
a += b / a.plusAssign(b)
a -= b / a.minusAssign(b)
a *= b / a.timesAssign(b)
a /= b / a.divAssign(b)
a %= b / a.remAssign(b)
a++ / a.inc()
a— / a.dec()
a in b / b.contains(a)
a[i] / a.get(i)
a[i, j] / a.get(i, j)
a[i_1, …, i_n] / a.get(i_1, …, i_n)
a[i] = b / a.set(i, b)
a[i, j] = b / a.set(i, j, b)
a[i_1, …, i_n] = b / a.set(i_1, …, i_n, b)
a() / a.invoke()
a(i) / a.invoke(i)
a(i, j) / a.invoke(i, j)
a(i_1, …, i_n) / a.invoke(i_1, …, i_n)
a == b / a?.equals(b) ?: (b === null)
a > b / a.compareTo(b) > 0
operator overloading 할 때는 “operator” keyword 를 넣어주어야 한다.
-
Java 에서 동일한 name convention 을 가진 function 이 있다면,
operator 를 사용할 수 있다.
-
companion object 는 class 에 종속된 singleton 이라고 보면 되겠다.
-
also 함수는 호출하는 object 를 it 으로 전달하고, 마지막에 해당 object 를 return 까지 해준다.
-
enum class 를 정의하면서 fun 을 정의할 때는 마지막 enum constant 정의 후 ; 를 써줘야 한다.
-
enum class 의 init block 과 require 로 validation 도 할 수 있다.
enum class Color(val r:Int, val g:Int, val b:Int){ BLUE(0, 0, 255), VIOLET(238, 130, 238); init{ require(r in 0..255) require(g in 0..255) require(b in 0..255) } }
-
아래와 같은 사용도 가능하다.
enum class Temperature { COLD, NEUTRAL, WARM } enum class Color(val r:Int, val g:Int, val b:Int){ RED(255, 0, 0){ override val temperature = Temperature.WARM }, VIOLET(238, 130, 238){ override val temperature = Temperature.COLD }; abstract val temperature: Temperature }
-
internal visibility modifier 는 Java 에서는 public 으로 매칭된다.
단, 이렇게 되었을 때 잘못쓸 우려가 있기 때문에 해당 함수나 변수 이름은 이상한 형태가 된다.
ex) production_sources_for_module_SmallTest()
-
sealed class 의 sealing 효과는 direct subclass 에만 해당한다.
sealed class 를 상속할 수 있는 class 들은 동일 파일에 있는 녀석들만에 해당한다.
만약 direct subclass 가 open 으로 상속가능하게 되어 있으면서, 바깥 파일에서 상속하지 못하게 하려면 이 녀석도 sealed 로 만들어 주면 된다.
//vehicle.kt sealed class Vehicle() sealed class Bus : Vehicle() //data.kt class SchoolBus:Bus() //Error cannot access Bus
-
Import alias 라는 게 있다.
import 를 할 때 class name 등이 너무 길거나 이해하기 어렵거나, package 는 다른데 이름은 같은 클래스들이 있다거나 할 때
as 를 붙여서 import 하고, 이 때 정의한 이름을 해당 file 에서 사용할 수 있다.
단, compile 할 때 실제 class 로 이름을 바꾼다는 것은 알아두자
import com.facebook.ads.InterstitialAd as FbAd import com.google.android.gms.ads.InterstitialAd as GoogleAd
댓글