dev_sia 2022. 11. 18. 19:44
  • 9μž₯μ—μ„œλŠ” μŠ€νƒκ³Ό 큐λ₯Ό μ•Œμ•„λ³Έλ‹€.
  • μŠ€νƒκ³Ό νλŠ” μž„μ‹œ 데이터λ₯Ό μ²˜λ¦¬ν•  수 μžˆλŠ” κ°„κ²°ν•œ 도ꡬ닀.
  • 운영 체제 μ•„ν‚€ν…μ²˜λΆ€ν„° 좜λ ₯, 데이터 μˆœνšŒμ— 이λ₯΄κΈ°κΉŒμ§€ μŠ€νƒκ³Ό 큐λ₯Ό μž„μ‹œ μ»¨ν…Œμ΄λ„ˆλ‘œ ν™œμš©ν•˜μ—¬ λ›°μ–΄λ‚œ μ•Œκ³ λ¦¬μ¦˜μ„ λ§Œλ“€ 수 μžˆλ‹€.

1. μŠ€νƒ

  • μŠ€νƒμ΄ 데이터λ₯Ό μ €μž₯ν•˜λŠ” 방법은 λ°°μ—΄κ³Ό κ°™λ‹€. 즉, μ›μ†Œλ“€μ˜ λ¦¬μŠ€νŠΈλ‹€.
  • μŠ€νƒμ—λŠ” λ‹€μŒκ³Ό 같은 μ œμ•½μ΄ μžˆλ‹€.
    • λ°μ΄ν„°λŠ” μŠ€νƒμ˜ λμ—λ§Œ μ‚½μž…ν•  수 μžˆλ‹€.
    • λ°μ΄ν„°λŠ” μŠ€νƒμ˜ λμ—μ„œλ§Œ μ‚­μ œν•  수 μžˆλ‹€.
    • μŠ€νƒμ˜ λ§ˆμ§€λ§‰ μ›μ†Œλ§Œ 읽을 수 μžˆλ‹€.
  • μ ‘μ‹œ 더미λ₯Ό μŒ“μ•„μ˜¬λ¦° κ²ƒμ²˜λŸΌ 생각해도 μ’‹λ‹€.
  • μŠ€νƒμ˜ 끝(μ‚½μž…, μ‚­μ œ, 읽기 κ°€λŠ₯)을 top, 밑을 bottom이라고 ν•œλ‹€.
  • μŠ€νƒμ— μƒˆ 값을 μ‚½μž…ν•˜λŠ” 것을 μŠ€νƒμ— ν‘Έμ‹œν•œλ‹€κ³ λ„ λ§ν•œλ‹€.
  • μŠ€νƒμ˜ λμ—μ„œ μ›μ†Œλ₯Ό μ œκ±°ν•˜λŠ” 것을 pop이라고 ν•œλ‹€.
  • LIFO - Last In, First Out

2. 좔상 데이터 νƒ€μž…

  • μ‹€μ œλ‘œ λŒ€λΆ€λΆ„μ˜ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μ„œλŠ” μŠ€νƒμ΄ λ‚΄μž₯ 데이터 νƒ€μž…μ΄λ‚˜ 클래슀둜 λ”Έλ € μžˆμ§€ μ•Šλ‹€.
  • λ°°μ—΄κ³ΌλŠ” κ·Ήλͺ…ν•˜κ²Œ λŒ€μ‘°λœλ‹€.
  • μŠ€νƒμ΄λΌλŠ” μžλ£Œκ΅¬μ‘°λŠ” λ°°μ—΄κ³Ό μ’…λ₯˜κ°€ λ‹€λ₯΄λ‹€.
  • 배열은 λŒ€λΆ€λΆ„μ˜ ν”„λ‘œκ·Έλž˜λ° 언어에 λ‚΄μž₯λ˜μ–΄ 있고 컴퓨터 λ©”λͺ¨λ¦¬μ™€ 직접 μƒν˜Έμž‘μš©ν•œλ‹€.
  • 반면 μŠ€νƒμ€ κ·œμΉ™μ˜ 집합이며 νŠΉμ • κ²°κ³Όλ₯Ό μ–»κΈ° μœ„ν•΄ λ°°μ—΄κ³Ό μƒν˜Έμž‘μš©ν•˜λŠ” 방식이닀.
  • μŠ€νƒμ€ λ‚΄λΆ€μ μœΌλ‘œ μ–΄λ–€ 자료ꡬ쑰λ₯Ό μ“°λ“  상관없닀. LIFO λ°©μ‹μœΌλ‘œ λ™μž‘ν•  수 μžˆλŠ” 데이터 μ›μ†Œλ“€μ˜ 리슀트면 λœλ‹€.
  • κ·Έλ ‡κΈ° λ•Œλ¬Έμ— μŠ€νƒμ€ 좔상 데이터 νƒ€μž…μ— μ†ν•œλ‹€.
  • 1μž₯μ—μ„œ 봀던 μ§‘ν•© μ—­μ‹œ 좔상 데이터 νƒ€μž…μ΄λ‹€.
  • μŠ€νƒκ³Ό μ§‘ν•©μ˜ 자료ꡬ쑰 μžμ²΄λŠ” κ·Έμ € μ΄λ‘ μƒμ˜ κ°œλ…μΌ 뿐이닀.
