보초의 코딩일기장

코틀린 이것만 보면 돼 : 2일차 본문

Android/Kotlin

코틀린 이것만 보면 돼 : 2일차

장보비 2020. 1. 7. 21:11

코틀린에는 초기화방법인 let, lateinit, lazy를 제공한다.

 

1. let

val address: String ?= null
if (address != null) {
  println(address)
} 

address 가 null 인지 판단하여, 아닐 시 address를 출력하는 형태이다.

val address: String ?= null
address?.let {
  println(address)
}

 

if 문을 let으로 바꾸어서 동일한 실행을 할 수 있다.

 

즉 let은 수신자 객체를 자신의 인자인 람다에 전달한다.

따라서 람다의 매개변수가 하나 뿐이고 컴파일러가 타입을 추론할 수 있을 때 사용되는 디폴트 매개변수명이다.

 

또한,println(addrdss)println(it)으로 바꿀 수 있는데, let의 수신자 객체인 it(여기서는 address)를 출력한다는 의미이다.

 

2. lateinit

프로퍼티를 나중에 초기화 할 수 있게 도와주는 것이다.

코틀린은 프로퍼티를 생성자에서 초기화 해야한다. 특히 Non-null타입이라면 null이 아닌 값으로 반드시 초기화를 해야한다.

 

초기화 시점에 값을 넣을 수 없는 상황이라면 Nullable타입을 사용할 수밖에 없다. 하지만 그 경우는 null을 체크해야하는 경우가 생긴다.

...
class MyAddress{
  private lateinit var address: String //초기화 하지 않은 상태
  fun initAddress(){
    address = "seoul" //이 때 변수 초기화
  }
  ...

 

lateinit을 사용하기 위해 몇 가지 조건이 있다.

1. var type

2. Non-null type

3. 변수 초기화 하지 않고 사용 불가능

4. setter /getter 정의 불가

5. primitive 타입 변수에 사용 불가

 

3. lazy

by lazy() 형태의 위임 프로퍼티로 사용된다.

객체를 초기화 안한 채로 있다가, 실제로 값이 필요할 때 초기화한다.

따라서 객체 사용 시 매번 초기화를 할 필요가 없거나, 초기화 할때 무거운 동작을 하는 경우 유용하게 쓰일 수 있다.

 

그래서, by lazy( ... ) 로 선언해준 것은 바로 실행이 되지 않고, 후에 변수를 선언해주면 그때부터 초기화가 진행된다.

 

4. 상속과 추상클래스, 인터페이스

코틀린에서는 super class로 선언하지 않은 클래스는 defalut super인 Any라는 부모클래스를 갖게 된다.

상속을 위해서는 부모 클래스에 open이라는 키워드를 명시해주어야 한다.

 

 

 

추상 클래스는 실체 클래스에서 공통적인 부분을 추출해서 선언한 클래스이다
그래서 추상 클래스는 객체를 생성할 수 없다.
추상 클래스와 실체 클래스는 상속관계이다.
@override 를 통해 재정의 해준다.

출처:
https://limkydev.tistory.com/188(설명짱짱)

 

5.

when은 switch와 비슷한 분기문이다.

또한 자바에서는 break를 통해 case의 동작 범위를 지정해주는데, 코틀린에서는 , 로 구분할 수 있다.

...
val a=1
when (a) {
  1 -> println("a=1")
  2 -> println("a=2")
  else -> println("a is neither 1 nor 2")
  }
}
...
fun main(args: Array<Strings>){
  getNumber(1)
}
...
fun getNumber(a: Int){
  var result = whan(a){
    1 -> {
    println("a=1")
    1 //return과 비슷한 듯. 표현식으로 끝났음
    } 
  ...
print("result = $result")

 

또한 in, !in을 사용하여 범위나 컬렉션에 값이 존재하는지 확인할 수 있다.

...
when(a){
  in 1..10 -> prinln("a is in the range") //a가 1~10 사이의 수 인 경우 실행
  !in 10..20 -> println("a is outside the range")
}
... 

객체 타입을 확인할 때는 is, !is 를 사용한다.

...
1 -> println("a = $a")
is Int -> println("a is Int $a") //a가 Int형이면 실행
is String -> println("a is String $a") //String형이면 실행
...

for문에서 증감연산을 사용할 때는 for(i in 0..10 step 증감범위) 처럼 써주면 된다.

Buy me a coffeeBuy me a coffee
Comments