PS문제를 하나씩 풀다보니 공부가 필요한 문법에 대해서 정리한 글입니다.
Collection은 자료구조를 편하게 다루기 위해 제공되는 라이브러리이다.
컬렉션 요소에 접근하기 위한 작업을 제공하는 전용 인터페이스이다.
해당 읽기 전용 인터페이스를 확장하여 쓰기 작업(요소 추가, 제거, 업데이트)을 제공하는
변경 가능한 인터페이스이다.
fun printAll(strings: Collection<String>) {
for(s in strings) print("$s ")
println()
}
fun main() {
val stringList = listOf("one", "two", "one")
printAll(stringList)
val stringSet = setOf("one", "two", "three")
printAll(stringSet)
}
위의 예시는
Collection<T>크기 검색, 항목 멤버십 확인 등
읽기 전용 컬렉션의 일반적인 동작을 나타낸다.
요소를 반복하기 위한 작업을 정의하는 인터페이스 Collection에서 상속하며
다양한 컬렉션 유형에 적용되는 함수의 매개변수로 Iterable<T>를 사용할 수 있다.
또한MutableCollection<T>는add,remove같이 쓰는 작업을 수행할 수 있다.
List는 인덱스(위치를 반영하는 정수)로 요소에 접근할 수 있는 정렬된 컬렉션이다.- 요소는 리스트에서 두번 이상 나타낼 수 있다.
- 순서가 중요하고 반복될 수 있다.
- 인덱스는 0(첫 번째 요소의 인덱스)에서 시작한다.
fun main() {
val numbers = listOf("one", "two", "three", "four")
println("인덱스 사이즈 : ${numbers.size}")
println("세번째 요소: ${numbers.get(2)}")
println("네번째 요소 : ${numbers[3]}")
println("요소의 \"두 번째는?\" ${numbers.indexOf("two")}")
}
인덱스가 0부터 시작하기에 인덱싱을 할 때 n에 -1이 된 식으로 불러주고
사이즈를 불러올 때는 요소의 갯수 만큼 나오는 것을 확인 할 수 있다.
data class Person( var name : String, var age : Int)
fun main() {
val bob = Person( "Bob", 31)
val people1 = listOf( Person ("Adam", 28), bob, bob)
val people2 = listOf( Person ("Adam", 28), Person( "Bob", 31), bob)
println(people1 == people2)
bob.age = 32
println(people1 == people2)
}
위 예제는 목록 요소 (null)가 중복될 수 있다는 것을 보여준다.
동일한 개체나 단일 개체가 아무리 많아도 포함될 수 있으며,
peopel1과 people2는 크기가 같고 구조적으로 동일한 위치에 있는 동일한 것으로 간주된다.
예제를 통해 알 수 있는 점은 순서를 중요 시 한다는 사실이다.
- 고유한 요소의 모음이다. 집합의 수학적 추상회를 반영한다.
- 즉, 반복이 없는 객체의 그룹이다.
- 그래서 일반적으로 집합 요소의 순서는 중요하지 않다.
fun main() {
val numbers = setOf(1, 2, 3, 4)
println("Number of elements: ${numbers.size}")
if (numbers.contains(1)) println("1은 set안에 포함되어 있습니다.")
val numbersBackwards = setOf(4, 3, 2, 1)
println("두 set가 같은가? : ${numbers == numbersBackwards}")
}
Set<T>는 고유한 요소를 저장한다. 그렇기에 순서는 중요하지 않다.
위 예제를 보면 두 세트의 순서가 다르지만 크기가 같고 동일한 요소가 있기에True를 출력한다.
println(numbers.first() == numbersBackwards.first())
println(numbers.first() == numbersBackwards.last())
위의 예제 아래 밑의 조건을 초가하면 위는 False가 출력되고 아래는 True가 출력된다.
그 이유는first()와last()함수는 순서에 의존하는 함수이기에 같은 값을 가져야 한다.
- 키 - 값 쌍의 집합이다. map<K, V>
- 키는 고유하며 각각은 정확히 하나의 값에 매핑된다.
- 값은 중복될 수 있다.
- 맵은 객체 간의 논리적 연결을 저장하는데 유용하다 (Ex. 직원 - ID)
fun main() {
val numbersMap = mapOf("key1" to 1, "key2" to 2, "key3" to 3, "key4" to 1)
println("모든 키(K)들 : ${numbersMap.keys}")
println("모든 값(V)들 : ${numbersMap.values}")
if ("key2" in numbersMap) println("Key2 의 값 Value 는? : ${numbersMap["key2"]}")
if (1 in numbersMap.values) println("값 1은 map 안에 있습니다!")
if (numbersMap.containsValue(1)) println("값 1은 map 안에 있습니다!")
}
map은 일반 적으로 Key와 Value를 가지는 키 - 값의 집합이다.
Key1과 Key4의 Value가 1로 같은 것을 보니 값이 중복된다는 것을 확인 할 수 있다.
또한 키는 고유하며 값이 정확이 1:1로 매칭되는 것을 확인할 수 있다.
val numbersMap = mapOf("key1" to 1, "key2" to 2, "key3" to 3, "key4" to 1)
val anotherMap = mapOf("key2" to 2, "key1" to 1, "key4" to 1, "key3" to 3)
println("두 맵들은 같은가? : ${numbersMap == anotherMap}")
위의 예제를 보면 키와 값이 같지만 순서가 다른 것을 확인할 수 있다.
하지만 True를 출력하는 것을 보니 두map이 순서가 상관없다는 것을 알 수 있다.
val numbersMap = mutableMapOf("one" to 1, "two" to 2)
numbersMap.put("three", 3)
numbersMap["one"] = 11
println(numbersMap)
위 예제는
map앞에mutable넣어 수정 가능한 map을 만드는 예제이며
put을 통해서 새로운 키-값을 추가하거나 키의 값을 변경할 수 있는 것을 보여준다.
이번 포스트로 collection을 알아보았다.
우리가 값을 입력할 때 변수만 사용하는 것이 아니기에
이런 리스트를 관리하는 것도 중요하다고 볼 수 있다.
다음 포스트에는 이 collection을 이용하는 함수를 다뤄보려고 한다.