일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 코딩봉사
- 1과목
- 알고리즘
- java
- 파이썬
- python
- 코딩교육봉사
- 자바
- 프로그래머스
- 시나공
- BFS
- 소프티어
- 데이터베이스
- MYSQL
- programmers
- C++
- 코틀린
- 회고
- 문제풀이
- softeer
- 정보처리산업기사
- CJ UNIT
- 스프링
- 백준 알고리즘
- SQL
- SW봉사
- kotlin
- 백준알고리즘
- 공부일지
- 백준
- Today
- Total
JIE0025
[Kotlin] 컬렉션(Collection) 본문
코틀린에서 자료구조는 어떻게 다루는지 알아보자!
✅ 컬렉션 (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 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
🖥 MutableMap
https://notepad96.tistory.com/76
✅ 코틀린 관련 유용한 함수들
https://ardor-dev.tistory.com/28
✍️ 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/
'개발 > Java, Kotlin' 카테고리의 다른 글
[Kotlin] lateinit var, 언제 사용할까? (0) | 2023.06.08 |
---|---|
멀티모듈은 무엇이고 왜 사용할까 ? (0) | 2023.05.29 |
[Kotlin] 코틀린 기초 (0) | 2023.05.24 |
[Kotlin] 코틀린이란 (왜 필요하고, 왜 배워야할까) (0) | 2023.05.23 |
[Java] Collection Framework (List, Queue, Set) & Map (0) | 2023.05.06 |