Kotlin Android 관련 내용을 알아봅니다. Kotlin은 구글에서 미는 Java를 대체할 언어입니다. 차세대 언어답게 사용법이 단순합니다. 하지만 코드양이 줄어든 만큼 그 안에서 동작하는 내용들을 이해해야 합니다.
목차
Toggle추상 클래스와 인터페이스의 차이점
- 추상 클래스는 하나만 상속 가능,
- 인터페이스는 중복으로 상속 가능.
코틀린 플레이 그라운드
자바코틀린변환기
자바코드를 코틀린 파일에 붙여넣으면 동시에 변환이 됨.
코틀린 코드 실행
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”)
구조분해 선언