BE/Kotlin

[Kotlin] Collection, 확장/중위함수

멍목 2023. 3. 8. 22:02
반응형

자바 개발자를 위한 코틀린 입문

 

이 포스팅에서 작성하는 내용은 자바 개발자를 위한 코틀린 입문 에서 발췌하였습니다.

https://inf.run/BpYf

 

자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide) - 인프런 | 강의

이 강의를 통해 Kotlin 언어의 특성과 배경, 문법과 동작 원리, 사용 용례, Java와 Kotlin을 함께 사용할 때에 주의할 점 등을 배울 수 있습니다., - 강의 소개 | 인프런

www.inflearn.com


1. 배열

  • arrayOf를 이용해서 배열의 원소와 함께 생성할 수 있다.
  • indices : 배열의 범위를 나타낸다. (0부터 ~ 마지막 index까지)
  • withIndex() : 이 함수를 이용하면 index, value 를 가져올 수 있다.
fun main() {
    /** 1. Array **/
    val array = arrayOf("가", "나")

    // 1) Java 처럼 일반적인 반복문으로 접근하는 방법
    println("[1]")
    for(i in array.indices) {           // indices : 배열의 범위를 나타냄(0 ~ 마지막 index)
        println("Index : " + i + ", Value : " + array[i])
    }

    val array2 = array.plus("다")    // 배열을 추가해서 반환할 수 있다.

    // 2) index, value 를 반복문에서 얻는 방법
    println("[2]")
    for((index, value) in array2.withIndex()) {      // withIndex()를 이용하면 index, value 를 가져올 수 있다.
        println("Index : $index, Value : $value")
    }
}

 

 

 

2. List

  • Collection을 생성할 때, 반드시 불변인 지 가변인 지 설정 후 생성해야 한다.
  • List의 기본 구현체 : ArrayList
  • 불변 Collection : 등록, 삭제가 불가능하다. (Collection 내부의 데이터는 수정 가능)
fun main() {
    val numberList = listOf(1,2,3)                  // listOf : 불변 리스트 생성
    val emptyNumberList = emptyList<Int>()          // emptyList<>() 로 빈 리스트를 만들 때, 타입을 추론할 수 없을 경우 타입을 명시해줘야 한다.

    val editablenumberList = mutableListOf(1,2,3)   // mutableListOf() : 가변 리스트 생성
    editablenumberList.add(4)

    // 리스트에 직접 접근
    println(numberList.get(0))
    println(numberList[0])

    // 1) Java 의 foreach 처럼 사용
    println("[1]")
    for(number in numberList){
        println(number)
    }

    // 2) withIndex() 사용
    println("[2]")
    for((index, value) in editablenumberList.withIndex()){
        println("Index: $index, Value: $value")
    }
}

 

 

3. Set

  • List와 다르게, 순서가 없고 값의 중복을 허용하지 않는 자료 구조
  • 위의 차이점을 제외하면 사용 방법이 비슷하다.
  • setOf() : 불변 Set 생성
  • mutableSetOf() : 가변 Set 생성(기본 구현체: LinkedHashSet)
fun main() {
    val numberSet = setOf(1,2,3)                // setOf() : 불변 Set 생성
    val editableNumberSet = mutableSetOf(1,2,3) // mutableSetOf() : 가변 Set 생성(기본 구현체: LinkedHashSet)

    for(number in numberSet)
        println(number)

    for((a, b) in numberSet.withIndex())
        println("Index : $a, Value: $b")
}

 

 

 

4. Map

  • mutableMapOf : 가변 map 생성
  • mapOf : 불변 map 생성 (key to value 로 표시)
fun main() {
    val fruitMap = mutableMapOf<String, String>()            // mutableMapOf : 가변 map 생성
    val map = mapOf<String, String>("apple" to "사과")        // mapOf : 불변 map 생성 (key to value 로 표시)

    // (java) put (put도 사용 가능)
    fruitMap["apple"] = "사과"
    fruitMap["orange"] = "오렌지"

    // map 의 Key 만 가져와서 탐색
    for(key in fruitMap.keys)
        println("KEY : " + key + ", VALUE : " + fruitMap[key])

    // key 와 value 를 가져와서 탐색
    for((K, V) in fruitMap.entries)
        println("KEY : " + K + ", VALUE : " + V)
}

 

 

 

5. Collection과 Null

  • List<String?> : LIst에 null이 들어갈 수 없지만, 원소는 null이 들어갈 수 있다.
  • List<String>? : List에 null이 들어갈 수 있지만, 원소는 null이 들어갈 수 없다. 
  • List<String?>? List에 null이 들어갈 수 있고, 원소도 null이 들어갈 수 있다.

 

 

 

6. 확장함수

  • 확장 함수 : 기존에 있던 클래스의 멤버 함수를 임의로 생성할 수 있는 기능
  • 클래스의 private, protected 멤버를 가져올 수 없음 (캡슐화가 깨지는 걸 방지하기 위함)
  • 기존 멤버 함수와 이름이 같을 경우, 멤버 함수를 우선적으로 호출한다.
    • 즉, 추후에 확장 함수 이름과 같은 멤버 함수가 등장하게 된다면 오류가 발생할 수 있다.
  • 확장함수는 현재 타입을 기준으로 호출된다. 
  • 정적 메서드로서 사용할 수 있다.
  • 확장프로퍼티와도 연결이 가능하다
fun main() {
    var str = "hhhhhhhh"
    println(str.firstChar())
}

// 확장 함수 : 기존에 있던 클래스의 멤버 함수를 임의로 생성할 수 있는 기능 (클래스의 private, protected 멤버를 가져올 수 없음)
fun String.firstChar(): Char {
    return this[0]  // this 를 이용해서 실제 클래스 안의 값에 접근할 수 있다.
}

// 확장 함수처럼 확장 프로퍼티로서도 사용 가능하다.
val String.firstChar: Char
    get() = this[0]

 

 

7. 중위함수

  • 중위 함수를 이용해서 함수 호출 방식을 변경할 수 있다. (param1 함수이름 param2)
fun main() {
    // 일반적인 함수 호출
    println(8.minus2(5))
    // 중위 함수 방식 호출
    println(8 minus2 5)
}
// infix : 중위 함수 ( param1 minus2 param2 와 같이 함수를 호출할 수 있게 됨)
// 멤버함수에도 붙일 수 있다.
infix fun Int.minus2(num: Int): Int = this - num

 

 

8. inline 함수

  • 함수에 inline을 붙이면, 컴파일 될 때 함수를 호출한 곳에 함수 본문이 삽입된다.
반응형