// kotlinμ—λŠ” stack의 κ΅¬ν˜„μ΄ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€. 즉, 직접 κ΅¬ν˜„ν•˜κ±°λ‚˜ java의 stack을 μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.
import java.util.Stack

val stack = Stack<Int>()
  • μ—¬κΈ°μ„œ μ‚¬μš©λ˜λŠ” Java의 Stack은 λ‹€μŒκ³Ό 같은 상속 ꡬ쑰λ₯Ό κ°€μ§„λ‹€.

Java의 Stack 상속ꡬ쑰

4. μ œμ•½μ„ κ°–λŠ” 데이터 ꡬ쑰의 μ€‘μš”μ„±

  • μ •μ˜λŒ€λ‘œ μŠ€νƒμ΄ μ œμ•½μ„ κ°–λŠ” 배열일 뿐이라면 μŠ€νƒμ΄ ν•˜λŠ” 일은 배열도 ν•  수 μžˆλ‹€λŠ” λœ»μ΄λ‹€.
  • κ·Έλ ‡λ‹€λ©΄ μŠ€νƒμ΄ μ£ΌλŠ” 이점은 λ¬΄μ—‡μΌκΉŒ?
  • μ œμ•½μ„ κ°–λŠ” 데이터 κ΅¬μ‘°λŠ” λ‹€μŒκ³Ό 같은 μ€‘μš”μ„±μ„ κ°€μ§„λ‹€.
    1. 잠재적 버그λ₯Ό 막을 수 μžˆλ‹€.
    2. 문제λ₯Ό ν•΄κ²°ν•˜λŠ” μƒˆλ‘œμš΄ 사고 λͺ¨λΈ(mental model)을 μ œκ³΅ν•œλ‹€.
    3. LIFO 속성을 μ΄ν•΄ν•˜μ—¬ μž‘μ„±ν•œ μ½”λ“œλŠ” λ‹€λ₯Έ κ°œλ°œμžμ—κ²Œ μ΅μˆ™ν•˜κ³  λͺ…λ°±ν•˜κ²Œ 이해될 수 μžˆλ‹€.

5. 큐

  • μŠ€νƒκ³Ό λ§ˆμ°¬κ°€μ§€λ‘œ, 큐도 μž„μ‹œ 데이터λ₯Ό μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ λ””μžμΈλœ 데이터 ꡬ쑰닀. μˆœμ„œλ₯Ό μ œμ™Έν•˜λ©΄ λ§Žμ€ λ©΄μ—μ„œ μŠ€νƒκ³Ό λΉ„μŠ·ν•˜λ‹€.
  • 큐도 좔상 데이터 νƒ€μž…μ΄λ‹€.
  • FIFO - First In, First Out
  • 큐의 μ‹œμž‘μ„ μ•ž(front), 끝을 λ’€(back)라고 ν•œλ‹€.
  • νλŠ” λ‹€μŒκ³Ό 같은 μ œμ•½μ„ κ°€μ§„λ‹€.
    • λ°μ΄ν„°λŠ” 큐의 λμ—λ§Œ μ‚½μž…ν•  수 μžˆλ‹€. (μŠ€νƒκ³Ό 동일)
    • λ°μ΄ν„°λŠ” 큐의 μ•žμ—μ„œλ§Œ μ‚­μ œν•  수 μžˆλ‹€. (μŠ€νƒκ³Ό λ°˜λŒ€)
    • 큐의 μ•žμ— μžˆλŠ” μ›μ†Œλ§Œ 읽을 수 μžˆλ‹€. (μŠ€νƒκ³Ό λ°˜λŒ€)
// kotlinμ—λŠ” Queue의 κ΅¬ν˜„μ΄ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€. 
// Javaμ—μ„œ μ œκ³΅ν•˜λŠ” Queueλ₯Ό μ‚¬μš©ν•  경우 Queueκ°€ μΈν„°νŽ˜μ΄μŠ€μ΄κΈ° λ•Œλ¬Έμ— Queue둜 μ„ μ–Έν•˜λ˜ LinkedList에 ν• λ‹Ήν•΄ μ£Όμ–΄μ•Ό ν•œλ‹€.
// ArrayListλ‘œλ„ κ΅¬ν˜„μ΄ κ°€λŠ₯ν•˜λ‹€.

var queue: Queue<Int> = LinkedList()

7. 마무리

  • μŠ€νƒκ³Ό νλŠ” μ‹€μš©μ μΈ μ•Œκ³ λ¦¬μ¦˜μ„ κ°„κ²°ν•˜κ²Œ μ²˜λ¦¬ν•  수 μžˆλŠ” 도ꡬ닀.
  • λ‹€μŒμ€ μŠ€νƒμ— κΈ°λ°˜ν•œ μž¬κ·€λ₯Ό λ°°μ›Œ λ³Έλ‹€.