관리 메뉴

JIE0025

[Kotlin] 컬렉션(Collection) 본문

개발/Java, Kotlin

[Kotlin] 컬렉션(Collection)

Kangjieun11 2023. 5. 25. 01:28
728x90

 
코틀린에서 자료구조는 어떻게 다루는지 알아보자! 
 

✅ 컬렉션 (Collection)

컬렉션은 자료구조를 편하게 다루기 위해 제공하는 라이브러리이다..
 
코틀린에서의 컬렉션은 자체 컬렉션을 제공하지 않는다는걸 기억하자.
 
 

🧐 왜 자체 컬렉션을 제공하지 않을까? 

표준 자바 컬렉션을 활용함으로써 자바 코드와 상호작용하기 더 쉽기 때문이다. 
자바에서 코틀린함수를 호출하거나, 코틀린에서 자바코드를 호출 할 때 서로 변환할 필요 없이 같은 클래스를 사용한다.
 
코틀린에서는 자바보다 더 많은 기능을 사용할 수 있다 !!!!


 

✔️ 리스트의 마지막 요소 가져오기

fun main() {
    
    val strings = listOf("first", "second", "third")
    println(strings.last()) // 리스트의 마지막 원소를 가져오기
    
}

//third가 출력됨
 
 

✔️ 리스트에서 데이터 필터링 및 정렬해서 출력하기 

fun main() {
    
    val people = listOf("디스커버리개발팀-강지은","디스커버리개발팀-이호석", "리테일플랫폼개발팀-이연우", "리테일플랫폼개발팀-조진우", "플랫폼엔지니어링팀-성나영" )
    
    people 
    .filter { it.startsWith("디") }
    .sortedBy { it }
    .forEach { println(it) }
    
}

 
 
 
 

✅ 코틀린 컬렉션 인터페이스 구조

 
코틀린에서 Collection Interface는 다음과 같은 상속구조를 갖고 있다.
 
모두 kotlin.collections 패키지 내부에 존재하며, 
Iterable 을 기본적으로 상속받는다.
 
여기에서 중요한점은 가변/불변성으로 나누는 원칙을 충실히 지켰다는점인데,
Mutable 키워드가 들어가면, 변경가능한 컬렉션이다!
 
 


 
 

✅ 불변/ 가변 Collection

 

코틀린은 변수 선언에서부터 불변과 가변에 아주 신경을 많이 썼었다. 
컬렉션에서도 이러한 프로그래밍 원칙을 지키고 있다.

 

 
 

✍️  변경 불가능한 컬렉션  == immutable Collection 

- kotlin.collections.Collection
- 내부 요소 변경 불가능
- Read Only
- 멀티스레드에서도 문제가 발생하지 않는다 (데이터의 안전성을 보장한다)
 
 

✍️ 변경 가능한 컬렉션  == mutanle Collection 

- kotlin.collections.MutableCollection
- 내부 요소의 추가 수정 삭제가 가능하다.
- Read & Write 
- 멀티 스레드 동시 접근시 동기화 문제가 발생할 수 있다.
- Java.util.arrayList와 같이 자바컬렉션 클래스를 사용한다.
 
 
 

👩‍💻 컬렉션 생성 방법 

 
코틀린에서 컬렉션을 생성하는 방법은 굉장히 간단하다. 
그냥 listOf("jieun", "hello") 이런식으로 메서드를 사용하면 된다.
 

컬렉션 종류 불변(읽기전용) 가변(읽기,쓰기)
List listOf mutableListOf, arrayListOf
Set setOf mutableSetOf, hashSetOf, linkedHashSetOf, sortedSetOf
Map mapOf mutableMapOf, hashMapOf, linkedMapOf, soetedMapOf

 

✍️ 자바 컬렉션을 활용하는것은 어디에서 일어나는일인가?

 
✔️ 선행지식 - TypeAliase = 타입 별명
기존 타입에 대해 대체가능한 이름을 제공하는 문법이다.
 
https://kotlinlang.org/docs/type-aliases.html

 

Type aliases | Kotlin

 

kotlinlang.org

 
👩‍💻 type alias 에 대한 예제들

typealias NodeSet = Set<Network.Node>

typealias FileTable<K> = MutableMap<K, MutableList<File>>


class A {
    inner class Inner
}
class B {
    inner class Inner
}

