Kotlin - 02

|

Kotlin 2

  • 싱글톤
    • 자바에서 패턴을 구현해야 하는것과는 달리 한줄이면 가능하다.
      • object Singleton
    • object 안에 선언된 값이나 함수는 자바의 정적 멤버와 동일하게 사용
  • enum
    • enum class Direction { NORTH, SOUTH, WEST, EAST }
  • 어노테이션 클래스
    •  annotation class Foo { val numbers: IntArray, val names: Array } 
      

    </pre>

  • 중첩 클래스
    • 정적 클래스의 경우 자바와 다르게 static을 추가하지 않아도 된다.
      • 키워드가 없다면 정적 클래스로 간주한다.
    • 비 정적 클래스의 경우 inner 키워드를 추가해야 한다.
  • 비교 연산
    • ==, ===
      • 객체 자체가 동일한지 여부에 대한 비교를 할때는 ===
      • 값의 널 여부와 함께 값의 비교는 ==
  • 자료형 확인 (instanceOf)
    • if(obj is Int)
    • if(obj !is Int)
    • 스마트 캐스트 기능을 지원하여 타입 검사후 중복으로 캐스팅하지 않아도 자동으로 캐스팅해준다. (var형은 지원하지 않음)
  • 자료형 변환
    • val foo : Int = number as Int
  • 비교
    • 자바와는 다르게 if-else문이 값을 반환할 수 있음
    • val ageRange: String = if (age >= 10 && age < 20) { “10대” }
      • 자바의 삼항 연산자를 대체
  • 제네릭
    • val names: LIst
    • 자바는 클래스에 타입을 넣지 않아도 선언이 가능하지만, 코틀린은 반드시 해야함
      • val names: List // 컴파일 오류
  • 예외
    • 자바와 거의 동일하지만 throw시 new 키워드를 사용하지 않고, 값을 반환할 수 있다.
    • checked Exception을 선택적으로 검사할 수 있다.
  • 널 체크
    • 별도 표기가 없을 경우 null 값을 허용하지 않음
    • 널 값을 가지고 싶으면 타입 뒤에 ? 를 붙여야함
    • 엘비스 연산자 ?: 를 사용하면 널 값을 반환할 때 대신 사용할 값을 지정가능하다.
      • val line : String = contact.address?.line2 ?: “No address”
    • 안전한 자료형 변환 as? 를 사용하면 타입변환시 예외가 발생하는 경우 null을 반환한다.
    • !! 널 값을 포함할 수 있는 타입을 널 값을 포함하지 않는 타입으로 변환가능
      • 실제 값으로 들어왔을 경우 널포인터 예외가 발생한다.
  • 자바로 작성된 클래스의 널 처리
    • 자바로 작성된 클래스는 기본적으로 널 값을 허용함
    • 이를 platform types라고 부르고, Type! 과 같은 형태로 표시됨.
    • 플랫폼 타입 객체를 사용할 때는 객체의 널 값 여부를 확인해야 함
  • SAM 변환 (Single Abstract Method)
    • 구현하는 인터페이스가 자바로 작성된 경우에 구현해야 할 메서드가 하나뿐일 때는 이를 람다식으로 변경할 수 있다.
    • 또한 그 람다가 어떤 메서드의 유일한 인수일 경우에는 메서드의 괄호를 생략할 수 있다.
      • button.setOnClickListener { v:View? -> }
      • 컴파일러가 자료형을 추론하는 경우에는 자료형 생략이 가능한다.
        • button.setOnClickListener { v -> }
        • v 인수를 사용하지 않는다면 _ 기호로 대치할수 있다.
        • 인수가 오직 하나라면 이를 아예 생략하고 람다 블록 안에서 it로 접근하는것도 가능하다.
  • 확장 함수
    • 기존 클래스에 쉽게 함수를 추가할 수 있다.
    • 추가할 클래스에 점을 찍고 함수 이름을 작성한다.
    • fun Int.isEven() = this%2 == 0
  • 형변환
    • val c = a.toInt()
    • val d = b.toDouble()
    • val e = a.toString()
    • val str = Integer.parseInt(intStr)
    • val animal = dog as Animal
  • 고차 함수
    • 함수의 인수로 함수를 전달한다
    • fun add (x:Int, y: Int, callback: (sum: Int) -> Unit) { callback(x+y) }
  • let() 함수
    • 블록에 자기 자신을 인수로 전달하고 수행된 결과를 반환함
    • 인수로 전달된 객체는 it으로 참조함
  • with() 함수
    • 인수로 객체를 받고 블록에 리시버 객체로 전달하고 수행된 결과를 반환함
    • 리시버 객체로 전달된 객체는 this로 접근가능. (생략가능)
  • apply() 함수
    • 블록에 객체 자신이 리시버 객체로 전달되고 이 객체가 반환됨.
    • 객체의 상태를 변화시키고 그 객체를 다시 반환할 때 주로 사용
    • val result = car?.apply { car.setColor(Color.RED) } 
  • run() 함수
    • 익명 함수처럼 사용하는 방법과, 객체에서 호출하는 방법 모두 제공
    • 익명 함수처럼 사용할 때는 블록의 결과 반환
    • 복잡한 계산에 임시변수가 많이 필요할 때 유용
    • val avg = run { val k = 100 val e = 80 (k+e) / 3.0} }