개발일지

2. 심화 본문

Kotlin

2. 심화

강강강 2021. 7. 6. 08:48
  1. NULL처리방법 
  • 기본적으로 null 허용x
  • null 을 명시적으로 나타내기 위해서 ?을 추가해야 한다.
  • java 디컴파일시 exception 이 발생하도록 내부 처리를 하고 있다. 
  • IDE 에서 null 을 사용할 수 없음을 즉시 알려준다.

   

2.  safe calls 

var temp: String? = null 

val size = temp?.length 

<장점> 

ex) return aaa?.bbb?.ccc?.name 

 

========Null 예외처리 ===========

 

  1. Elvis Operator을 사용해 null 인 경우 값을 지정  
  • Elvis Operator    →    ?:

        ex) textview.text = temp ?: " "

 

     2. NPE(Null Point Exception)

  • !! : null 인 경우 자동으로 NPE 발생시킴 

      ex) val temp: String?= null

            val size = temp!!.length 

 

==========기타 Null 처리 ==============

  1. 코틀린 안전한 형변환 시도하기 

    val a: Any? = "ABC"

    val b: Int? = a as Int    // a 를 Int 로 형변환해라

  → ClassCastException 발생  // a 는 Sring   b 는 Int 이기 때문

    val a: Any? = "ABC"

    val b: Int? = a as? Int

 

     2. List 에서 null 아이템 제외하기 - filterNotNull 사용하기

     3. Block 을 이용한 null 예외처리 

   -  Kotlin library 

     코틀린에는 유용한 standard (run, let, apply...) 을 제공 

     한번에 많은 처리 할 수 있음 

  

   4. 1개 이상의 null체크 

    

============= 클래스 상속 ================

  1. open class (open 을 붙이지 않으면 자동으로 final로 되어있어 상속하지 못함)
  2. abstract  - open 있어야 확장가능  
  3. interface - open없어도 확장 가능 

<java8>

final 변수 선언 가능(상속시 값을 변경할 수 없음)

default : 기본함수를 구현할 수 있다

static : 기본함수를 구현하고 static으로 접근할 수 있다. - Base.isTypeZero    // 재정의 불가능 

항상 상속받을 수 있는 상태 

<kotlin>

final정의를 하지 못하고 반드시 상속에서 구현해야 함 

별도의 키워드 없이 default 메서드와 정의 가능 

  • open 정의 없이 모두 확장 가능 (인터페이스이기 때문)

 

===================

<abstract>

abstract class Base(val a : Int )

class Sample(a: Int ) : Base(a) 

 

<interface>

interface Base {

 fun printValue(a: Int)

class Sample : Base {

  override fun printValue(a:Int){

       println("value a : $a") } }

 

=====================Companion object(자바의 static 같이)=============

  • class 내에 정의할 수 있음 
  • Java 에서처럼 Class.TYPE 형태로 직접 접근 가능 
  • static 은 아님 

Companion object 을 통해서 헤딩 객체 사용 가능  

 

=========================sealed classes ==============

다형성이란?

부모클래스를 상속받은 자식클래스 

자식클래스는 부모클래스로부터 접근할 수 있다 

이때 자식클래스는 모두 다른 행동을 할 수 있다. 

 

  1. 생성자는 private
  2.  sealed class 와 sealed class 를 상속받는 클래스는 하나으 파일 안에 정의되어야 한다. 
  3. sealed class {} 안에 class 을 정의할 수 있음 
  4. abstract 메소드를 생성할 수 있음 

 

===========class===============

#싱글톤 구현하기 – kotlin object  

object 클래스이름 

  • 생성자를 가질 수 없다 

#class 안에 class 정의하기 → Nested class 

#Anonymous ineer class 

 

==========Higher - Order functions =============

  • 함수를 파라미터로 전달하거나 함수를 리턴가능 
  • lambda 를 통해 축약 형태로 제공 
  • 변수로 함수를 가질 수 있다. 

마지막 Higher - Order functions 에서는 () 제거 가능 

 

======================kotlin standard library ==========