typealias AInner = A.Inner
typealias BInner = B.Inner

 


 
자바 컬렉션 클래스의  대체 이름을 제공하는 클래스가
kotlin.collections 내부에 존재한다!  
 
🔎 TypeAliasesKt.class

 
 

@SinceKotlin("1.1") public actual typealias ArrayList<E> = java.util.ArrayList<E>

 
위의 코드를 보면 typealias 키워드를 통해 java.util.*에서 자바 컬렉션을 직접적으로 참조할수 있게 별칭을 부여한다

코틀린에서 ArrayList<E>를 쓸때마다 실제로는 java.util.ArrayList<E>가 사용되는 것을 의미한다.
 
 
 
 

👩‍💻 예제 코드

fun main(args: Array<String>) {

    val saying: MutableList<String> = arrayListOf();  //상위인터페이스로_타입_선언후_하위_메소드_호출
    
    saying.add("hello") 
    saying.add("my name is jieun")
    
    for (s in saying)
        println(s)

}

 
 

 

 
 

✅ 컬렉션 관련 함수 공부 및 실습

 
 

🖥 MutableList

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/mutable-list-of.html
 
add : 요소 1개 삽입
addAll : collection 삽입
remove : 요소값을 찾아 삭제  (요소 존재시 삭제 후 true 반환 / 요소 발견 실패시 리스트 유지, false 반환) 
removeAll :  전달받은 Collection의 요소중 하나라도 일치하는 값이 있으면 삭제하고 true 반환
removeAt : 인덱스로 삭제 
set : 인덱스의 값 수정 (mulist[3] 과 같이 인덱스 자체로 접근해서 수정해도 된다....왜 있는걸까)
subList  : 서브리스트 반환,  subList(시작인덱스, 종료인덱스)   시작인덱스 ~ 종료인덱스 -1까지의 서브리스트를 반환한다. 

fun main() {

    //✅ add
    val mulist = mutableListOf(10, 20, 11, 23, 55)

    mulist.add(500) 
    //맨뒤에 추가됨
    //output : 10, 20, 11, 23, 55, 500
    
    mulist.add(3, 111) 
    // 인덱스 3위치에 111을 추가하라
    // output : 10, 20, 11, 111, 23, 55, 500

    //✅ addAll
    val list = listOf<Int>(1, 2, 3)
    mulist.addAll(2, list)  //output : 10, 20, 1, 2, 3, 11, 111, 23, 55, 500
    
    
    //✅ remove
    val mulist2 = mutableListOf(10, 20, 11, 23, 55)

    mulist2.remove(10) 
    //데이터가 존재하므로 삭제하고 true 반환
    //output : 20, 11, 23, 55
    
    mulist2.remove(1000) 
    //데이터 존재 X시 그냥 유지하고 false 반환
    //output : 20, 11, 23, 55

    //✅ removeAll
    val list2: List<Int> = listOf<Int>(1, 2, 3, 20)
    mulist2.removeAll(list2)  //output : 11, 23, 55
    //1개라도 일치하는 데이터 존재시 true 반환 
    // 집합에서 A-B와 비슷한 느낌
    
    
    //✅ set
    val mulist3: MutableList<Int> = mutableListOf(10, 20, 11, 23, 55)

    mulist3.set(3, 1)    //output : 10, 20, 11, 1, 55
    mulist3[3] = 100     //output : 10, 20, 11, 100, 55
    
    //✅ subList
    val mulist4: MutableList<Int> = mutableListOf(10, 20, 11, 23, 55)
    val sub_mulist = mulist4.subList(2, 4)
    println(sub_mulist)     //output : 11, 23
}

 
 

🖥 MutableSet

업무마치고, 집와서 노션 정리좀 했더니 공부할 시간이 부족해서 일단 자료 링크만 추가하고 남은건 나중에 다시 공부하면서 업데이트 해야겠다
 
https://notepad96.tistory.com/73

 

Kotlin Set, MutableSet 추가, 삭제, 프로퍼티

1. Set, MutableSet Set과 MutableSet 또한 List와 MutableList의 관계처럼 불변과 가변의 차이를 갖는다. Set을 상속받는 MutableSet public interface MutableSet : Set, MutableCollection { ... } 변수 선언 시 var과 val 차이와 같

notepad96.tistory.com

 
 
 

🖥 MutableMap

https://notepad96.tistory.com/76

 

