πŸ€” List λž‘ Array ..? λŒ€μ²΄ 무슨 차이야?

H43ROΒ·2021λ…„ 8μ›” 3일
9

Kotlin κ³Ό μΉœν•΄μ§€κΈ°

λͺ©λ‘ 보기
2/18
post-thumbnail

코틀린을 μ‚¬μš©ν•˜λ‹€λ³΄λ©΄ λΆ„λͺ…νžˆ List 와 Array 두 자료ꡬ쑰의 곡쑴에 μžˆμ–΄ μ˜κ΅¬μ‹¬μ„ ν’ˆμ„ 수 μžˆλ‹€!
λŒ€μ²΄ 뭐가 λ‹€λ₯΄κΈΈλž˜ ꡬ뢄지어져 μžˆλŒ€? πŸ€” ν•˜λŠ” 뢄듀을 μœ„ν•΄ 이 ν¬μŠ€νŒ…μ„ λ°”μΉœλ‹€.

동적 자료ꡬ쑰, List

λ‚΄λΆ€ κ΅¬ν˜„

λ‚΄λΆ€μ μœΌλ‘œ MutableList λ₯Ό List μΈν„°νŽ˜μ΄μŠ€μ— μΊμŠ€νŒ…ν•˜μ—¬ μ‚¬μš©ν•¨

public interface List<out E> : Collection<E> {
    // Query Operations

    override val size: Int
    override fun isEmpty(): Boolean
		.
		.
		.
    public fun indexOf(element: @UnsafeVariance E): Int
    public fun lastIndexOf(element: @UnsafeVariance E): Int
    public fun listIterator(): ListIterator<E>
    public fun listIterator(index: Int): ListIterator<E>
    public fun subList(fromIndex: Int, toIndex: Int): List<E>
}

List 의 νŠΉμ§•

  • μˆœμ„œκ°€ μžˆλŠ” μžλ£Œν˜•λ“€μ˜ 집합 (μ‹œν€€μŠ€)
  • λΆˆμ—°μ†μ μΈ λ©”λͺ¨λ¦¬ 곡간을 μ μœ ν•˜μ—¬ λ©”λͺ¨λ¦¬ 관리에 μš©μ΄ν•¨ β†’ ν¬μΈν„°λ‘œ 값을 접근함
  • List μ—μ„œ 인덱슀라 함은, 'λͺ‡ 번째 데이터인가' μ •λ„μ˜ 의미λ₯Ό κ°–κ²Œ 됨
  • listOf , mutableListOf() λ“±κ³Ό ν•¨κ»˜ 리슀트λ₯Ό 생성할 수 있음
  • List λŠ” Null 을 포함할 수 있고, 쀑볡 μš”μ†Œλ₯Ό ν—ˆμš©ν•¨
  • 만일 두 λ¦¬μŠ€νŠΈκ°€ μ„œλ‘œ μ›μ†Œλ“€μ˜ 인덱슀, λ‚΄μš©μ΄ λͺ¨λ‘ κ°™μœΌλ©΄ 같은 리슀트둜 간주함
val bob = Person("Bob", 31)
val people = listOf(Person("Adam", 20), bob, bob)
val people2 = listOf(Person("Adam", 20), Person("Bob", 31), bob)
println(people == people2)  // true
bob.age = 32
println(people == people2)  // false
  1. Immutable List β†’ λ‚΄μš©μ„ λ°”κΏ€ 수 μ—†λŠ” 리슀트
val school = listOf("mackerel", "trout", "halibut")
println(school)

// [mackerel, trout, halibut]
  1. Mutable List β†’ λ‚΄μš©μ„ 자유자재둜 λ°”κΏ€ 수 μžˆλŠ” 리슀트
val myList = mutableListOf("tuna", "salmon", "shark")
myList.remove("shark")

// res36: kotlin.Boolean = true

val numbers = mutableListOf(1, 2, 3, 4)
numbers.add(5)
numbers.removeAt(1)
numbers[0] = 0
numbers.shuffle()
println(numbers)

*μ΄λ•Œ true λ₯Ό 좜λ ₯ν•˜λŠ” μ΄μœ λŠ” remove() λ©”μ†Œλ“œκ°€ μ›μ†Œ μ‚­μ œ 성곡 μ—¬λΆ€λ₯Ό λ¦¬ν„΄ν•˜κΈ° λ•Œλ¬Έ

List 의 μž₯점

  • 포인터λ₯Ό μ‚¬μš©ν•˜μ—¬ λ‹€μŒ 값을 κ°€λ₯΄ν‚€κ³  있기 λ•Œλ¬Έμ— μ‚½μž…κ³Ό μ‚­μ œ λ™μž‘μ΄ 빠름
  • 동적 νƒ€μž…μ΄κΈ° λ•Œλ¬Έμ— 크기가 μ •ν•΄μ Έμžˆμ§€ μ•Šμ•„ 자유자재둜 μ‚¬μš© κ°€λŠ₯
  • λ©”λͺ¨λ¦¬μ˜ μž¬μ‚¬μš©μ΄ μš©μ΄ν•¨