  • let : data의 null 체크를 할 때 주로 사용 

          ex) val name: String? = ""

                  name?.let{     // null 이 아닌 경우에 프린트해라 

                      println("name $it length ${it.length}") }

 

  • apply : 생성과 동시에 값을 초기화할 때 유용 
    ex) val textview = TextView(this).apply {
       text = "button"
       setTextColor(getColor(R.color.lll))
       setOnClickListener{}  
    }
  • run : 이미 생성한 객체에 대하여 재 접근 시 주로 사용    // 연속적인 접근을 줄여준다  
    ex) textView.run {
            text = "click button"
            setOnClickListener{}
    }
  • with() : view 에 접근할 때 주로 사용 
  • also() : 첫번째블록과 두번째 블록을 분리시켜주는 것 
  • takeif : 받아온 값을 체크하는데 리턴을 boolean   / 조건함수가 true 일때  자기 자신 (this) 을 반환, false 일때 null 을 반환하고 합니다.
  • takeUnless : 조건함수가 true 일때 null 을 반환하고, false 일때 자기 자신 (this) 을 반환합니다.

 

==============Generics ================

##generic 함수 정의 

클래스나 함수를 정의할 때 확실히정해지지 않는 것을 말함. → 다양한 타입으로 클래스를 여러 개 정의하지 않아도 됨 

타입이 정해지지 않은 변수는 함수 앞에 <T> 처럼 정의되어야 함 

##generic 클래스 정의 // 이름 다음에 <T> 가 옴 

  • 가장흔하게 볼 수 있는 Generics 정의는 List다.   : List<T>
  • Generics은 <>안에 타입 파라메터 정의 

        ex) interface Generic<in T> {

              fun setItem(item: T)

}

          class Sample : Generic<String>{

              override fun setItem(item: String)  // 구현 

}

 

  1. wildcard type arguments
  • ? extends T : read만 가능한 서브타입 와일드카드 
  • ? super T : wirte 만 가능한 슈퍼타입 와일드카드 

 

       2. Kotlin 의 in/out 

  • T : 별도의 wildcard 정의가 없이 read/write 모두 가능 
  • in T : Java의 ? super T 와 같고, input 의 약자이며 write only 
  • out T : Java의 ? extends T 와 같고 output의 약자이며 read only 

 

======================SAM Class ===================

  • Single Abstract Methods ; SAM 
  • lambdas 식을 제공 
  • Java 에서 정의해야 함 
    -interface/ abstract - Single Abstract Methods

          -setter 정의 

 

  1. SAM은 언제 동작?
  • setter 와 추상클래스 모두가 java 파일로 정의되어야 함 
  • 둘 중 하나라도 kotlin 파일로 정의하면 SAM 은 동작하지 않는다 

 

========lateinit / lazy 로 초기화를 지연하는 방법 ===============

  • 사용할지 모르는 데이털틑 미리 초기화 할 필요 없어 성능 향상에 도룸 
  • 앱을 실행했을 때 미리 가져오는 것보다 데이터를 화면에 보여줄 때 가져오는 것이 CPU , 네트워크 자원을 아낄 수 있음
  • Late  initialization : 필요할 때 초기화하고 사용할 수 있음 
    -var에서만 사용 가능(primitive type 에 적용할 수 없음 )
    -custom getter / setter 를 만들 수 없음 
    -Nonnull 프로퍼티만 가능 
  • ]
  • Lazy initialization: 변수를 선언할 때 초기화 코드도 함께 정의 ./ 변수가 사용될 때 초기화 코드 동작하여 변수가 초기화 됨

'Kotlin' 카테고리의 다른 글

Kotlin 코틀린 써야하는 이유!!  (0) 2022.11.05
4. 화면구성하기  (0) 2021.07.06
3. Architecture  (0) 2021.07.06
1. Basic Syntax  (0) 2021.07.06