코틀린의 관례

tkppp·2021년 12월 27일
0

Kotlin

목록 보기
10/11

컬렉션 관례

코틀린에서는 컬렉션의 원소에 접근할 때 get 뿐만 아니라 인덱스나 키값으로 접근할 수 있다. 마찬가지로 set 없이 대입문으로 원소를 추가할도 있다.

이러한 관례는 get과 set을 operator 키워드를 통해 구현할 수 있다.

operator fun Point.get(index: Int): Point{
    return when(index) {
        0 -> this.x
        1 -> this.y
        else -> throw IndexOutOfBoundException("Invalid Index")
    }
}

val p = Point(10, 20)
println(p[0])	// 10 출력

in 관례

컬렉션에서 in 연산을 이용하여 컬렉션에 객체가 포함되어 있는지를 알 수 있다. 이에 대응되는 함수는 contains 함수다.

data class Rectangle(val upperLeft: Point, val lowerRight: InPointt)

operater fun Rectangle.contains(p: Point){
    return p.x in upperLeft.x until lowerRight.x && 
        p.y in lowerRight.y until upper.y
}

rangeTo 관례

코틀린에서는 범위를 만들때 .. 구문을 사용한다. .. 구문은 rangeTo 함수의 호출을 뜻한다. rangeTo 함수는 코틀린 표준 라이브러리에 정의되어 있고 모든 Comparable 클래스에 사용 가능하다. 따라서 연산자 오버로딩이 필요하진 않다.

for 루프 이터레이터 관례

코틀린의 for 루프는 in 연산자를 사용한다. 이 경우 일반적인 in과는 다르다. for(x in list) { ... }는 list.iterator()를 호출해서 이터레이터를 얻은 다음 hasNext와 next 호출을 반복하는 식으로 변환된다.

문자열에 for 루프가 가능한 이유는 String 클래스의 상위 클래스은 CharSequence에 대한 iterator 확장함수가 정의되어 있기 때문이다.

for 루프에서 사용하기 위해서는 iterator 메소드를 구현하면 된다.

구조 분해 선언과 component 함

코틀린에서는 구조 분해를 사용하여 복합적인 값을 한꺼번에 다른 변수에 초기화 할 수 있다. 구조 분해를 사용하기 위해서는 클래스에 componentN 함수가 정의되어 있어야한다. 데이터 클래스는 주 생성자에 들어있는 프로퍼티에 한에서 컴파일러가 자동으로 componentN 함수를 만들어주기 때문에 구조 분해 선언이 가능하다.

구조 분해 선언을 사용하기 위해서는 componentN 함수를 만들어주면 된다.

class Person(val name: String, val age: Int){
    operator fun component1() = name
    operator fun component2() = age
}

val p = Person("tkppp", 25)
val (name, age) = p
println("$name, $age")	

컬렉션의 구조 분해 선언

컬렉션에 대해 구조분해 선언을 할 수 있다면 매우 유용할 것이다. 코틀린은 컬렉션에 대해 앞에서 5번째까지 구조 분해 선언을 사용할 수 있다.

data class NameComponents(val name: Stirng, val extension: String)

fun splitFilename(fullName: String): NameComponents{
    val (name, extension) = fullName.spilt('.', limit = 2)
    return NameComponents(name, extension)
}

구조 분해 선언과 루프

fun printEntries(map: Map<String, String>) {
    for((key, value) in map){
        println("$key -> $value")
    }
}

자바에서는 맵에 대한 이터레이션이 불가능하지만 코틀린에서는 확장함수로 맵에 대한 이터레이터가 정의되어 있다. 따라서 이터레이션이 가능하다. key, value에 대해 구조 분해 선언으로 편리하게 사용할 수 있다.

0개의 댓글