π νλ‘κ·Έλλ° μΈμ΄ - Pointer and Refernece Types
2023-12-15. 12:20
π νλ‘κ·Έλλ° μΈμ΄ - Pointer and Reference Types κΈ κ³μΉ
π« ν¬μΈν° Pointer
@ U κΈ°λ§κ³ μ¬ μΆμ : C ν¬μΈν°λ₯Ό μ¬μ©νλλ° μμ΄μ λ°μν μ μλ λ¬Έμ μΈ Dangling Pointer
μ Memory Leaking
μ λνμ¬ μ€λͺ
νμμ€. μ΄μ λν ν΄κ²°μ±
λ κ°μ΄ μ€λͺ
νμμ€.
- ν¬μΈν° λ³μλ λ©λͺ¨λ¦¬ μ£Όμλ₯Ό κ°μ§λ νμ μ΄λ€.
νΉμκ° NIL/NULL μ£Όμλ₯Ό κ°μ§λ©΄, λ©λͺ¨λ¦¬ μ°Έμ‘°λ₯Ό ν μ μμμ μλ―Ένλ€.
- ν¬μΈν° μ€κ³μ μ©λ
- κ°μ μ£Όμμ§μ λ°©μμ μ§μνκΈ° μν΄
- Scopeλ£°μ μν΄ μ§μ μ κ·Όμ΄ μλλ λμμ κ°μ μ μΌλ‘ μ κ·ΌνκΈ° μν΄ μ¬μ©λ¨
- λμ κΈ°μ΅κ³΅κ°(ν heap)μ κ΄λ¦¬νλ λ°©μμ μ 곡νκΈ° μν΄
- κ°μ μ£Όμμ§μ λ°©μμ μ§μνκΈ° μν΄
- ν-λμ λ³μ
- ν곡κ°μ λμ μΌλ‘ ν λΉλλ λ³μ
- μλ³μ(μ΄λ¦)κ° μμ -> 무λͺ
λ³μ (νμ΄ Nameless λ‘ λΆλ¦¬κΈ°λ ν¨)
- λ°λΌμ ν¬μΈν°λ₯Ό μ΄μ©νμ¬ κ°μ μ μΌλ‘ μ κ·Όμ΄ κ°λ₯
- ν¬μΈν°λ λμ μλ£κ΅¬μ‘°μ μμ±λ ₯μ ν₯μμν΄
- Fortran 77μμλ λμ κΈ°μ΅κ³΅κ°μ΄Β μμ κ·Έλ¦¬κ³ μ΄μ§ νΈλ¦¬μ κ°μ λμ ꡬ쑰λ₯ΌΒ λ°°μ΄κ³Ό κ°μΒ μ΄μ©νμ¬ κ΅¬νν΄μΌ νλ―λ‘Β μμ±λ ₯μ΄ λ¨μ΄μ§
- μ€κ³ κ³ λ €Β μ¬ν
- ν¬μΈν° λ³μμ μμκ³Ό μ‘΄μκΈ°κ°μ 무μμΈκ°?
- ν-λμ λ³μ(ν¬μΈν°κ° μ°Έμ‘°νλ κ°)μ μ‘΄μκΈ°κ°μ 무μμΈκ°?
- ν¬μΈν°λΒ κ°λ¦¬ν¬ μ μλ κ°μλ μ μ½μ΄ μλκ°?
- ν¬μΈν°κ° λμ κΈ°μ΅κ³΅κ° κ΄λ¦¬, κ°μ μ£Όμμ§μ λλ λ κ°μ§ λͺ¨λλ₯Ό μν΄ μ¬μ©λλκ°?
- μΈμ΄κ° ν¬μΈν° νμ , μ°Έμ‘° νμ , λλ λ κ°μ§Β λͺ¨λλ₯Ό μ§μνλκ°?
- C/C++μ ν¬μΈν°
- μ΄μ
λΈλ¦¬μμ μ£Όμλ₯Ό μ¬μ©νλ λ°©μμΌλ‘ C/C++μμ μ£Όμλ₯Ό μ¬μ© κ°λ₯
- μ μ°μ±μ μ 곡νλ νμ ν¬μΈν°(dangling pointer)λ λ©λͺ¨λ¦¬ λμ(memory leaking)κ³Ό κ°μ λ¬Έμ μ μ΄λ€ ν΄κ²°μ± λ μ μνμ§ μμ ->Β λ§€μ° μ‘°μ¬ν΄μ μ¬μ©ν΄μΌ ν¨
- ν¬μΈν° μ°μ°
- *: μμ°Έμ‘° μ°μ°
- &: λ³μμ μ£Όμλ₯Ό μμ±νκΈ° μν μ°μ°
- +: ν¬μΈν°μ μ£Όμ λ§μ μ°μ°
- λ°°μ΄μ μμ μ κ·Όμ μν΄ μ¬μ©
- ν¬μΈν° μ μ
- βνμ *βμ μ΄μ©νμ¬ ν¬μΈν°λ₯Ό μ μ ν¨
- λ³μμ μ£Όμ κ³μ° λ° μμ°Έμ‘°
- λ³μμ μ£Όμλ₯Ό κ³μ°ν κ²½μ° & μ°μ°μλ₯Ό μ¬μ©
- μ£Όμκ°μ λν μμ°Έμ‘°λ₯Ό μνν κ²½μ° * μ°μ°μλ₯Ό μ¬μ©
- μ) pointer_basic.c
- Scopeμ΄ λ€λ₯Έ λ³μμ λν κ°μ μ°Έμ‘°
- Scopeλ£°μΒ μν΄ μ§μ μ κ·Όμ΄ μλλ λμμ κ°μ μ μΌλ‘Β μ κ·Ό νκΈ° μν΄ μ¬μ© λ¨
- μ) pointer_indirect.c
- λ°°μ΄κ³Ό ν¬μΈν°
- C/C++μμ λ°°μ΄λͺ μ μ£Όμκ°, ν¬μΈν°λ λ³μ
- C/C++μμ λ°°μ΄ μ체λ₯Ό ν¨μμ μΈμλ‘ λκΈΈ μ μμΌλ©° ν¬μΈν°λ₯Ό μ¬μ©ν΄μΌ ν¨
- μ£Όμκ° μ°μ°μ ν΅ν΄ νλͺ©λ€μ μ κ·Όνλ κ²μ΄ κ°λ₯
- λ°°μ΄μ μμ μ κ·Ό a[1]μ μ€μ λ‘ C μ»΄νμΌλ¬μμν΄ *(a + 1)λ‘ μ²λ¦¬
- C Programming Languageμ β5.3μ Pointers and ArraysβΒ μ°Έμ‘°
- μ) pointer_array_1.c, pointer_array_2.c, pointer_array_cpp.cpp
- ꡬ쑰체μ ν¬μΈν°
- ꡬ쑰체μ λ©€λ²λ₯Ό μ κ·Όν κ²½μ° . μ°μ°μλ₯Ό μ¬μ©
- ꡬ쑰체λ₯Ό ν¬μΈν°λ‘ μ§μ ν κ²½μ° (*ptr).memberλ‘ μ¬μ©ν΄μΌνλ©° μ΄λ ptr->memberλ‘ μ¬μ© κ°λ₯Β Β
- μ) pointer_struct.c, pointer_struct_cpp.cpp
- ꡬ쑰체μ λ©€λ²λ₯Ό μ κ·Όν κ²½μ° . μ°μ°μλ₯Ό μ¬μ©
- μ΄μ
λΈλ¦¬μμ μ£Όμλ₯Ό μ¬μ©νλ λ°©μμΌλ‘ C/C++μμ μ£Όμλ₯Ό μ¬μ© κ°λ₯
- ν¬μΈν°κ° μ λ°ν μ μλ λ¬Έμ
- Dangling pointer (Stray pointer, νμ ν¬μΈν°)
- μ΄λ―Έ νμλ ν-λμ λ³μμ μ£Όμλ₯Ό κ°μ§κ³ μλ ν¬μΈν°
- λ¬Έμ μ
- ν¬μΈν°κ° κ°λ¦¬ν€λ λ©λͺ¨λ¦¬κ° νμλ ν λ€μ ν λΉ λ κ²½μ° μ΄μ ν¬μΈν°λ₯Ό μ΄μ©ν κ°μ λ³κ²½μ λ¬Έμ λ₯Ό λ°μμν¬ μ μμ
- μ) dangling_pointer.c
- ν΄κ²°μ±
- ν¬μΈν°κ° κ°λ¦¬ν€λ λ©λͺ¨λ¦¬κ° νμλ κ²½μ°, ν¬μΈν°λ₯Ό NULLλ‘ μ€μ νλ€.
- Memory leaking (λ©λͺ¨λ¦¬ λμ)
- λ μ΄μ μ κ·Όν μ μλ ν-λμ λ³μ(μ°λ κΈ°)κ° λ°μνλ νμ
- μ°λ κΈ°(Garbage): λ³μλ€μ΄ μλμ λͺ©μ μμ μ μ©νμ§ μκ³ , νλ‘κ·Έλ¨μμ μλ‘μ΄ μ©λλ‘ λ€μ νμ©ν μ μλ λ©λͺ¨λ¦¬
- μ) memory_leaking.c
- ν΄κ²°μ±
- ν-λμ λ³μλ₯Ό λ€ μ¬μ©νκ³ λλ©΄ λ°λμ λ°λ©μ νλΌ.
- Cμμλ freeν¨μ C++μμλ delete μ°μ°
- ν-λμ λ³μλ₯Ό λ€ μ¬μ©νκ³ λλ©΄ λ°λμ λ°λ©μ νλΌ.
- λ μ΄μ μ κ·Όν μ μλ ν-λμ λ³μ(μ°λ κΈ°)κ° λ°μνλ νμ
- Dangling pointer (Stray pointer, νμ ν¬μΈν°)
- μ°Έμ‘° νμ
- λ©λͺ¨λ¦¬μ κ°μ²΄λ κ°μ μ°Έμ‘°νλ μ©λ
- ν¬μΈν°λ λ©λͺ¨λ¦¬μ μ£Όμλ₯Ό μ°Έμ‘°
- ν¬μΈν°λ μ£Όμμ λν μ°μ μ°μ°μ΄ κ°λ₯νλ, μ°Έμ‘°λ μ£Όμμ λν μ°μ μ°μ°μ΄ νμ©λμ§ μμ
- C++μμμ μ°Έμ‘° νμ
- 묡μμ μΌλ‘ μμ°Έμ‘°λλ μμ ν¬μΈν°λ‘ λ³μμ μ μμμμ &λ₯Ό μ¬μ©
- C++μ μ°Έμ‘° νμ μ νλ² μ΄κΈ°νλλ©΄ λ€λ₯Έ λ³μλ₯Ό μ°Έμ‘°νλλ‘ μ€μ ν μ μμ
- μ) reference_1.cpp
- μ°Έμ‘° νμ
μ μ΄μ©νμ¬ νμ 맀κ°λ³μμ μ λ¬μ νμ© (μ»΄νμΌλ¬κ° μ£Όμ μ λ¬)
- ν¬μΈν°λ κ°λ μ±μ΄ λ¨μ΄μ§κ³ μμ νμ§ μμ μ°μ°μ μ λ°ν μ μμ
- νμ§λ§ μ°Έμ‘° νμ λν μλ³Έ κ°μ λ³νμν€λ λΆμμ©μ μ λ°ν μ μμ
- μ) reference_2.cpp
- Javaμμμ μ°Έμ‘° νμ
- μμ μ± ν₯μμ μν΄ C/C++ μ νμ ν¬μΈν°λ₯Ό μ κ±°
- JavaμμλΒ κ°μ²΄λ₯Ό μ°Έμ‘°ν μ μλλ‘ μ¬μ©νλ©° λ³μ μ(μμκ° μλ)
- Javaμμ κ°μ²΄λ€μ Managed-Heapμ ν λΉλλ©° μ°Έμ‘°λ₯Ό ν΅ν΄ μ κ·Όλ¨
- μ΄λ€ μ°Έμ‘°λΒ λμ§ μλ κ°μ²΄λ GC(Garbage Collector)μ μν΄ νμ -> λ©λͺ¨λ¦¬ λμκ° μμ
- μ) StudentExam.java
- C#
- ν¬μΈν°μ Java μ€νμΌμ μ°Έμ‘°λ₯Ό λͺ¨λ ν¬ν¨, νμ§λ§ ν¬μΈν° μ¬μ©μ κΆμ₯μΉ μμ
- C/C++κ³Όμ μ°λμ μνμ¬ ν¬ν¨λ¨, ν¬μΈν° μ¬μ©μ unsafeλΌλ μ§μ μ νμ
- μ°Έμ‘°λ κ°μ²΄λ 묡μμ μΌλ‘ νμλλ ν¬μΈν°λ₯Ό μ΄μ©νμ¬ μ°Έμ‘°λ κ°μ²΄λ λͺ μμ νμκ° νμ
- ν¬μΈν°μ Java μ€νμΌμ μ°Έμ‘°λ₯Ό λͺ¨λ ν¬ν¨, νμ§λ§ ν¬μΈν° μ¬μ©μ κΆμ₯μΉ μμ
- Smalltalk, Python, Ruby, Lua
- λͺ¨λ λ³μλ μ°Έμ‘° νμ μ΄λ©° λͺ¨λ λμμ κ°μ²΄μ
- μ) student_exam.py
- 묡μμ μΌλ‘ μμ°Έμ‘°λλ μμ ν¬μΈν°λ‘ λ³μμ μ μμμμ &λ₯Ό μ¬μ©
- λ©λͺ¨λ¦¬μ κ°μ²΄λ κ°μ μ°Έμ‘°νλ μ©λ
- νκ°
- ν¬μΈν°λ νμ ν¬μΈν°(Dangling Pointer)μ λ©λͺ¨λ¦¬ λμ(Memory Leaking)κ³Ό κ°μ λ¬Έμ λ΄ν¬
- ν¬μΈν° λ³μλ λ©λͺ¨λ¦¬μ μ°Έμ‘° λ²μλ₯Ό νλνλ κ²½ν₯μ΄ μμ
- βκ³ κΈμΈμ΄μμ ν¬μΈν°μ λμ μ κ²°μ½ ν볡ν μ μλ ν κ±Έμμ νν΄μλ€β - Hoare
- ν¬μΈν°λ λλ°μ΄μ€ λλΌμ΄λ²(μ₯μΉ κ΄λ¦¬μ)μ κ°μ μμ€ν νλ‘κ·Έλ¨Β μμ±μλ νμμ μΈ μμ
- Java, C#, Pythonλ±μ μ°Έμ‘° λ³μλ μμ μ±κ³Ό μ μ°μ±μ μ 곡
- κ²°κ΅ ν¬μΈν°μ μ°Έμ‘° λ³μλ μ±λ₯(νΉμ μμ )μ μμ μ±μ Trade-off
π« κ³Όμ 1
κ΅μ¬μ κΈ°ν μλ£λ€μ μ°Έκ³ νμ¬, Pointerμ Reference Typeλ€μ μ 리νκ³ μ΄ν΄νλΌ.
κ΅μ¬ βConcepts of Programming Languagesβ, 6.11 Pointerμ Reference Type
π« Pointer
λ©λͺ¨λ¦¬ μ£Όμ, νΉμ κ°, nil
(null) κ°μ κ°μ§ μ μλ λ³μλ€.
nilμ μ ν¨ν μ£Όμκ° μλλ©°, νμ¬ ν΄λΉ ν¬μΈν°κ° λ©λͺ¨λ¦¬ μ
μ μ°Έμ‘°νλ λ°μ μΈ μ μμμ λνλ΄λ λ° μ°μΈλ€.
ν¬μΈν°λ λ κ°μ§ μ©λλ‘ μ€κ³λμλ€.
- μ΄μ λΈλ¦¬μμ μ£Όλ‘ μ¬μ©λλ κ°μ μ£Όμ μ§μ
- λμ μ μ₯κ³΅κ° κ΄λ¦¬
ν¬μΈν°λ₯Ό μ¬μ©νμ¬, ν - Heap
μ λμ μΌλ‘ ν λΉλ μ μ₯κ³΅κ° μμΉμ μ κ·Όν μ μλ€.
νμΌλ‘λΆν° λμ μΌλ‘ ν λΉλλ λ³μλ₯Ό ν λμ λ³μ - Heap-Dynamic Variables
λΌκ³ νλ€.
λλΆλΆ μλ³μλ₯Ό λ°λ‘ κ°μ§κ³ μμ§ μκ³ , ν¬μΈν° λλ μ°Έμ‘° λ³μλ₯Ό ν΅ν΄μλ§ μ°Έμ‘°ν μ μμ΅λλ€.
μ΄λ¦ μλ λ³μλ₯Ό μ΅λͺ
λ³μ - Anonymous Variables
λΌκ³ νλ€.
2λ² μ©λμμ κ°μ₯ μ€μν μ€κ³ λ¬Έμ κ° μκΈ΄λ€. ν¬μΈν°λ νμ μ°μ°μ(* Cμ C++, access Ada)λ₯Ό μ¬μ©νμ¬ μ μλμ§λ§, λ°°μ΄μ΄λ λ μ½λμλ λ¬λ¦¬ ꡬ쑰νλ νμμ μλλ€. λν λ°μ΄ν°λ₯Ό μ μ₯νλ λ° μ¬μ©λλ κ²μ΄ μλλΌ, λ€λ₯Έ λ³μλ₯Ό μ°Έμ‘°νλ λ° μ¬μ©λκΈ° λλ¬Έμ μ€μΉΌλΌ λ³μμλ λ€λ₯΄λ€.
μ΄ λ λ²μ£Όμ λ³μλ₯Ό κ°κ° μ°Έμ‘° μ ν - ReferenceTypes
κ³Ό κ° μ ν - ValueTypes
μ΄λΌκ³ νλ€.
ν¬μΈν°λ₯Ό μ¬μ©νλ λ μ ν λͺ¨λ νλ‘κ·Έλλ° μΈμ΄μ μμ±λ ₯μ λμμ μ€λ€.
i,e,
ν¬μΈν°κ° μλ Fortran 77 κ°μ μΈμ΄λ‘ μ΄μ§ νΈλ¦¬μ²λΌ λμ ꡬ쑰λ₯Ό ꡬνν΄μΌ νλ€λ©΄, νλ‘κ·Έλλ¨Έκ° κ°μ©ν νΈλ¦¬ λ
Έλ νμ μ 곡νκ³ μ μ§ν΄μΌ νλ©°, μ΄λ λ³λ ¬ μ΄λ μ΄λ‘ ꡬνλ κ°λ₯μ±μ΄ λλ€. λν Fortran 77μλ λμ μ μ₯ 곡κ°μ΄ μκΈ° λλ¬Έμ νλ‘κ·Έλλ¨Έκ° νμν μ΅λ λ
Έλ μλ₯Ό μΆμΈ‘ν΄μΌ ν κ²μ΄λ€. μ΄λ λΆλͺ
μ΄μνκ³ , μ€λ₯κ° λ°μνκΈ° μ¬μ΄ μ²λ¦¬ λ°©λ²μ΄λ€.
μ°Έμ‘° λ³μλ ν¬μΈν°μ λ°μ ν κ΄λ ¨μ΄ μλ€.
π« μ€κ³ λ¬Έμ - Design Issue
- ν¬μΈν° λ³μμ λ²μμ μλͺ μ μΌλ§μΈκ°?
- λμ λ³μ(ν¬μΈν°κ° μ°Έμ‘°νλ κ°)μ μλͺ μ μΌλ§μΈκ°?
- ν¬μΈν°κ° κ°λ¦¬ν€λ κ°μ μ νμ μ νμ΄ μλ?
- ν¬μΈν°μ μ©λκ° λμ μ€ν λ¦¬μ§ κ΄λ¦¬, κ°μ μ£Όμ μ§μ λλ λ λ€ μΈκ°?
- μΈμ΄λ ν¬μΈν° μ ν, μ°Έμ‘° μ ν λλ λ λ€λ₯Ό μ§μν΄μΌ νλ?
π« ν¬μΈν° μ°μ°λ€
ν¬μΈν° νμ μ μ 곡νλ μΈμ΄λ€μ λκ° λ κ°μ§ κΈ°λ³Έμ μΈ ν¬μΈν° μ°μ°μ ν¬ν¨νλ€.
- ν λΉ - Assignment
- μμ°Έμ‘° - Dereferencing
μμμ ν¬μΈν° λ³μμ λ°μμ λ κ°μ§ λ°©λ²μΌλ‘ ν΄μν μ μλ€.
- μΌλ°μ μΈ μ°Έμ‘° : ν¬μΈν° λ°μΈλ©λ λ©λͺ¨λ¦¬ μ
μ체μ λ΄μ© μ°Έμ‘°
- μμμμ λΉν¬μΈν° λ³μλ μ νν μ΄λ° μμΌλ‘ ν΄μλμ§λ§, κ·Έ κ²½μ°μλ κ°μ΄ μ£Όμκ° μλ κ°λ₯μ±μ΄ λλ€.
- κ°μ μ μΈ μ°Έμ‘° (
μμ°Έμ‘°
) : ν¬μΈν°κ° λ°μΈλ©λ λ©λͺ¨λ¦¬ μ μ΄ κ°λ¦¬ν€λ λ©λͺ¨λ¦¬ μ λ΄μ κ°μ μ°Έμ‘°νλ κ²
𫧠ν λΉ - Assingment
ν¬μΈν° λ³μμ κ°μ μ΄λ€ μ μ©ν μ£Όμλ‘ μ€μ νλ€.
ν¬μΈν° λ³μλ₯Ό μ€μ§ λμ μ μ₯κ³΅κ° κ΄λ¦¬μλ§ μ¬μ©νλ€λ©΄, ν λΉ λ©μ»€λμ¦μ μ°μ°μμ μν΄μλ λ΄μ₯ ν¨μμ μν΄μλ ν¬μΈν° λ³μλ₯Ό μ΄κΈ°ννλ μν μ νλ€.
ν¬μΈν° λ³μλ₯Ό μ€μ§ κ°μ μ£Όμ μ§μ μ μν΄μ μ¬μ©νλ€λ©΄, λ³μμ μ£Όμλ₯Ό κ°μ Έμ€λ λͺ
μμ μ°μ°μλ λ΄μ₯ ν¨μμ΄ μμ΄μΌ ν¬μΈν° λ³μμ ν λΉν μ μλ€.
νμ κ΄λ¦¬λ₯Ό μν ν¬μΈν°λ₯Ό μ 곡νλ μΈμ΄λ λͺ μμ μΈ ν λΉ μ°μ°μ ν¬ν¨ν΄μΌ νλ€.
Cμ mallocκ³Ό κ°μ ν¨μλ‘ μ§μ λκΈ°λ νλ€.
κ°μ²΄ μ§ν₯ μΈμ΄μμλ ν κ°μ²΄μ ν λΉμ new μ°μ°μλ‘ μ§μ νλ κ²½μ°κ° λ§λ€.
μ묡μ μΈ ν λΉ ν΄μ λ₯Ό μ 곡νμ§ μλ C++ deleteλ₯Ό ν λΉ ν΄μ μ°μ°μλ‘ μ¬μ©νλ€.
𫧠μμ°Έμ‘° - Dereference-ing
ν λ¨κ³μ λ°©ν₯μ±μ ν΅ν΄ μ°Έμ‘°λ₯Ό μ·¨νλ κ². λͺ μμ μ΄κ±°λ μ묡μ μΌ μ μλ€.
Fortran 95+μμ μμμ μ΄μ§λ§, λ€λ₯Έ λ§μ νλ μΈμ΄μμλ λͺ
μμ μΌλ‘ μ§μ λ κ²½μ°μλ§ λ°μνλ€.
C++μμλ μ λμ¬ λ¨ν μ°μ°μλ‘ λ³ν(*)μ ν¨κ» λͺ
μμ μΌλ‘ μ§μ λλ€.
i.e.
ptrμ΄ κ° 7080μΈ ν¬μΈν° λ³μμ΄κ³ , μ£Όμκ° 7080μΈ μ
μ κ°μ΄ 206μΈ κ²½μ°,
ν λΉ βj = *ptrβμ jλ₯Ό 206μΌλ‘ μ€μ νλ κ²μ΄λ€.
ν¬μΈν°κ° λ μ½λλ₯Ό κ°λ¦¬ν¬ λ μ΄λ¬ν λ μ½λμ νλμ λν μ°Έμ‘°μ λ¬Έλ²μ μΈμ΄λ§λ€ λ€λ₯΄λ€.
in C/Cpp
- (*p.age), ν¬μΈν° λ³μ pκ° ageλΌλ νλλ₯Ό κ°μ§ λ μ½λλ₯Ό κ°λ¦¬ν¬ λ
- p -> age, μ°μ°μ
->
λ λ μ½λμ λν ν¬μΈν°μ ν΄λΉ λ μ½λμ νλ μ¬μ΄μ μ¬μ©λ λ μμ°Έμ‘°μ νλ μ°Έμ‘°λ₯Ό κ²°ν©
Ada, μ΄λ¬ν ν¬μΈν°μ μ¬μ©μ΄ μ묡μ μΌλ‘ μμ°Έμ‘°λκΈ° λλ¬Έμ p.ageλ₯Ό μ¬μ©ν μ μλ€.
π« ν¬μΈν°μ λ¬Έμ λ€
ν¬μΈν° λ³μλ₯Ό ν¬ν¨ν μ΅μ΄μ κ³ μμ€ μΈμ΄ βPL/Iβ, μ¬κΈ°μ ν¬μΈν°λ λμ λ³μμ λ€λ₯Έ λ³μλ₯Ό λͺ¨λ μ°Έμ‘°νλ λ° μ¬μ©λ μ μμλ€.
PL/Iμ ν¬μΈν°λ λ§€μ° μ μ°νμ§λ§ μ¬λ¬ μ€λ₯λ₯Ό λ°μμν¬ μ μμλ€.
νμ μΈμ΄λ€μ ν¬μΈν°λ€μλ PL/I ν¬μΈν°λ€μ λ¬Έμ μ€ μΌλΆκ° κ·Έλλ‘ μ‘΄μ¬νλ€.
μ΅κ·Ό μΈμ΄λ€μ ν¬μΈν°λ€μ μ°Έμ‘° νμμΌλ‘ μμ ν λ체νλλ°, μ΄λ μ묡μ μΈ ν λΉ ν΄μ μ ν¨κ» ν¬μΈν°λ€μ μ£Όμ λ¬Έμ λ₯Ό μ΅μννλ€. μ°Έμ‘° νμμ μ€μ λ‘ μ°μ°μ΄ μ νλ ν¬μΈν°μΌ λΏμ΄λ€.
𫧠Dangling Pointers
Danling Pointer, Dangling Reference
ν λΉ ν΄μ λ λμ λ³μμ μ£Όμλ₯Ό ν¬ν¨νλ ν¬μΈν°λ€.
λ¬Έμ κ° λλ μ΄μ
- κ°λ¦¬ν€λ μμΉκ° μ΄λ€ μλ‘μ΄ λμ λ³μμ μ¬ν λΉ λμ μ μλ€.
- μλ‘μ΄ λ³μκ° μ΄μ λ³μμ λμΌν μ νμ΄ μλλΌλ©΄, λκΈλ§ ν¬μΈν°μ μ©λμ λν μ ν κ²μ¬λ μ ν¨νμ§ μλ€.
- μλ‘μ΄ λμ λ³μκ° λμΌν μ νμ΄λλΌλ, κ·Έκ²μ μλ‘μ΄ κ°μ μ΄μ ν¬μΈν°μ νκΈ°λ κ°κ³Ό κ΄λ ¨μ΄ μμ κ²μ΄λ€.
- λκΈλ§ ν¬μΈν°κ° λμ λ³μ κ°μ λ³κ²½νλ λ° μ¬μ©λλ€λ©΄, μλ‘μ΄ λμ λ³μμ κ°μ νκ΄΄λ κ²μ΄λ€.
- νμ¬ μμΉκ° μ€ν λ¦¬μ§ κ΄λ¦¬ μμ€ν μ μν΄ μΌμμ μΌλ‘ μ¬μ©λκ³ μμ μ μκ³ , μλ§λ μ¬μ© κ°λ₯ν μ€ν λ¦¬μ§ λΈλ‘λ€μ 체μΈμμ ν¬μΈν°λ‘ μ¬μ©λ μ μμΌλ―λ‘, μ€ν λ¦¬μ§ κ΄λ¦¬μκ° μ€ν¨νλ μμΈμ΄ λ μ μλ€.
Danling Pointerκ° λ§λ€μ΄μ§λ κ³Όμ
- μλ‘μ΄ λμ λ³μ μμ±, ν¬μΈν° p1μ΄ ν΄λΉ λ³μλ₯Ό κ°λ¦¬ν€λλ‘ μ€μ .
- ν¬μΈν° p2μ p1μ κ°μ΄ ν λΉ.
- p1μ΄ κ°λ¦¬ν€λ λμ λ³μλ λͺ
μμ μΌλ‘ ν λΉ ν΄μ λμ§λ§ (p1μ nilλ‘ μ€μ ν μλ μμ), p2λ μ°μ°μ μν΄ λ³κ²½λμ§ μμ.
- μ΄μ p2λ Danling Pointer.
- ν λΉ ν΄μ μ°μ°μ΄ p1μ λ³κ²½νμ§ μμλ€λ©΄ p1κ³Ό p2λ λͺ¨λ Danling PointerμΌ κ².
- (λ¬Όλ‘ μ΄κ²μ Ailiasingμ λ¬Έμ , p1κ³Ό p2λ Aliases.)
i.e.
1
2
3
4
5
6
int * arrayPtr1;
int * arrayPtr2 = new int[100];
arrayPtr1 = arrayPtr2;
delete [] arrayPtr2;
// Now, arrayPtr1 is dangling, because the heap storage
// to which it was pointing has been deallocated.
λ°°μ΄ Ptr1κ³Ό Ptr2 λͺ¨λ λ¬λ§ ν¬μΈν°κ° λλλ°, μ΄λ C++ delete
μ°μ°μκ° νΌμ°μ°μ ν¬μΈν°μ κ°μ μλ¬΄λ° μν₯μ μ£Όμ§ μκΈ° λλ¬Έμ΄λ€.
C++μμλ nullμ λνλ΄λ 0μ ν λΉμ κ°μ§ delete
μ°μ°μλ₯Ό ν¬μΈν°μ λ°λΌ μ΄λνλ κ²μ΄ μΌλ°μ μ΄λ©° μμ ν©λλ€.
λμ λ³μμ λͺ
μμ μΈ ν λΉ ν΄μ κ° λκΈλ§ ν¬μΈν°μ μμΈμ΄λΌλ μ μ μ μνμμμ€.
delete
` μ°μ°μκ° νΌμ°μ°μ ν¬μΈν°μ κ°μ μλ¬΄λ° μν₯μ λ―ΈμΉμ§ μκΈ° λλ¬Έμ λ°°μ΄ Ptr1κ³Ό Ptr2 λͺ¨λ λκΈλ§ ν¬μΈν°κ° λλ€.
κ°λ¦¬μΉλ κ°μ΄ ν λΉ ν΄μ λ ν¬μΈν°μ nullμ λνλ΄λ 0μ ν λΉνλ μλ―Έμ βdeleteβ μ°μ°μλ₯Ό λ°λ₯΄λ κ²μ΄ μΌλ°μ μ΄λ©° μμ νλ€.
λμ λ³μμ λͺ μμ μΈ ν λΉ ν΄μ κ° λκΈλ§ ν¬μΈν°μ μμΈμ΄λΌλ μ μ μ μ.
𫧠Lost Heap-Dynamic Variables
Lost Heap-Dynamic Variables
ν λΉλ λμ λ³μμ§λ§, λ μ΄μ μ¬μ©μ νλ‘κ·Έλ¨μμ μ κ·Όν μ μλ λ³μλ₯Ό λ§νλ€.
μ΄λ¬ν λ³μλ€μ μλ λͺ©μ μ μ μ©νμ§ μκ³ νλ‘κ·Έλ¨μμ μλ‘μ΄ μ©λλ‘ μ¬ν λΉλ μ μκΈ° κ°λΉμ§(garbage)λΌκ³ λ λΆλ¦°λ€.
Lost Heap-Dynamic Variablesκ° λ§λ€μ΄μ§λ κ³Όμ
- ν¬μΈν° p1μ μλ‘ μμ±λ λμ λ³μ Aλ₯Ό κ°λ¦¬ν€λλ‘ μ€μ
- p1μ λμ€μ μλ‘ μμ±λ λ€λ₯Έ λμ λ³μBλ₯Ό κ°λ¦¬ν€λλ‘ μ€μ
- Aλ μ΄μ μ κ·Όν μ μμ, μ μ€λ¨. (λ©λͺ¨λ¦¬ λμ - Memory Leak)
λ©λͺ¨λ¦¬ λμλ μΈμ΄κ° μμμ λλ λͺ μμ ν λΉ ν΄μ λ₯Ό μ¬μ©νλμ§μ κ΄κ³μμ΄ λ¬Έμ κ° λλ€.
π« μΈμ΄ λ³ ν¬μΈν° (+ ν¬μΈν° λ¬Έμ ν΄κ²° λ°©λ²)
𫧠Pointers in Ada
ν¬μΈν°λ₯Ό Access νμ μ΄λΌκ³ λΆλ₯Έλ€.
βDangling Pointerβ λ¬Έμ λ μ΄λ‘ μ μΌλ‘λ Adaμ μ€κ³μ μν΄ λΆλΆμ μΌλ‘ μνλλ€.
λμ λ³μκ° ν¬μΈν° νμ
μ Scope λμ μ묡μ μΌλ‘ (μ νμ λ°λΌ) ν λΉ ν΄μ λ μ μμΌλ―λ‘, λͺ
μμ μΈ ν λΉ ν΄μ μ νμμ±μ΄ ν¬κ² μ€μ΄λ λ€.
κ·Έλ¬λ Ada μ»΄νμΌλ¬ μ€μ μ΄λ° ννμ κ°λΉμ§ 컬λ μ
μ ꡬννλ κ²½μ°λ κ±°μ μκΈ° λλ¬Έμ, λλΆλΆ μ΄λ‘ μ μΌλ‘λ§ μ΄μ μ΄ μλ€.
λμ λ³μλ μ€μ§ ν μ’
λ₯μ λ³μλ§ μ κ·Όν μ μκΈ° λλ¬Έμ, ν΄λΉ νμ
μ μΈμ Scope λμ λλ¬νλ©΄ λμ λ³μλ₯Ό κ°λ¦¬ν€λ ν¬μΈν°λ₯Ό λ¨κΈΈ μ μλ€.
μ΄λ¬λ©΄ λ¬Έμ κ° μ€μ΄λ λ€.
λͺ μμ ν λΉ ν΄μ μΈ Unchecked_Deallocationλ μκΈ΄ νμ§λ§, Dangling-pointerλ₯Ό λ°μμν¬ μ μκΈ°μ, μ΄λ¦μ ν΅ν΄ μ μ¬μ μΈ λ¬Έμ λ₯Ό κ²½κ³ νκ³ μλ€.
βLost Heap-Dynamic Variablesβ λ¬Έμ λ μ€κ³λ‘ ν΄κ²°λμ§ μλλ€.
𫧠Pointers in C and C++
μ£Όμκ° μ΄μ
λΈλ¦¬ μΈμ΄μμ μ¬μ©λλ κ²κ³Ό κ°μ λ°©μμΌλ‘ ν¬μΈν°λ₯Ό μ¬μ©ν μ μλλ°,
μ΄λ λ§€μ° μ μ°νμ§λ§ μ£Όμν΄μ μ¬μ©ν΄μΌ ν¨μ μλ―Ένλ€. μ΄λ¬ν μ€κ³λ ν¬μΈν° λ¬Έμ λ€μ λν ν΄κ²°μ±
μ μ 곡νμ§ μκΈ° λλ¬Έμ΄λ€.
κ·Έλ¬λ C/C++μμ ν¬μΈν° μ°μ°μ΄ κ°λ₯νλ€λ μ¬μ€μ λ€λ₯Έ νλ‘κ·Έλλ° μΈμ΄λ³΄λ€ ν¬μΈν°κ° λ ν₯λ―Έλ‘κ² λ§λ λ€. (리μ€ν¬/리ν΄)
Cμ C++ ν¬μΈν°λ ν λΉλ μμΉμ κ΄κ³μμ΄ μμμ λ³μλ₯Ό κ°λ¦¬ν¬ μ μλ€.
μ€μ λ‘ ν¬μΈν°μ μν μ€ νλμΈ λ³μκ° μ‘΄μ¬νλ μ‘΄μ¬νμ§ μλ λ©λͺ¨λ¦¬μ μ΄λ κ³³μ κ°λ¦¬ν¬ μ μλ€.
λ μ½λλ μλ―Έκ° κ°λ€.
1
2
3
4
5
6
7
int *ptr;
int count, init;
// ...
ptr = &init;
count = *ptr;
1
2
int count, init;
count = init;
μΌλΆ μ νλ νμμΌλ‘ Pointer μ°μ°μ΄ κ°λ₯νλ€.
μλ₯Ό λ€μ΄, ptrμ΄ μΌλΆ λ°μ΄ν° μ νμ λ³μλ₯Ό κ°λ¦¬ν€λ κ²μΌλ‘ μ μΈλ ν¬μΈν° λ³μλΌλ©΄ βptr + indexβλ ν©λ²μ μΈ ννμμ
λλ€.
ptrμμ (ptrμ΄ λμμΌλ‘ νλ νμ
ν¬κΈ° * index) λ§νΌ λ¨μ΄μ§ λ©λͺ¨λ¦¬ μ
μ κ°λ¦¬ν¨λ€.
μ΄λ¬ν μ£Όμ μ°μ°μ μ£Όλ λͺ©μ μ λ°°μ΄ μ‘°μμ΄λ€.
(1μ°¨μ λ°°μ΄μ λν΄ ) C/C++μμ λͺ¨λ λ°°μ΄μ 첨μ λ²μμ ννμΌλ‘ 0μ μ¬μ©νλ©°, 첨μκ° μλ λ°°μ΄ μ΄λ¦μ νμ 첫 λ²μ§Έ μμμ μ£Όμλ₯Ό λνλ λλ€.
1
2
3
4
int list [10];
int *ptr;
ptr = list;
- *(ptr + 1)λ list[1]
- *(ptr + index)λ list[index]
- ptr[index]λ list[index]
ν¬μΈν° μ°μ°μ΄ μΈλ±μ± μ°μ°μμ μ¬μ©λλ κ²κ³Ό κ°μ μ€μΌμΌλ§μ ν¬ν¨νλ€λ κ²μ΄ λΆλͺ
νλ€.
λ°°μ΄μ λν ν¬μΈν°λ€μ λ°°μ΄ μ΄λ¦μΈ κ²μ²λΌ μΈλ±μ±λ μ μλ€.
ν¬μΈν°λ€μ 맀κ°λ³μ μ λ¬μλ μ¬μ©λλ€.
C/C++λ μ΄λ€ νμμ κ°μ΄λ κ°λ¦¬ν¬ μ μλ μΌλ°μ μΈ ν¬μΈν°, void* ν¬μΈν°λ€μ μ΄μ©νλ€.
C/C++μ ν¬μΈν°λ€μ ν¨μλ€μ κ°λ¦¬ν¬ μ μλ€.
맀κ°λ³μλ₯Ό ν΅ν΄ ν¨μλ€μ λ€λ₯Έ ν¨μμ μ λ¬νλ λ° μ¬μ©λλ€.
π« Reference Type
Reference Typeμ ν¬μΈν°μ λΉμ·νμ§λ§, μ€μνκ³ κΈ°λ³Έμ μΈ μ°¨μ΄μ μ΄ μλ€.
ν¬μΈν°λ λ©λͺ¨λ¦¬ λ΄μ μ£Όμλ₯Ό μλ―Ένκ³ ,
μ°Έκ³ νμ λ©λͺ¨λ¦¬ λ΄μ κ°μ²΄λ κ°μ μλ―Ένλ€.
λ°λΌμ,
μ£Όμμ λν΄μλ μ°μ°μ μννλ κ²μ΄ λΉμ°νμ§λ§
μ°Έκ³ νμ λν΄μλ μ°μ°μ μννλ κ²μ΄ μ μ νμ§ μλ€.
C++λ ν¨μ μ μμμ 곡μ 맀κ°λ³μμ μ£Όλ‘ μ¬μ©λλ νΉμν μ’
λ₯μ μ°Έμ‘°νμ΄ μλ€.
C++ μ°Έμ‘°ν λ³μλ νμ μ묡μ μΌλ‘ λλ νΌλ°μ€λλ μμ ν¬μΈν°μ
λλ€.
C++ μ°Έμ‘°ν λ³μλ μμμ΄λ―λ‘ μ μμμ μ΄λ€ λ³μμ μ£Όμλ‘ μ΄κΈ°νλμ΄μΌ νλ©°,
μ΄κΈ°ν νμλ μ λλ‘ λ€λ₯Έ λ³μλ₯Ό μ°Έμ‘°νλλ‘ μ€μ ν μ μμ΅λλ€.
μ묡μ λλ νΌλ°μ€λ μ°Έμ‘° λ³μμ μ£Όμ κ°μ ν λΉλμ§ μμ΅λλ€.
μ°Έμ‘°ν λ³μλ μ°νΌμλ(&)λ‘ μ΄λ¦ μμ λΆμ¬ μ μλ©λλ€. μλ₯Ό λ€μ΄,
1
2
3
result = 0;
int &ref_ result = result;
ref_result = 100;
μ΄ μ½λ μΈκ·Έλ¨ΌνΈμμ result λ° ref_resultλ λ³μΉ(λμμ΄)μ΄λ€.
ν¨μ μ μμμ νμ 맀κ°λ³μλ‘ μ¬μ©λλ κ²½μ° C++ μ°Έμ‘° μ νμ νΈμΆμ ν¨μμ νΈμΆλ ν¨μ κ°μ μλ°©ν₯ ν΅μ μ μ 곡νλ€.
C++ 맀κ°λ³μλ κ°μΌλ‘ μ λ¬λκΈ° λλ¬Έμ λΉν¬μΈν° ν리미ν°λΈ 맀κ°λ³μ μ νμμλ λΆκ°λ₯νλ€.
ν¬μΈν°λ₯Ό 맀κ°λ³μλ‘ μ λ¬νλ©΄ λμΌν μλ°©ν₯ ν΅μ μ΄ μνλμ§λ§ ν¬μΈν° νμ 맀κ°λ³μλ λͺ
μμ μΈ μμ°Έμ‘°λ₯Ό νμλ‘ νλ―λ‘ μ½λμ κ°λ
μ±κ³Ό μμ μ±μ΄ λ¨μ΄μ§λ€.
μ°Έμ‘° 맀κ°λ³μλ λ€λ₯Έ 맀κ°λ³μμ λ§μ°¬κ°μ§λ‘ νΈμΆλ ν¨μμμ μ νν μ°Έμ‘°λλ€.
νΈμΆ ν¨μλ ν΄λΉ νμ 맀κ°λ³μκ° μ°Έμ‘° μ νμΈ λ§€κ°λ³μκ° νΉμ΄ν κ²μμ μ§μ ν νμκ° μλ€.
μ»΄νμΌλ¬λ μ°Έμ‘° 맀κ°λ³μμ κ°μ΄ μλ μ£Όμλ₯Ό μ λ¬νλ€.
Javaλ μμ μ±μ λμ΄κΈ° μν΄ C++ μ€νμΌμ ν¬μΈν°λ₯Ό μμ μ κ±°νλ€.
Java μ°Έμ‘° λ³μλ, C++ μ°Έμ‘° λ³μμ λ¬λ¦¬ μμκ° μλλΌ μλ‘ λ€λ₯Έ ν΄λμ€ μΈμ€ν΄μ€λ₯Ό μ°Έμ‘°νλλ‘ μ§μ ν μ μλ€.
λͺ¨λ μλ° ν΄λμ€ μΈμ€ν΄μ€λ μ°Έμ‘° λ³μμ μν΄ μ°Έμ‘°λλ€.
1
2
String str1; // null
str1 = "This is a Java literal string.";
str1μ String ν΄λμ€ μΈμ€ν΄μ€ λλ κ°μ²΄μ λν μ°Έμ‘°λ‘ μ μλλ€.
μ΄κΉκ° null, μ΄ν str1μ΄ String κ°μ²΄μΈ βThis is a Java literal string.βλ₯Ό μ°Έμ‘°.
C#, Java ν΄λμ€ μΈμ€ν΄μ€λ μ묡μ μΌλ‘ ν λΉ ν΄μ λλ―λ‘ (λͺ μμ ν λΉ ν΄μ μ°μ°μκ° μμ) Javaμλ dangling referenceκ° μμ μ μλ€.
C#μ μ°Έμ‘°μ ν¬μΈν°λ₯Ό λͺ¨λ κ°μ§λ€.
νμ§λ§ ν¬μΈν°λ₯Ό μ¬μ©νλ κ²μ κ°λ ₯ν κΆμ₯λμ§ μλλ€. (ν¬μΈν°λ₯Ό μ¬μ©νλ €λ©΄ unsafe
μμμ΄λ₯Ό ν¬ν¨)
μ°Έμ‘°λ‘ κ°λ¦¬ν¨ κ°μ²΄λ μ묡μ μΌλ‘ ν λΉ ν΄μ λμ§λ§, ν¬μΈν°λ‘ κ°λ¦¬ν¨ κ°μ²΄μ κ²½μ°μλ κ·Έλ μ§ μλλ€.
C/C++ μ½λμ μνΈ μμ©ν μ μλλ‘ ν¬ν¨λλ€.
κ°μ²΄ μ§ν₯ μΈμ΄μΈ Smalltalk, Python, Ruby, Luaμ λͺ¨λ λ³μλ μ°Έμ‘°λ€.
μ΄λ€μ νμ μ묡μ μΌλ‘ μ°Έμ‘° ν΄μ λλ€.
κ²λ€κ° μ΄ λ³μλ€μ μ§μ μ μΈ κ°μ μ κ·Όν μ μλ€.
π« νκ°
Lost Heap-Dynamic Variables, Danling Pointer
Pointer vs goto
goto λ¬Έμ λ€μμ μ€νλ μ μλ λ¬Έμ₯μ λ²μλ₯Ό λνλλ€.
ν¬μΈν° λ³μλ λ³μκ° μ°Έμ‘°ν μ μλ λ©λͺ¨λ¦¬ μ
μ λ²μλ₯Ό λνλ€.
λ°λ©΄ ν¬μΈν°λ μ΄λ€ μ’
λ₯μ νλ‘κ·Έλλ° μμ© νλ‘κ·Έλ¨μμ νμμ μ΄λ€.
μλ₯Ό λ€μ΄ ν¬μΈν°λ νΉμ ν μ λ μ£Όμμ μ κ·Όν΄μΌ νλ μ₯μΉ λλΌμ΄λ²λ₯Ό μμ±νλ λ° νμνλ€.
μλ°μ C#μ μ°Έμ‘°λ μν μμ μμ΄ ν¬μΈν°μ μ μ°μ±κ³Ό κΈ°λ₯μ μ΄λ μ λ μ 곡νλ€.
νλ‘κ·Έλλ¨Έλ€μ΄ μ°Έμ‘°μ μμ μ±μ λ μ€μμ νμ¬ Cμ C++ ν¬μΈν°μ μμ ν νμ κΈ°κΊΌμ΄ κ΅νν μ§λ λκ³ λ΄μΌ ν κ².
C# νλ‘κ·Έλ¨μ΄ ν¬μΈν°λ₯Ό μ¬μ©νλ μ λκ° μ΄κ²μ ν μ²λκ° λ κ².
π« Implementation of Pointer and Reference Types
λλΆλΆμ μΈμ΄μμ ν¬μΈν°λ ν κ΄λ¦¬μ μ¬μ©λλ€.
Smalltalkμ Rubyμ λ³μλΏλ§ μλλΌ Javaμ C# μ°Έμ‘°λ λ§μ°¬κ°μ§μ΄λ―λ‘ ν¬μΈν°μ μ°Έμ‘°λ₯Ό λ°λ‘ λ€λ£° μ μλ€.
𫧠Representations of Pointers and References
λλΆλΆμ μ»΄ν¨ν°μμ ν¬μΈν°μ μ°Έμ‘°λ λ©λͺ¨λ¦¬ μ
μ μ μ₯λ λ¨μΌ κ°μ΄λ€.
κ·Έλ¬λ μΈν
λ§μ΄ν¬λ‘νλ‘μΈμλ₯Ό κΈ°λ°μΌλ‘ νλ μ΄κΈ°μ λ§μ΄ν¬λ‘μ»΄ν¨ν°μμλ μ£Όμκ° μΈκ·Έλ¨ΌνΈμ μ€νμ
λ λΆλΆμΌλ‘ ꡬμ±λλ€.
λ°λΌμ μ΄λ¬ν μμ€ν
μμ ν¬μΈν°μ μ°Έμ‘°λ 16λΉνΈ μ
μμΌλ‘ ꡬνλλ©°, μ£Όμμ λ λΆλΆ κ°κ°μ λν΄ νλμ© κ΅¬νλλ€.
𫧠Solutions to the Dangling-Pointer Problem
Dangling-Pointer λ¬Έμ μ λν ν΄κ²°μ± μ μ¬λ¬ κ°μ§κ° μ μλλ€.
λ¬Όλ‘ , μ΅μ μ ν΄κ²°μ±
μ λμ λ³μλ€μ ν λΉμ νλ‘κ·Έλλ¨Έμ μμμ μμ λ κ²μ΄λ€.
νλ‘κ·Έλ¨λ€μ΄ λμ λ³μλ€μ ν λΉμ λͺ
μμ μΌλ‘ ν΄μ ν μ μλ€λ©΄, Dangling-Pointerλ€μ μμ κ²μ
λλ€.
μ΄λ₯Ό μν΄μλ λ°νμ μμ€ν
μ΄ λμ λ³μλ€μ΄ λ μ΄μ μΈλͺ¨κ° μμ λ μ묡μ μΌλ‘ ν λΉμ ν΄μ ν΄μΌ νλ€.
LISP μμ€ν
λ€μ νμ μ΄λ κ² ν΄μκ³ , Javaμ C# λͺ¨λ μ°Έμ‘° λ³μλ€μ λν΄μ μ΄ μ κ·Όλ²μ μ¬μ©νλ€.
C#μ ν¬μΈν°λ€μλ μ묡μ μΈ ν λΉ ν΄μ κ° ν¬ν¨λμ΄ μμ§ μμμ κΈ°μ΅.
Tombstones
λͺ¨λ λμ λ³μκ° λμ λ³μμ λν ν¬μΈν°μΈ βTombstoneβμ΄λΌκ³ λΆλ¦¬λ νΉμ μ
μ ν¬ν¨νλ Tombstones
.
μ€μ ν¬μΈν° λ³μλ βTombstoneβμλ§ μκ³ λμ λ³μλ μ λ κ°λ¦¬ν€λ κ²μ΄ μλλ€.
λμ λ³μκ° ν λΉ ν΄μ λλ©΄ βTombstoneβμ κ·Έλλ‘ μ μ§λμ§λ§ β0βμΌλ‘ μ€μ λμ΄ λμ λ³μκ° λ μ΄μ μ‘΄μ¬νμ§ μμμ λνλΈλ€.
μ΄ μ κ·Όλ²μ ν¬μΈν°κ° ν λΉ ν΄μ λ λ³μλ₯Ό κ°λ¦¬ν€λ κ²μ λ°©μ§νλ€.
0μ΄ μλ βTombstoneβμ κ°λ¦¬ν€λ ν¬μΈν°μ λν λͺ¨λ μ°Έμ‘°λ μ€λ₯λ‘ νμ§λ μ μλ€.
βTombstoneβμ μκ°μ μΌλ‘λ 곡κ°μ μΌλ‘λ λΉμ©μ΄ λ§μ΄ λ λ€.
βTombstoneβμ κ²°μ½ ν λΉμ΄ ν΄μ λμ§ μκΈ° λλ¬Έμ, κ·Έ μ μ₯곡κ°μ λ€μ ν보λμ§ μλλ€.
ν λμ λ³μμ μ κ·Όν λλ§λ€ ν λ¨κ³μ λ°©ν₯ μ νμ΄ λ νμνκ³ , λλΆλΆμ μ»΄ν¨ν°μμ μΆκ°μ μΈ κΈ°κ³ μ¬μ΄ν΄μ΄ νμνλ€.
λ리 μ¬μ©λλ μΈμ΄λ€ μ€ βTombstoneβλ₯Ό μ°λ μΈμ΄κ° μλ€.
β μΈμ΄ μ€κ³μλ€ μ€ κ·Έ λꡬλ κ·Έ μΆκ°μ μΈ μμ μ±μ΄ μ΄λ¬ν μΆκ°μ μΈ λΉμ©μ κ°μΉκ° μλ€κ³ μκ°νμ§ μμ.
Locks-and-Keys Approach
UW-Pascal ꡬνμ μ¬μ©λλ Locks-and-Keys
μ κ·Όλ².
μ΄ μ»΄νμΌλ¬μμ ν¬μΈν° κ°μ μμμ(key, address)μΌλ‘ ννλλ©°, μ¬κΈ°μ ν€λ μ μ κ°μ΄λ€.
λμ λ³μλ λ³μμ μ μ₯μμ μ μ μ κΈ κ°μ μ μ₯νλ ν€λ μ
μ λν κ°μΌλ‘ ννλλ€.
λμ λ³μκ° ν λΉλλ©΄ μ κΈ κ°μ΄ μμ±λμ΄ λμ λ³μμ μ κΈ μ
κ³Ό βnewβ νΈμΆμ μ§μ λ ν¬μΈν°μ ν€ μ
μ λͺ¨λ λ°°μΉλλ€.
λλ νΌλ°λ ν¬μΈν°μ λν λͺ¨λ μ κ·Όμμ, ν¬μΈν°μ ν€ κ°μ λμ λ³μμ μ κΈ κ°κ³Ό λΉκ΅νλ€.
μΌμΉνλ©΄ μ‘μΈμ€λ ν©λ²μ΄κ³ , μΌμΉνμ§ μμΌλ©΄ λ°νμ μ€λ₯λ‘ μ²λ¦¬λλ€.
λ€λ₯Έ ν¬μΈν°μ λν ν¬μΈν° κ°μ 볡μ¬λ³Έμ ν€ κ°μ 볡μ¬ν΄μΌ νλ€.
λ°λΌμ μ΄λ€ μμ ν¬μΈν°λΌλ μ£Όμ΄μ§ λμ λ³μλ₯Ό μ°Έμ‘°ν μ μλ€.
λμ λ³μκ° βdis-poseβλ‘ ν λΉμ΄ ν΄μ λλ©΄ ν΄λΉ ν¬μΈν°μ μ κΈ κ°μ μλͺ»λ μ κΈ κ°μΌλ‘ μ§μμ§λ€.
κ·Έλ¬λ©΄ βdis-poseβμ μ§μ λ ν¬μΈν°κ° μλ λ€λ₯Έ ν¬μΈν°κ° λλ νΌλ°λλλ©΄ μ£Όμ κ°μ κ·Έλλ‘ μ μ§λμ§λ§, ν€ κ°μ λ μ΄μ μ κΈκ³Ό μΌμΉνμ§ μμΌλ―λ‘ μ‘μΈμ€κ° νμ©λμ§ μλλ€.
𫧠Heap Management
ν κ΄λ¦¬λ λ§€μ° λ³΅μ‘ν λ°νμ νλ‘μΈμ€κ° λ μ μλ€.
κΈμμλ ν λΉ ν΄μ μ κ²½μ° μ묡μ μΈ μ κ·Ό λ°©μλ§ λ
Όμ.
νλ‘μΈμ€ λ° κ΄λ ¨ λ¬Έμ μ λν μ² μ ν λΆμμ ꡬν λ¬Έμ λ§νΌ, μΈμ΄ μ€κ³ λ¬Έμ κ° μλλ€.
Single-Size Cells
κ°μ₯ κ°λ¨ν μν©μ λͺ¨λ ν λΉκ³Ό ν λΉ ν΄μ κ° λ¨μΌ ν¬κΈ°μ μ μΈ κ²½μ°μ λλ€. λͺ¨λ μ μ μ΄λ―Έ ν¬μΈν°κ° μμ λ λμ± λ¨μνλ©λλ€. λμ μ€ν λ¦¬μ§ ν λΉμ λ¬Έμ κ° λκ·λͺ¨λ‘ μ²μ μ νλ LISPμ λ§μ ꡬνλ€μ μλ리μ€μ λλ€. λͺ¨λ LISP νλ‘κ·Έλ¨λ€κ³Ό λλΆλΆμ LISP λ°μ΄ν°λ λ§ν¬λ λͺ©λ‘μ μ λ€λ‘ ꡬμ±λ©λλ€.
λ¨μΌ ν¬κΈ°μ ν λΉ νμμλ μ¬μ© κ°λ₯ν λͺ¨λ μ λ€μ΄ μ μμ ν¬μΈν°λ€μ μ¬μ©νμ¬ μλ‘ μ°κ²°λμ΄ μ¬μ© κ°λ₯ν 곡κ°μ λͺ©λ‘μ λ§λ λ€. ν λΉμ νμν λ νμν μμ μ μ μ΄ λͺ©λ‘μμ κ°μ Έμ€λ κ°λ¨ν λ¬Έμ μ΄λ€. ν λΉ ν΄μ λ ν¨μ¬ λ 볡μ‘ν κ³Όμ μ΄λ€. ν-λμ λ³μλ νλ μ΄μμ ν¬μΈν°λ‘ κ°λ¦¬ν¬ μ μμΌλ―λ‘, μΈμ κ·Έ λ³μκ° νλ‘κ·Έλ¨μ λ μ΄μ μΈλͺ¨κ° μλμ§ νλ¨νκΈ°κ° μ΄λ ΅λ€. λ¨μν νλμ ν¬μΈν°κ° μ μμ λΆλ¦¬λμλ€κ³ ν΄μ κ·Έκ²μ΄ μ°λ κΈ°κ° λλ κ²μ μλλ©°, μ μ κ°λ¦¬ν€λ λ€λ₯Έ ν¬μΈν°λ€λ μ¬λ¬ κ° μ‘΄μ¬ν μ μλ€.
LISPμμλ νλ‘κ·Έλ¨μμ κ°μ₯ λΉλ²ν μμ μ€ λͺ κ°μ§λ λ μ΄μ νλ‘κ·Έλ¨μ μ κ·Όν μ μμΌλ―λ‘ ν λΉ ν΄μ (μ¬μ© κ°λ₯ν κ³΅κ° λͺ©λ‘μ λ€μ μ¬λ €λμ)ν΄μΌ νλ μ λͺ¨μμ λ§λλλ€. LISPμ κΈ°λ³Έ μ€κ³ λͺ©ν μ€ νλλ μ¬μ©λμ§ μμ μ μ νμκ° νλ‘κ·Έλλ¨Έμ κ³Όμ κ° μλλΌ λ°νμ μμ€ν μ κ³Όμ κ° λλλ‘ νλ κ²μ΄μμ΅λλ€. μ΄ λͺ©νλ LISP μνμλ€μκ² κΈ°λ³Έ μ€κ³ μ§λ¬Έμ λ¨κ²Όμ΅λλ€: μΈμ ν λΉ ν΄μ λ₯Ό μνν΄μΌ νλκ°?
μ°λ κΈ° μκ±°μλ μ¬λ¬ κ°μ§ λ€λ₯Έ μ κ·Ό λ°©μμ΄ μμ΅λλ€. κ°μ₯ μΌλ°μ μΈ λ κ°μ§ μ ν΅μ μΈ κΈ°μ μ μ΄λ€ λ©΄μμλ λ°λμ κ³Όμ μ λλ€. μ΄κ²λ€μ λ§€λ¦½μ΄ μ¦λΆμ΄κ³ μ κ·Όν μ μλ μ μ΄ μμ±λ λ μνλλ μ°Έμ‘° μΉ΄μ΄ν°μ μ¬μ© κ°λ₯ν κ³΅κ° λͺ©λ‘μ΄ λΉμ΄μμ λλ§ λ§€λ¦½μ΄ λ°μνλ λ§ν¬ μ€μνλΌκ³ λΆλ¦½λλ€. μ΄ λ κ°μ§ λ°©λ²μ λλλ‘ μ΄μ μ μΈ μ κ·Όλ²κ³Ό κ²μΌλ₯Έ μ κ·Όλ²μ΄λΌκ³ λΆλ¦½λλ€. μ΄ λ κ°μ§ μ κ·Όλ²μ λ§μ λ³νμ΄ κ°λ°λμμ΅λλ€. κ·Έλ¬λ μ΄ μΉμ μμλ κΈ°λ³Έμ μΈ κ³Όμ μ λν΄μλ§ λ Όμν©λλ€.
μ μ₯ νμμ μ°Έμ‘° μΉ΄μ΄ν° λ°©λ²μ νμ¬ μ μ κ°λ¦¬ν€λ ν¬μΈν°μ μλ₯Ό μ μ₯νλ μΉ΄μ΄ν°λ₯Ό λͺ¨λ μ μ μ μ§ν¨μΌλ‘μ¨ λͺ©νλ₯Ό λ¬μ±ν©λλ€. μ°Έμ‘° μΉ΄μ΄ν°μ λν κ°μ μ°μ°μ ν¬ν¨λ κ²μΌλ‘μ, ν¬μΈν°κ° μ μμ λΆλ¦¬λ λ λ°μνλ κ²μ 0 κ°μ λν 체ν¬μ λλ€. μ°Έμ‘° μΉ΄μ΄ν°κ° 0μ λλ¬νλ©΄ νλ‘κ·Έλ¨ ν¬μΈν°κ° μ μ κ°λ¦¬ν€λ κ²μ΄ μμμ μλ―Ένλ©°, λ°λΌμ κ°λΉμ§κ° λμ΄ μ¬μ© κ°λ₯ν κ³΅κ° λͺ©λ‘μΌλ‘ λλ릴 μ μμ΅λλ€.
Variable-Size Cells
κ°λ³ν¬κΈ°μ μ 9μ΄ ν λΉλ νμ κ΄λ¦¬νλ κ²μ λ¨μΌν¬κΈ°μ μ μ κ΄λ¦¬νλ λ°μ λ§μ μ΄λ €μμ΄ μμ§λ§ μΆκ°μ μΈ λ¬Έμ μ λ μμ΅λλ€. μνκΉκ²λ λλΆλΆμ νλ‘κ·Έλλ° μΈμ΄μμλ κ°λ³ν¬κΈ°μ μ μ΄ νμν©λλ€. κ°λ³ν¬κΈ°μ μ κ΄λ¦¬λ‘ μΈν΄ μ κΈ°λλ μΆκ°μ μΈ λ¬Έμ μ λ€μ μ¬μ©λλ λ°©λ²μ λ°λΌ λ¬λΌμ§λλ€. λ§ν¬ μ€μνλ₯Ό μ¬μ©νλ©΄ λ€μκ³Ό κ°μ μΆκ°μ μΈ λ¬Έμ μ λ€μ΄ λ°μν©λλ€:
β’ μ°λ κΈ°μμ λνλ΄κΈ° μν΄ λλ―Έμ μλ λͺ¨λ μ μ νμκΈ°λ₯Ό μ΄κΈ° μ€μ νλ κ²μ μ΄λ ΅μ΅λλ€. μ μ ν¬κΈ°κ° λ€λ₯΄κΈ° λλ¬Έμ, μ μ μ€μΊνλ κ²μ λ¬Έμ κ° λ©λλ€. νλμ ν΄κ²°μ± μ κ° μ μ ν¬κΈ°λ₯Ό 첫 λ²μ§Έ νλλ‘ κ°λλ‘ μꡬνλ κ²μ λλ€. κ³ μ λ ν¬κΈ°μ μ μ λΉν΄ μ½κ° λ λ§μ 곡κ°κ³Ό λ€μ λ§μ μκ°μ΄ 걸리μ§λ§ μ€μΊμ μνν μ μμ΅λλ€.
β’ λ§νΉ κ³Όμ μ μ¬μν κ²μ΄ μλλλ€. ν¬μΈν°κ° λ€μ΄κ°λ μ μ ν¬μΈν°μ μμΉκ° 미리 μ μλμ΄ μμ§ μμλ° μ΄λ»κ² ν¬μΈν°μμ λ°λΌμ¬ μ μμκΉμ? ν¬μΈν°κ° μ ν μλ μ λ λ¬Έμ μ λλ€. λ°νμ μμ€ν μ μν΄ λ°±κ·ΈλΌμ΄λλ‘ μ μ§λλ κ° μ μ λ΄λΆ ν¬μΈν°λ₯Ό μΆκ°νλ©΄ λ©λλ€. νμ§λ§ μ΄λ¬ν λ°±κ·ΈλΌμ΄λ μ μ§ κ΄λ¦¬ μ²λ¦¬λ νλ‘κ·Έλ¨ μ€ν λΉμ©μ κ³΅κ° λ° μ€ν μκ° μ€λ²ν€λλ₯Ό λͺ¨λ μΆκ°ν©λλ€.
β’ μ¬μ© κ°λ₯ν 곡κ°μ λͺ©λ‘μ μ μ§νλ κ²λ μ€λ²ν€λμ λ λ€λ₯Έ μμ²μ λλ€. λͺ©λ‘μ μ¬μ© κ°λ₯ν λͺ¨λ 곡κ°μΌλ‘ ꡬμ±λ λ¨μΌ μ λ‘ μμν μ μμ΅λλ€. μΈκ·Έλ¨ΌνΈμ λν μμ²μ λ¨μν μ΄ λΈλ‘μ ν¬κΈ°λ₯Ό μ€μ λλ€. νμλ μ μ λͺ©λ‘μ μΆκ°λ©λλ€. λ¬Έμ λ μ€λμ§ μμ λͺ©λ‘μ΄ λ€μν ν¬κΈ°μ μΈκ·Έλ¨ΌνΈ, μ¦ λΈλ‘μ κΈ΄ λͺ©λ‘μ΄ λλ€λ κ²μ λλ€. μμ²μ΄ μΆ©λΆν ν° λΈλ‘μ λν΄ λͺ©λ‘μ΄ κ²μλκ² νκΈ° λλ¬Έμ μ΄κ²μ ν λΉμ λλ¦¬κ² ν©λλ€. κ²°κ΅ λͺ©λ‘μ λλΆλΆμ μμ²μ μΆ©λΆν ν¬μ§ μμ λ§€μ° μμ λΈλ‘μ μλ₯Ό λ§μ΄ ꡬμ±ν μ μμ΅λλ€. μ΄ μμ μμ μΈμ ν λΈλ‘μ λ ν° λΈλ‘μΌλ‘ λΆκ΄΄λμ΄μΌ ν μλ μμ΅λλ€. λͺ©λ‘μμ μΆ©λΆν ν° μ²« λ²μ§Έ λΈλ‘μ μ¬μ©νλ λμμ κ²μμ λ¨μΆμν¬ μ μμ§λ§ λͺ©λ‘μ λΈλ‘ ν¬κΈ°λ³λ‘ μμνν κ²μ μꡬν©λλ€. λ κ²½μ° λͺ¨λ λͺ©λ‘μ μ μ§νλ κ²μ μΆκ°μ μΈ μ€λ²ν€λμ λλ€.
μ°Έμ‘° μΉ΄μ΄ν°λ₯Ό μ¬μ©νλ©΄ μ²μ λ κ°μ§ λ¬Έμ λ λ°©μ§λμ§λ§ κ°μ© κ³΅κ° λͺ©λ‘ μ μ§ κ΄λ¦¬ λ¬Έμ λ μ¬μ ν λ¨μ μμ΅λλ€. λ©λͺ¨λ¦¬ κ΄λ¦¬ λ¬Έμ μ λν ν¬κ΄μ μΈ μ°κ΅¬λ Wilson(2005)μ μ°Έμ‘°νμμμ€.