Kotlin Map, MutableMap 추가, 삭제, 프로퍼티

1. Map, MutableMap Map과 MutableMap 또한 List와 MutableList의 관계처럼 불변과 가변의 차이를 갖는다. Map을 상속받는 MutableMap public interface MutableMap : Map { ... } Map은 Key/Value 쌍의 데이터를 저장하는 구조이다

notepad96.tistory.com

 
 


 
 
 

✅ 코틀린 관련 유용한 함수들

 
 
https://ardor-dev.tistory.com/28

 

[Kotlin] Kotlin Collection 관련 유용한 함수

Android 개발을 하다 보면 필연적으로 collection이라는 자료구조를 많이 사용하게 됩니다. collection의 종류로는 List , Map, Set 이 있습니다. Kotlin의 Collection은 기본적으로 Mutable과 Immutable을 별개로 지원

ardor-dev.tistory.com

 

✍️ sort, sorted, 

컬렉션의 각 요소들을 정렬

 

✔️  예제 코드 전 추가 학습  +  Pair(튜플) 자료구조  만들기   ( to )

to 를 이용해 튜플(Pair)을 만들수 있다.
1 to "hello"   >>    (1, hello)
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/to.html

 

sort 예제코드

fun main() {
    
    // to를 이용해 리스트 내부에 튜플 요소 생성
    val li = mutableListOf(4 to "c", 2 to "b")
    val additional = listOf(2 to "a", 4 to "e", 4 to "d")
    
    //list 더하기 연산
    li.addAll(additional)
    li +=  listOf(3 to "z")
    
    //컬렉션 데이터는 정렬 메서드를 사용할 수 있따.
    li.sortBy { it.first }  //second
    println(li)

	//sorted는 자바와 마찬가지로 새로운 컬렉션을 반환한다.
	
    //sortedByDescending { it } //내림차순
    val a: MutableList<Int> = mutableListOf(3, 2, 1)
    val sorted = a.sortedByDescending { it } // 내림차순
}

 
 

✍️ map

각 요소에 추가연산(변형)을 해서 다른 컬렉션으로 쉽게 복사가 가능

fun main(args: Array<String>) {
  var a: List<Int> = listOf(1, 2, 3)

  var b = a.map {
    it * 3
  }
  println(b) // [3,6,9]
}

 

✍️  forEach

요소하나하나 접근, 끝인덱스까지 알아서 순환한다. (it 키워드 사용해서 각각의 요소 접근해서 사용한다.

fun main() {
  var list = arrayOf(1, 2, 3, 4, 5, 6, 7, 8)
  list.forEach {
    println("리스트 순환중 : $it 번 순환 ")
  }
}

✍️ filter

조건에 맞는 요소만 collection으로 다시 묶어 반환
 

fun main() {
  var list = arrayOf("Jieun", "Jihye", "Eunji")
  var list2 = list.filter {
    it.startsWith("J")
  }

  println(list2)
}

 

✍️ find

조건에 맞는 첫번째 요소 반환
없으면 Null 반환 됨
 
만약 조건에 맞는 마지막 요소를 찾고 싶다면 findLast를 사용한다.
 

fun main() {
  var list = arrayOf("Jieun", "Jihye", "Eunji")
  var list2 = list.find {
    it.startsWith("J")
  }

  println(list2)
  
  
  var list3 = arrayOf("Jieun", "Jihye", "Eunji")
  var list4 = list3.findLast {
    it.startsWith("J")
  }
  
  println(list4)
}

 
 

✍️ any, all, none

collection의 요소를 모두 검사,   해당 조건에 따라 Boolean을 반환하는 함수
 
any : 하나라도 조건에 맞으면 true
all : 모두 조건에 맞으면 true
none : 모두 조건에 맞지 않아야 true
 

fun main() {
    var a = listOf(1, 2, 3)

    if (a.any{ it==2 }) {
        println("a.any{ it==2 } -> 2가 존재해서 하나라도 맞으니 true ")
    }

    if (a.all{ it <= 3 }) {
        println("a.all{ it <= 3 } -> 모두 3보다 작거나 같기 때문에 true")
    }

    if (a.none{ it > 4 }) {
        println("a.none{ it > 4 } -> 모두 4보다 크다는 조건에 맞지 않아서 true")
    }
}

 


references
https://ardor-dev.tistory.com/28
https://codechacha.com/ko/kotlin-pair-and-triple/