์๋ ํ์ธ์
์ค๋์ ํฌ์คํ ํ ๋ด์ฉ์ ์ฝํ๋ฆฐ Collection์ ๋ํด์ ๊ณต๋ถํ ๋ด์ฉ์ ๋๋ค.
์ฒ์ ๋ธ๋ก๊ทธ์ ํฌ์คํ ํ๋ ๋ด์ฉ์ด Array์ ์ฌ์ฉ๋ฒ์ด์๋๋ฐ..
Collection์ ๋ํด์๋ ์ข ๋ ๊ณต๋ถํ๊ฒ ๋์ด ์ด๋ ๊ฒ ํฌ์คํ ํฉ๋๋ค :)

Collection(์ปฌ๋ ์ )์ด๋ ๋ฌด์์ผ๊น์?
์๋ฃ๊ตฌ์กฐ๋ฅผ ์ ์ํ๊ณ ์๊ณ ๋ฆฌ์ฆ์ ๋์ํ๊ธฐ ์ํด ๋ง๋ค์ด์ง ํด๋์ค , ๋ผ์ด๋ธ๋ฌ๋ฆฌ , ํจ์๋ค์ ๋ชจ์
์ด๋ผ๊ณ ์ค๋ช ํ ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค.
Collection์ ๊ณต๋ถํ๋ค ๋ณด๋ฉด ์ ๋ ๋น ์ง ์ ์๋ 1๊ฐ์ง!
๋ฐ๋ก Gneneric(์ ๋ค๋ฆญ)์ด ์์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด Generic(์ ๋ค๋ฆญ)์ด๋?
ํด๋์ค ๋๋ ํจ์ ๋ด๋ถ์์ ์ฌ์ฉํ ํ์ ์ ์ธ๋ถ์์ ์ธ์๋ก ๋ฐ๊ณ ํ์ํ๋ฉด ๋ฆฌํด ํ์ ์ ์ ์ํ๋ ๊ฒ์ ๋งํฉ๋๋ค.
์ ๋ค๋ฆญ์ ์ฌ์ฉํ๋ฉด ์ปดํ์ผ ๋จ๊ณ์์ ํ์ ์ ์ ํ ์ ํํด์ค์ผ๋ก์จ ์ฝ๋์ ์์ ์ฑ์ด ํ๋ณด๋๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค.
/**
'< T >'๋ฅผ ํตํด ์ฌ์ฉ ํ ์ ์์ผ๋ฉฐ T์๋ ๋ชจ๋ type์ด ๋ค์ด ๊ฐ ์ ์์ต๋๋ค.
*/
val list = arrayListOf()<String>
var map : MutableMaP<Int , String> = mutableMapOf()
Generic์ ์ฌ์ฉํ ๋ ๊ด๋ก์ ์ธ ์์ฝ์ด๋ค์ด ์๋๋ฐ ์ฐธ๊ณ ๋ก ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
ํ๋ผ๋ฏธํฐ | ์์ฝ์ด |
T | type |
R | Result , Return |
E | Element |
N | Number |
K | Key |
V | Value |
์ ๋ค๋ฆญ์ ๋ํ ์ค๋ช ์ ์ํด ์๋ ์ฝ๋๋ฅผ ๋ณด๊ฒ ์ต๋๋ค.
interface Stackable<T> { //Stack ์ธํฐํ์ด์ค
fun pop() : T
fun push(value : T)
fun size() : Int
}
์ ์ฝ๋๋ Stack์ ๊ฐ๋จํ ๋์๋ค์ ์ ์ํด๋์ ์ธํฐํ์ด์ค๋ก ์ ๋ค๋ฆญ์ ํตํด ํด๋น Stack์ด ๋ด์ ์ ์๋ ํ์ ์ ์ ํด ์ค ์ ์์ต๋๋ค.
์ด ๊ฒฝ์ฐ์๋ Stack์ ์ฌ์ฉํ ๋ ๊ผญ ์ ๋ค๋ฆญ์ ํ์ ์ ์ง์ ํด์ฃผ์ด์ผ ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ปดํ์ผ๋ฌ์์๋ ํ์ ์ ์ถ๋ก ํ ์ ์์ต๋๋ค.
class StackImpl<T> : Stackable<T> { // Stack ๊ตฌํ
private val stack = arrayListOf<T>()
private var index = -1
override fun pop(): T {
var ret : T? = null
when(index){
-1 -> println("stack is empty!!")
else -> {
ret = stack[index]
stack.removeAt(index)
index--
}
}
return ret ?: throw ArrayIndexOutOfBoundsException()
}
override fun size(): Int {
return stack.size
}
override fun push(value: T) {
stack.add(value)
index++
}
}
fun main() {
// ์๋์ ๊ฐ์ด ์ฌ์ฉ์์ ํ์
์ ์ง์ ํด์ฃผ์ด์ผ ํ๋ค.
val stringStack : StackImpl<String> = StackImpl()
val integerStack : StackImpl<Int> = StackImpl()
for(i in 1 .. 10){
//stringStack.push(i) String ํ์
์ ๋ฐ์์ผ ํ๊ธฐ์ Error ๋ฐ์
integerStack.push(i)
}
for(i in 1.. integerStack.size()){
println(integerStack.pop())
}
์ ์ ๊ฐ์ด ์ ๋ค๋ฆญ์ ์ฌ์ฉ ํ ์ ์์ผ๋ฉฐ ์ปดํ์ผ ๋จ๊ณ์์
type mismatch์ ๊ฐ์ ์๋ฌ๋ฅผ ์ก์์ค๋ค๋ ๋ถ๋ถ์์ ๋งค์ฐ ํธ๋ฆฌํ ๊ธฐ๋ฅ์ด๋ผ๋ ์๊ฐ์ด ๋ค์์ต๋๋ค. ๐ซข
์ด์ด์ Collection์ ๋ํด ์ค๋ช ํ์๋ฉด
Collection์ ํฌ๊ฒ 2๊ฐ์ง ์ข ๋ฅ์ ๊ตฌํ์ฒด๊ฐ ์กด์ฌํฉ๋๋ค.
๋ฐ๋ก Mutable & Immutable ๋ฐฉ์์ ๊ตฌํ์ฒด๋ค์ ๋๋ค.
์ด ๋์ ์ฐจ์ด๋ ์๋ ๊ทธ๋๋ก ์์ฑ ์ดํ ๋ณํ๊ฐ ๊ฐ๋ฅํ์ง ๋ถ๊ฐ๋ฅํ์ง์ ์ฌ๋ถ์ ์์ต๋๋ค.
Immutable Collection์ ๊ฒฝ์ฐ ์์ฑ ํ ์ค๊ฐ์ ์ฝ์ ๋ฐ ์ญ์ ๊ฐ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
var mutableList : MutalbeList<Int> = mutableListOf()
val list : List<Int> = listOf(1, 2, 3)
var index = 0
mutableList.add(1) // ๊ฐ๋ฅ
// list.add(1) or list[0] = 2 ๋ ๋ถ๊ฐํ๋ค Error!!
// ์ฝ๊ธฐ๋ ๋ ๋ค ๊ฐ๋ฅ
index = mutableList.get(0)
index = list[1]
๋ํ์ ์ธ Collection์ผ๋ก๋ List , Set , Map์ด ์กด์ฌํ๋ฉฐ
List๋ index๊ฐ ์กด์ฌํ๊ณ ์ค๋ณต์ ํ์ฉํ๋ฉฐ index๋ฅผ ํตํ ์ฒ๋ฆฌ๋ฅผ ํ์๋ก ํ ๋ ์ฃผ๋ก ์ฌ์ฉํฉ๋๋ค.
fun main() {
val list : ArrayList<Int> = arrayListOf()
for(i in 1..10){
list.add(i)
}
for(i in 0 until list.size){
println(list.get(i))
}
}
Set์ index๊ฐ ์กด์ฌํ์ง ์์ผ๋ฉฐ ์ค๋ณต์ ํ์ฉํ์ง ์์ต๋๋ค.
โ๏ธ ์ฌ๊ธฐ์ '์ค๋ณต'์ด๋ equals(๊น์ ๋น๊ต)์ hashCode์ ๊ฐ์ ๋น๊ต ์์ true์ธ ๊ฒ์ ๋งํฉ๋๋ค.
fun main() {
val set : MutableSet<String> = mutableSetOf()
set.run {
add("์ฌ๊ณผ")
add("์ค๋ ์ง")
add("๋ฐ๋๋")
add("์ฌ๊ณผ")// ์ค๋ณต์ ํ์ฉํ์ง ์๊ธฐ์ ๊ฐ์ ๊ฐ์ ํ๋๋ง ์
๋ ฅ๋๋ค.
}
val iterator : Iterator<String> = set.iterator()
while(iterator.hasNext()){
// index๊ฐ ์กด์ฌํ์ง ์๊ธฐ์ iterator ํน์ forEach๋ฑ์ ์ฌ์ฉํ์ฌ ๊ฐ๋ค์ ์ ๊ทผํ๋ค.
println(iterator.next())
}
}
๋ง์ง๋ง์ผ๋ก Map์ key, value๋ฅผ ํ์์ผ๋ก ์ด๋ฃจ์ด์ง ์๋ฃ๊ตฌ์กฐ๋ก
Key๊ฐ์ ์ค๋ณต์ ํ์ฉํ์ง ์๊ณ value์ ๊ฐ์ ์ค๋ณต์ ํ์ฉํฉ๋๋ค.
fun main() {
val map : MutableMap<Int , String> = mutableMapOf()
map.run {
put(1 , "์ฌ๊ณผ")
put(2 , "์ค๋ ์ง")
put(3 , "๋ฐ๋๋")
put(1 , "ํ์ธ์ํ") // ์ค๋ณต๋ key๊ฐ์ value๊ฐ์ด ๋ค๋ฅผ ๊ฒฝ์ฐ ์ถ๊ฐ ์
๋ ฅ์ ํ์ง ์๊ณ replace๋จ
put(4 , "ํ์ธ์ํ")
}
map.forEach{
// ์๋์ ๊ฐ์ด map์ ์์ฑ๋ ๊ฐ์ฒด์ key , value๋ก ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค.
println("${it.key},${it.value}")
}
}
์ด์์ผ๋ก Collection์ ๋ํ ๋ด์ฉ์ด์์ต๋๋ค.
์ค๋๋ ์ฆ์ฝ ํ์ธ์ ๐คฉ