본문 바로가기
프로그래밍 놀이터/Kotlin

[도서 정리] Android Development with Kotlin - Classes and Objects

by 돼지왕왕돼지 2018. 12. 13.

Android Development with Kotlin - Classes and Objects


이 정리글은 Kotlin in Action 책을 보고 실무에 Kotlin 을 사용하던 사람이 몰랐던 내용이나 remind 하고 싶은 내용을 위주로 정리한 글입니다.

제대로 내용을 파악하시려면 책을 구매해서 읽어보세욤~


Abstract, Also, android with kotlin, classes and objects, companion object, compareTo, componentN, contains, COPY, data class, dec, div, divassign, enum class semi colon, equals, Get, hashcode, import alias, import as, inc, inner, internal visibility modifier, Invoke, java name convention, MINUS, minusassign, name convention, non empty constructor, operator keyword, operator overloading, Plus, plusAssign, primary constructor, Public, rangeto, REM, remassign, require function, Sealed, sealed class, Set, Times, timesassign, toString, write-only property


-

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



댓글0