List 의 단점

  • λΆˆμ—°μ†μ  λ©”λͺ¨λ¦¬ 곡간을 μ‚¬μš©ν•˜λŠ” 만큼, 검색 μ„±λŠ₯은 쒋지 μ•ŠμŒ
  • 포인터λ₯Ό 톡해 λ‹€μŒ 값을 κ°€λ₯΄ν‚€λ―€λ‘œ 포인터λ₯Ό λ‹΄κΈ° μœ„ν•œ 좔가적인 λ©”λͺ¨λ¦¬ 곡간이 ν•„μš”ν•¨


정적 데이터 νƒ€μž…, Array

λ‚΄λΆ€ κ΅¬ν˜„

class Array<T> private constructor() {
    val size: Int
    operator fun get(index: Int): T
    operator fun set(index: Int, value: T): Unit

    operator fun iterator(): Iterator<T>
    // ...
}

Array 의 νŠΉμ§•

  • Array λŠ” μƒμ„±ν•œ μˆœκ°„, μ‚¬μ΄μ¦ˆλŠ” κ³ μ •λ˜λ©° μ›μ†Œ μ‚­μ œλ‚˜ μΆ”κ°€ 등을 μ‚¬μš©ν•  수 μ—†μŒ
  • λŒ€μ‹  κ·Έ μ•ˆμ—μ„œμ˜ μ›μ†Œ κ°’ 변경은 자유둭게 ν•  수 있음
  • μ½”ν‹€λ¦°μ—μ„œλŠ” λ”°λ‘œ mutableArray 이런 게 μžˆλŠ”κ²Œ μ•„λ‹ˆλΌ 기본적으둜 Mutable λ™μž‘μ„ 함
  • λ”°λΌμ„œ val 으둜 μ„ μ–Έν•˜λ‚˜ var 으둜 μ„ μ–Έν•˜λ‚˜ λ˜‘κ°™μ€ λ™μž‘μ„ 함
  • arrayOf ν‚€μ›Œλ“œλ₯Ό 톡해 μ„ μ–Έν•  수 있음 (좜λ ₯ μ‹œ java.util.Arrays.toString() μ‚¬μš©)
val school = arrayOf("shark", "salmon", "minnow")
println(java.util.Arrays.toString(school))

// [shark, salmon, minnow]
  • λ˜ν•œ, μ„œλ‘œ λ‹€λ₯Έ νƒ€μž…μ΄ 곡쑴할 수 있음
val mix = arrayOf("fish", 2)
  • Array 끼리 ν•©μΉ˜λŠ” λ™μž‘λ„ κ°€λŠ₯
val numbers = intArrayOf(1, 2, 3)
val numbers3 = intArrayOf(4, 5, 6)
val foo2 = numbers3 + numbers
println(foo2[5])  // 3
  • Array 와 List λ₯Ό ν•©μΉœ μƒˆλ‘œμš΄ 쀑첩 List λ₯Ό μƒμ„±ν•˜λŠ” 것도 κ°€λŠ₯
val numbers = intArrayOf(1, 2, 3)
val oceans = listOf("Atlantic", "Pacific")
val oddList = listOf(numbers, oceans, "salmon")
println(oddList)

// [[I@89178b4, [Atlantic, Pacific], salmon]

*첫 번째 μ›μ†Œμ˜ 경우 Array 인데, Array λ₯Ό 좜λ ₯ν•˜λŠ” Array Utility λ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠμœΌλ©΄
코틀린은 ν•΄λ‹Ή Array 의 μ£Όμ†Œλ§Œμ„ 좜λ ₯함

  • Array 생성 μ‹œ μ•„λž˜μ™€ 같은 κ°„λ‹¨ν•œ μ΄ˆκΈ°ν™” μž‘μ—…λ„ κ°€λŠ₯함
// [0, 2, 4, 6, 8] ν˜•νƒœμ˜ Array<Int> 생성
val array = Array (5) { it * 2 }
println(java.util.Arrays.toString(array))

// ["0", "1", "4", "9", "16"] ν˜•νƒœμ˜ Array<String> 생성
val asc = Array(5) { i -> (i * i).toString() }
asc.forEach { println(it) }

*μžλ™μœΌλ‘œ μƒμ„±λœ it ν‚€μ›Œλ“œλŠ” Array 의 Index 역할을 함

  • λ§Œμ•½ Primitive νƒ€μž…λ§Œ λ‹΄λŠ”λ‹€λ©΄, λ‹€μŒκ³Ό 같이 μ„ μ–Έν•΄μ£Όλ©΄ 됨 (μ•„λ‹ˆ, μ„ μ–Έν•΄μ•Ό 함)
val numbers = intArrayOf(1,2,3)

// Array of int [0, 0, 0, 0, 0]
val arr = IntArray(5)

// [42, 42, 42, 42, 42]
val arr = IntArray(5) { 42 }

// [0, 1, 2, 3, 4]
var arr = IntArray(5) { it * 1 }

