Kotlin - 02
12 Apr 2019 | kotlin programming languageKotlin 2
- 싱글톤
- 자바에서 패턴을 구현해야 하는것과는 달리 한줄이면 가능하다.
- object Singleton
- object 안에 선언된 값이나 함수는 자바의 정적 멤버와 동일하게 사용
- 자바에서 패턴을 구현해야 하는것과는 달리 한줄이면 가능하다.
- enum
- enum class Direction { NORTH, SOUTH, WEST, EAST }
- 어노테이션 클래스
-
annotation class Foo { val numbers: IntArray, val names: Array
}
</pre>
-
- 중첩 클래스
- 정적 클래스의 경우 자바와 다르게 static을 추가하지 않아도 된다.
- 키워드가 없다면 정적 클래스로 간주한다.
- 비 정적 클래스의 경우 inner 키워드를 추가해야 한다.
- 정적 클래스의 경우 자바와 다르게 static을 추가하지 않아도 된다.
- 비교 연산
- ==, ===
- 객체 자체가 동일한지 여부에 대한 비교를 할때는 ===
- 값의 널 여부와 함께 값의 비교는 ==
- ==, ===
- 자료형 확인 (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 // 컴파일 오류
- 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} }