Kotlin Android – 간단 정리

Kotlin Android 관련 내용을 알아봅니다. Kotlin은 구글에서 미는 Java를 대체할 언어입니다. 차세대 언어답게 사용법이 단순합니다. 하지만 코드양이 줄어든 만큼 그 안에서 동작하는 내용들을 이해해야 합니다.

추상 클래스와 인터페이스의 차이점

  1. 추상 클래스는 하나만 상속 가능,
  2. 인터페이스는 중복으로 상속 가능.

코틀린 플레이 그라운드

https://try.kotlinlang.org

자바코틀린변환기

자바코드를 코틀린 파일에 붙여넣으면 동시에 변환이 됨.

코틀린 코드 실행

Android Studio -> Tools -> Kotlin -> Kotlin REPL

엄격한 null 안전성

val age:Int = null // 오류

val name:String? = null //정상

— 안전호출 연산자(?.)

val correct = quiz.currentQuestion?.answer?.correct

// 유추된 형식 : Boolean?

— 엘비스 연산자(?:)

val correct = quiz.currentQuestion?.answer?.correct ?: false

// null 이 아니면 correct 리턴, null이면 false!

— not-null 주장

!! 거의 사용하지 않음.

— let

saveInstanceState?.let{

println(it.getBoolean("isLocked"))

}

— 안전/불안 형변환 연산자

val fragment : String ="TT"

val productFragment : ProductFragment = fragment as ProductPragment // 예외 : ClassCastException

val fragment: String = "ProductFragment"

val productFragment: ProductFragment? = fragment as? ProductFragment

// 변화 불가능하면 null

— 스마트 형변환

if( animal is Fish) // animal은 Fish의 부모 클래스

{

animal.isHungry()

}

animal.isHungry() // 오류.

val fish:Fish? = //

if( animal !is Fish)

return

animal.isHungry() // 정상.

if( animal is Fish && animal.isHungry() )

{

println("Fish is hungry")

}

— null 가능성 스마트 형변환

fun verifyView(view: View?)

{

view?:return

// view가 null 불허로 형변환된다.

view.isShown()

}

fun verifyView(view: View?)

{

view?:throw RuntimeException("View is empty")

// view가 null 불허로 형변환된다.

view.isShown()

}


Char

var yinYang = ‘\u262F’ //음양 유니코드 문자(U+262F)


배열

val array = arrayOf(1,2,3) // 박싱된 형태 -> 오버헤드 발생

val array : Array<Short> = arrayOf(1,2,3)

val array = shortArrayOf(1,2,3)

vall array = intArrayOf(1,2,3)

val array = longArrayOf(1,2,3)

val array = arrayOfNulls(3)

val array = Array (5) {it*2}


문자열

var str = "abcd"

println(str[1]) // 출력: b

println(str.reversed()) //출력: dcba

println(str.takeLast(2)) // 출력:cd

println("hwai@com".substringBefore("@")) // 출력: hwai


범위

val weight = 52

val healthy = 50..75

if( weight in healthy )

println("$weight is in $healthy range")

val c = 'k'

val alphabet = 'a'..'z'

if( c in alphabet )

println("$c is character")

for( i in 1..3 ) print(i)

for( i in 5 downTo 1 ) print(i)

for( i in 3..6 step 2) print(i)

for( i in 9 downTo 1 step 3 ) print(i)


when

val vehicle = "Car"

when( vehicle ) 
{

 "Car", "Bike" -> print("Vehicle")

 else -> print(" object")

 val name = when( person ) {

 is String -> person.toUpperCase()

 is User -> person.name

}

val riskAssessment = 47

val handle = "Warn"

val risk = when(riskAssessment) {

in 1..20 -> "negligibel risk"

!in 21..40 -> "minor risk"

!in 41..60 -> "major risk"

else -> when(handle ) {

"Warn" -> "1"

else -> "risk"

}

}

private fun getId(password: String) = when{

password.isEmpty() -> R.string.error_field_required

passwordInvalid(password) -> R.string.error_invalid_password

else -> null

}

val large:Boolean = true

when( large ){

true -> println("Big")

flase -> println("Big")

}


반복문

for(i in array.indices)

print(array[i])

for( (index, value) in array.withIndex() ) {

println( “Element at $index is $value”)

}

val charRange = ‘A’..’B’

val intRange = 1..6

outer@ for(value in intRange) {

for (char in charRange) {

if(char == ‘B’ )

break@outer

}

}


class Fruit(var weight:Double, fresh:Boolean)

var fruit = Fruit(12.0, true)

println(fruit.weight)

println(fruit.fresh) // 오류

open : 상속 가능, final : 최종 구현

open class Plant{

var height: Int = 0

open fun grow(height: Int) {}

}

class Tree : Plant() {

final override fun grow(height: Int) { // final 최종적인 구현여부 명시. 이후 수정 불가

this.height += height

}

}

class Oak : Tree() {

}

@JvmOverloads

class SampleVIew@JvmOverloads constructor(

context: Context,

attrs: AttributeSet? = null,

defStyleAttr: Int = 0

) : View(context, attrs, defStyleAttr)

위 코드는 아래의 효과를 낸다.

public SampleView( Context context ) {

super(context);

}

public SampleView( Context context ) {

super(context);

}

public SampleView( Context context, @Nullable AttributeSet attrs) {

super(context, attrs);

}

public SampleView( Context context, @Nullable AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);

}

Plant를 abstract로 지정하면 인스턴스를 만드는 것을 금지할 수 있다.

클래스는 클래스를 하나만 확장 가능, 인터페이스는 하나 이상 가능.

인터페이스를 상속받아 구현하는 클래스에서는 메소드와 속성을 모두 재정의해야 함.


data class

data class Product( var name: String, var price: Double )

equals와 hsshCode 메소드

toString 메소드

copy 메소드

val productB = productA.copy( price = 24.0)

val productB = productA.copy( price = 24.0, name = “Knife”)

구조분해 선언

Back to top