μ΄λŸ°μ‹μœΌλ‘œ Primitive Type Array λ₯Ό μ‚¬μš©ν•˜λ©΄ Boxing Overhead λ₯Ό ν”Όν•  수 있음
μ‹ κΈ°ν•˜κ²Œ Array ν΄λž˜μŠ€μ™€ μƒμ†κ΄€κ³„λŠ” μ—†μŒ. κ·ΈλŸ¬λ‚˜ λ©”μ†Œλ“œλ‚˜ ν”„λ‘œνΌν‹°λŠ” 동일함!

λ‹€λ§Œ λͺ…λ°±νžˆ Array<Int> λŠ” μžλ°”μ˜ Integer[] 와 λ§€ν•‘λ˜κ³ ,
IntArray λŠ” μžλ°”μ˜ int[] 에 맀핑
되기 λ•Œλ¬Έμ— Overhead 방지λ₯Ό μœ„ν•΄ κΌ­ ꡬ뢄지어 μ‚¬μš©ν•  것!

μž₯점

  • 인덱슀λ₯Ό ν†΅ν•œ 검색이 μš©μ΄ν•¨
  • μ—°μ†λœ λ©”λͺ¨λ¦¬ 곡간을 μ‚¬μš©ν•˜μ—¬ λ©”λͺ¨λ¦¬ 관리가 νŽΈλ¦¬ν•¨

단점

  • 배열에거 값을 μ‚­μ œν•΄λ„ 크기가 쀄어듀지 μ•ŠκΈ° λ•Œλ¬Έμ— λ©”λͺ¨λ¦¬κ°€ λ‚­λΉ„λœλ‹€κ³  λ³Ό 수 있음
  • 배열은 정적 데이터 νƒ€μž…μ΄λ―€λ‘œ λ°°μ—΄ 크기λ₯Ό 컴파일 이전에 μ§€μ •ν•΄μ€˜μ•Ό ν•˜λŠ” λ²ˆκ±°λ‘œμ›€μ΄ 있음
  • λ°°μ—΄μ˜ 크기λ₯Ό 이후에 μž¬μ‘°μ •ν•  수 μ—†κΈ° λ•Œλ¬Έμ— μ‚¬μš©ν•˜κΈ° κΉŒλ‹€λ‘œμ›€

List 와 Array 의 핡심 차이점

  1. Array λŠ” 무쑰건 κ³ μ •λœ μ‚¬μ΄μ¦ˆλ₯Ό 가짐 (κ³ μ •λœ 연속 λ©”λͺ¨λ¦¬ λ‚΄μ—μ„œ μ›μ†Œλ₯Ό μ €μž₯)
    반면 List λŠ” μ‚¬μ΄μ¦ˆλ₯Ό λ³€ν˜•ν•  수 있음 (λΆˆμ—°μ†μ μΈ λ©”λͺ¨λ¦¬ 곡간을 κ°€μ Έ λ©”λͺ¨λ¦¬ 관리에 용이)

  2. IntArray, ByteArray λ“± Primitive νƒ€μž…μ— λ§€ν•‘λ˜λŠ” μžλ£Œν˜•μ„ μ œκ³΅ν•˜λŠ” Array 와 λ‹€λ₯΄κ²Œ
    일반적인 경우 List λŠ” Primitive νƒ€μž…μ— μ΅œμ ν™”λœ (λ§€ν•‘λ˜λŠ”) κ΅¬ν˜„μ΄ μ‘΄μž¬ν•˜μ§€ μ•ŠμŒ
    (JDK μ™ΈλΆ€ 라이브러리 쀑 이λ₯Ό μ œκ³΅ν•˜λŠ” λΌμ΄λΈŒλŸ¬λ¦¬κ°€ 있긴 함)

  3. List 와 λ‹€λ₯΄κ²Œ Array λŠ” 동등성 비ꡐλ₯Ό μ§€μ›ν•˜μ§€ μ•ŠμŒ
    즉, Array 의 경우 ꡬ성 μ›μ†Œμ˜ μΈλ±μŠ€μ™€ 값이 λͺ¨λ‘ 같아도 false λ₯Ό 리턴함

  4. JVM μ°¨μ›μ—μ„œ 봀을 λ•Œ Array λŠ” arrays λ₯Ό λ§ν•˜κ³ , List λŠ” java.util.List λ₯Ό 말함



ν•œ λ§ˆλ””λ‘œ 말해, Array λŠ” μ²˜μŒλΆ€ν„° κ³ μ •λœ 크기λ₯Ό κ°–κ³  List λŠ” 이와 λ‹€λ₯΄κ²Œ λ™μ μœΌλ‘œ ν™œμš©ν•  수 μžˆλ‹€λŠ” 점이 κ°€μž₯ 큰 차이점이닀. μ΄μ œλΆ€ν„°λŠ” 이 λ‘˜μ˜ 차이점을 λͺ…λ°±νžˆ μ•Œκ³  μ‚¬μš©ν•˜λ„λ‘ ν•˜μž!

profile
μ–΄λ €μšΈμˆ˜λ‘ 기본에 미치고 μ—΄κ΄‘ν•˜λΌ

0개의 λŒ“κΈ€