π νλ‘κ·Έλλ° μΈμ΄ - μ΄λ¦, λ°μΈλ©, μμ
π« μ΄λ¦, λ°μΈλ©, μμ
𫧠μλ‘
- λͺ
λ Ήν μΈμ΄
- (νλ μ»΄ν¨ν°) = ν° λ Έμ΄λ§ μ»΄ν¨ν°μ λν μΆμν
- λ©λͺ¨λ¦¬μ λ°μ΄ν°/Instructionμ λ£κ³ , νλμ© κΊΌλ΄κ³ Decodeνκ³ μ€νμν€λ
- λ°μ΄ν°μ μ μ₯κ³Ό λ°μ΄ν° κ°κ³΅μ μν μ°μ°μΌλ‘ ꡬμ±
- λ©λͺ¨λ¦¬ μ μ λν μΈμ΄μ μΆμν β λ³μ, λ°°μ΄ λ±
- λ³μμ νΉμ±
- νμ , μ£Όμ, κ°
- Scope μμκ³Ό Lifetime μ‘΄μκΈ°κ°
μμ
ν¨μν μΈμ΄μμμ λ³μ- κ°μ΄ ν λ² λ³μμ λ°°μ λλ©΄ κ°μ λ³κ²½μ νμ©νμ§ μμ
- νμ§λ§ λ§μ ν¨μν μΈμ΄μμλ λͺ λ Ήν μΈμ΄μ²λΌ κ°μ λ³κ²½μ νμ©
𫧠Name μ΄λ¦, Identifier μλ³μ
@ U μ€κ°κ³ μ¬ μΆμ : μλ³μ, μμ½μ΄, ν€μλλ₯Ό μ€λͺ νμμ€. ν€μλκ° μμ½μ΄κ° μλλΌλ©΄ μΈμ΄μ μ΄λ€ μν₯μ μ£Όλμ§, μμ½μ΄μ μκ° λ§μΌλ©΄ μΈμ΄μ μ΄λ€ μν₯μ μ£Όλμ§ μ€λͺ νμμ€.
μ΄λ¦μ λ³μμ μμ± μ€ νλ β Variable Name λ³μλͺ
μ΄λ¦μ Subprogram λΆνλ‘κ·Έλ¨, Formal Parameters νμ μΈμ, λ€λ₯Έ νλ‘κ·Έλ¨ κ΅¬μ± μμμλ κ΄λ ¨μ΄ μμ
μ΄λ¦ Name = μλ³μ Identifier
μ€κ³ μ£Όμ μ΄μ β μ΄λ¦μ Case Sensitive νκ°? β μΈμ΄μ Special Words νΉλ³ν μ©μ΄λ Reserved Word μμ½μ΄μΈκ° Keyword ν€μλμΈκ°?
- μ΄λ¦
- νλ‘κ·Έλ¨μμ κ°μ²΄λ₯Ό μλ³νκΈ° μν΄ μ¬μ©λλ λ¬Έμμ΄
- νλ‘κ·Έλλ° μΈμ΄λ§λ€ μλ³μ μ°Έμ¬νλ κΈΈμ΄λ λ€λ¦
- C99 : Linkerκ° External Nameμ 31μκΉμ§λ§ νμ© β 31μ μ΄νλ λΉκ΅ μν¨
- Java, C# : μ ν X
- C++ : ꡬνμμ λ°λΌ λ€λ¦
@ μ λ³μλͺ
μ μ«μλ‘ μμνλ©΄ μλλ?
@ Lexical Analysis λ¨κ³μμ, μ«μλ‘ μμνλ ν ν°μ λ§λλ©΄, μ«μμΈμ§ λ³μμΈμ§ μκΈ° μν΄, μ«μ λ€μ μλ λ¬Έμ μ‘΄μ¬ μ¬λΆλ₯Ό νμΈνλ Backtracking κ³Όμ μ΄ νμ
@ β μ»΄νμΌλ¬ ꡬνμ νΈμμ±, νΌν¬λ¨Όμ€ ν₯μμ μν΄
@ TODO : IDE λ¬Έλ² κ²μ¬, μΈν 리μΌμ€ μ리?
- μΌλ°μ μΈ νλ‘κ·Έλλ° μΈμ΄μμμ μ΄λ¦ μμ± κ·μΉ
- κ΅¬μ± : Alphabet, Number, Underbar(Underscore) _
- 첫κΈμ μ«μ X
- λ€λ₯Έ μ : PHP, Ruby
- μΌλ°μ μΌλ‘ λμλ¬Έμ κ΅¬λΆ Case Sensitive
- λ€μν νκΈ°λ²
- Camel Notation, Pascal Notation, Snake Notation, β¦
- κ΅¬μ± : Alphabet, Number, Underbar(Underscore) _
@ ννμ μΈ
Special Word νΉμμ΄
β νλ‘κ·Έλλ° μΈμ΄μμ μνν νλλ€μ λͺ
μΉν
β I.E. if, else, for, while, β¦
Reserved Word μμ½μ΄
β νλ‘κ·Έλλ° μΈμ΄μμ νΉλ³ν μλ―Έλ‘ ν΄μνλλ‘ μ μ λ¨
β Identifier μλ³μλ‘ μ¬μ©λ μ μλ λ¨μ΄
β νΉμμ΄λ μμ½μ΄λ‘ λΆλ₯ (λλΆλΆ μΈμ΄)
Keyword ν€μλ
β μ΄λ€ λ¬Έλ§₯μμλ§ νΉλ³νκ² μ¬μ©λλ λ¨μ΄
ν€μλμ μμ½μ΄λ λμΌ
μΌμ μ μ μμ½μ΄ μ μν¨ (λλΆλΆ μΈμ΄)
β C : 44, Java : 46, Python : 35, β¦
β Python ν€μλ νμΈ : import keyword, len(keyword,kwlist)
μμ½μ΄ λΉλ‘ μμ±λ ₯ λλΉ μ§
β Cobol : 300 μ¬κ°μ μμ½μ΄
π« λ³μ
νλ‘κ·Έλ¨ λ³μλ μ»΄ν¨ν° λ©λͺ¨λ¦΄ μ
μ΄λ μ
λ€μ λͺ¨μμ λν μΆμν
β μ»΄νμΌλ¬λ λ²μμμ λ³μλ₯Ό μ£Όμλ‘ λ³ν
λ³μμ νΉμ±
β Name, Type, Address, Value, Scope & Lifetime
λ³μ μ΄λ¦
β λλΆλΆ
μ λ³μλ μ΄λ¦μ κ°μ§λ€
λ³μμ μ£Όμ
β λ³μμ μ°κ΄λ κΈ°κ³ λ©λͺ¨λ¦¬ μ£Όμ
β λμΌν λ³μκ° λ€λ₯Έ μμ μ λ€λ₯Έ μ£Όμμ μ°κ΄λλ κ²μ΄ κ°λ₯, I.E. μ€ν λ³μ β μ μ₯λ νΈμΆ μκΈ°μ λ°λΌ μ£Όμ λ€λ¦
β L-ValueλΌ λΆλ¦Ό : λ°°μ λ¬Έμ μ’μΈ‘μ μμΉ
β μ¬λ¬ κ°μ λ³μκ° λμΌν μ£Όμλ₯Ό κ°μ§λ κ²μ΄ κ°λ₯ β λ³μΉ
β 곡μ©μ²΄, ν¬μΈν°, μ°Έμ‘° λ³μ
β λ³μΉμ κ°λ
μ±μ λ¨μ΄λ¨λ¦¬λ μμκ° λκΈ°λ
νμ
β λ³μκ° μ μ₯ν μ μλ κ°λ€μ λ²μμ μ°μ°λ€μ μ§ν©μ κ²°μ
β Javaμ Int νμ
-21μ΅~ 21μ΅, μ°μ μ°μ° κ°λ₯ ~
κ°
β κ°μ κ·Έ λ³μμ μ°κ΄λ λ©λͺ¨λ¦¬ μ
μ΄λ μ
λ€μ λ΄μ© β μΆμμ μΈ λ©λͺ¨λ¦¬ μ
β R-ValueλΌκ³ λΆλ¦Ό : λ³μκ° λ°°μ λ¬Έμ μ°μΈ‘μ μμΉ
L-value vs R-value
int x = 5;
x = x + 1;
μμ
β λ³μκ° μ¬μ©λ (μ κ·Όλ ) μ μλ λ²μ
μ‘΄μ κΈ°κ°
β λ³μκ° ν λΉλμ΄μ μμ λ λκΉμ§μ μκ°
𫧠λ°μΈλ©
μμ±κ³Ό κ°μ²΄κ°μ μ°κ΄
β λ³μμ νμ
, λ³μμ κ°, λ³μμ μ£Όμ, κΈ°νΈμ μ°μ° λ±
@ μ¬μ§ 7_0000
- λ°μΈλ© μκ° (Binding Time)
- μμ±κ³Ό κ°μ²΄κ°μ μ°κ΄μ΄ μΌμ΄λλ μμ
- μΈμ΄ μ€κ³ μκ° (Language design time)
- κ³±μ κΈ°νΈ * (κ³±, ν¬μΈν°, β¦)
- μΈμ΄ ꡬν μκ° (Language implementing time)
- C int Size
- μ»΄νμΌ μκ° (Compile time)
- C,Β Java λ³μμ νμ
- λ§ν¬ μκ° (Link time)
- μ μ μκ° (Loading time)
- μ μ λ³μμ κ·Έμ μ£Όμ
- μ€ν μκ° (Run time)
- μ§μ λ³μμ κ·Έμ μ£Όμ
i.e.
int count = 0; count = count + 5;
count Type : Compile TIme λ°μΈλ©
count κ°μ λ²μ : Design Time μ€κ³ μκ° λ°μΈλ©
+μ μλ―Έ : Compile Time (μ νΌμ°μ°μμ νμ
κ²°μ λμμ λ λ°μΈλ©)
Literal 5μ νν : Design Time μ€κ³ μκ° λ°μΈλ©
count κ° : Run Time μ€ν μκ° λ°μΈλ©
μ€λ§€κ°λ³μμ νμ맀κ°λ³μ κ°μ λ°μΈλ©μ΄ μ΄λ»κ² μΌμ΄λλκ°λ₯Ό μ΄ν΄νλ κ²μ΄ μ€μ
𫧠μ μ λ°μΈλ©, λμ λ°μΈλ©
μ μ λ°μΈλ©
β μ€ν μκ° μ΄μ μ λ°μΈλ©μ΄ μΌμ΄λκ³ μ€ν μ 체μ κ±Έμ³μ λ³νμ§ μλ κ²½μ°
λμ λ°μΈλ©
β μ€ν μκ° μ€μ λ°μΈλ©μ΄ μΌμ΄λκ±°λ μ€ν κ³Όμ μμ λ°μΈλ©μ΄ λ³κ²½λ μ μλ κ²½μ°
HW λ°μΈλ©μ κ³ λ €νμ§ μμ
β Virtual Memoryμ (Real?) μ€λ©λͺ¨λ¦¬ μ¬μ΄μ λ°μΈλ©
𫧠νμ λ°μΈλ©
λ³μλ μ°Έμ‘°μ μ νμ μ΄ λ°μΈλ© λμ΄μμ΄μΌ ν¨
κ³ λ €μ¬ν
β λ³μμ νμ
μ΄ μ΄λ»κ² λͺ
μΈλκ³ μΈμ λ°μΈλ© λλκ°?
- μ μ νμ
λ°μΈλ©
- μ»΄νμΌ μμ λ³μμ νμ
μ΄ κ²°μ λ¨
- λͺ
μμ μ μΈ
- λ³μ μ΄λ¦λ€μ λμ΄νκ³ μ΄λ€μ΄ μ΄λ€ νμ μΈμ§λ₯Ό λͺ μΈνμ¬ λ°μΈλ©
- μ»΄νμΌλ¬ λ°©μμμ μ¬μ©
- intΒ count, sum;
- λͺ
μμ μ μΈ
- 묡μμ μ μΈ
- λν΄νΈ κ·μΉμ ν΅ν΄μ λ³μμ νμ μ λ°μΈλ©
- μ½κ°μ νΈλ¦¬μ±μ μ£Όλ μ€λ₯λ₯Ό νμ§νλ κ²μ λ°©ν΄νμ¬ μ λ’°μ±μ μ ν΄
- μ»΄νμΌλ¬ λ°©μμ΄λ μΈν°νλ¦¬ν° λ°©μμμ μ¬μ©
- νμ
μΆλ‘
- λ¬Έλ§₯μ μ΄μ©νμ¬ νμ κ²°μ , νλ‘κ·Έλ¨ λ¨μ λ΄μμ νμ μ μ μ λ°μΈλ©
- C#μμμ var
- varΒ sum = 0;Β // run-time μ typeμ΄ κ²°μ λλ κ²μ΄ μλλΌ
- var str = βHello worldβ;Β // compile-timeμΒ typeμ΄ κ²°μ λ¨, javascriptμ varμ λ€λ¦
- μ»΄νμΌ μμ λ³μμ νμ
μ΄ κ²°μ λ¨
- λμ νμ
λ°μΈλ©
- λ³μμ νμ μ΄ μ€νμκ°μ λ³ν¨
- λ³μμ νμ μ΄ λͺ μΈλμ§λ μκ³ μ² μλ‘λΆν°λ μ μΆλμ§ μμ
- 1990λ λ μ€λ° μ΄μ μ νλ‘κ·Έλλ° μΈμ΄λ μ μ νμ λ°μΈλ©μ΄ μ ν, νμ§λ§ κ·Έ μ΄ν λμ λ°μΈλ© μΈμ΄κ° μ ν β Python, Ruby, JavaScript, PHP λ±
- μ£Όλ‘ μμ μΈν°νλ¦¬ν° μΈμ΄μμ μ±ν
- μ
- Python, JavaScript
- list = [1, 2, 3, 4, 5]
- list = 5
- C#
- dynamic any;
- Python, JavaScript
- μμ κ°μ²΄μ§ν₯ μΈμ΄μμ λͺ¨λ λ°μ΄ν°λ κ°μ²΄μ΄λ©°, μμμ λ³μλ μμμ κ°μ²΄λ₯Ό μ°Έμ‘°ν μ μμ β λͺ¨λ λ³μλ μ°Έμ‘° νμ
- JavaλΒ νΉμ νμ μ κ°μ μ νλκ² μ°Έμ‘°νλλ‘ μ€κ³
- μ₯μ
- νλ‘κ·Έλ¨μ μ μ°μ± μ 곡
- λ¨μ
- νλ‘κ·Έλ¨μ μ λ’°μ± μ ν
- μ»΄νμΌ μμ μ νμ μ€λ₯λ₯Ό κ²μΆνμ§ λͺ» ν¨ β μλͺ»λ λ°°μ λ¬Έμ΄ μ€νλ μ μμ
- νμ
κ²μ¬κ° μ€νμκ°μ λ°μνλ―λ‘ λΉμ©μ΄ λ§μ΄ λ λ€
- λ³μμ μ°κ΄λλ μ€νμκ° μμ μ(descriptor)λ₯Ό κ°μ ΈμΌνκ³ λ³μλ§λ€ λ€μν κΈ°μ΅ κ³΅κ°μ μꡬνλ―λ‘ μ΄λ₯Ό μ€νμκ°μ κ΄λ¦¬ν΄μΌ ν¨
- μ μ νμ
λ°μΈλ© μΈμ΄λ³΄λ€ λ§€μ° λ리λ€
- μ μ νμ μΈμ΄λ λͺ¨λ λ³μμ νμ μ μ»΄νμΌ νμμ μ μ μμΌλ―λ‘ κ·Έμ μ΅μ νλ μ€ν μ½λμ μμ±μ΄ κ°λ₯ β λμ νμ μΈμ΄λ μ€νμκ°μ μ μ μμ
- νλ‘κ·Έλ¨μ μ λ’°μ± μ ν
@ U μ€κ°κ³ μ¬ λ²μ
π« κΈ°μ΅κ³΅κ° λ°μΈλ©κ³Ό μ‘΄μκΈ°κ°
@ U κΈ°λ§κ³ μ¬ μΆμ : λ³μμ κΈ°μ΅ κ³΅κ° λ°μΈλ©μ΄ 무μμΈμ§ μ€λͺ νκ³ , μ μ λ³μ, μ€ν-λμ λ³μ, λͺ μμ ν-λμ λ³μ, μ묡μ ν-λμ λ³μλ₯Ό κ°κ° λ°μΈλ© κ΄μ μμ μ€λͺ νμμ€.
- λμ νμ λ°μΈλ©
Code μμ, μ½λ λͺ
λ Ήμ΄λ€
Data μμ, μ μ λ³μ, Static μ μ λ³μ
β νλ‘κ·Έλ¨ μμ ~ λ
Stack μμ, ν¨μκ° νΈμΆ λ λ λ§λ€, κ° ν¨μμ 맀κ°λ³μ, μ§μλ³μ, νΈμΆ/λμκ° μμΉ
β ν¨μ μμ ~ λ
ip λ μ§μ€ν°κ° Code μμμ Main ν¨μ κ°λ¦¬ν΄
- λͺ μμ ν-λμ λ³μ
UnManaged/Managed Heap
μ¬λ°λ₯Έ μ¬μ©μ μ΄λ €μ
Memory Leaking
β μΌλ° νλ‘κ·Έλ¨μ λλ©΄ κ·Έλ§μ΄μ§λ§, νμ μΌμ Έμλ μλ²μμ λ°μνλ€λ©΄
Dangling Pointer
- μ묡μ ν-λμ λ³μ
𫧠κ°μ
λ³μμ κΈ°μ΅κ³΅κ° λ°μΈλ©μ λͺ λ Ήν νλ‘κ·Έλλ° μΈμ΄μ κ·Όλ³Έμ νΉμ§
- κΈ°μ΅ μ₯μ ν λΉ(Allocation)
- λ³μμ λ°μΈλ©λλ λ©λͺ¨λ¦¬ μ μ κ°μ© λ©λͺ¨λ¦¬ νλ‘λΆν° κ°μ Έμ΄
- κΈ°μ΅ μ₯μ νμ(Deallocation)
- λ³μλ‘λΆν° λ°μΈλ©μ΄ ν΄μ λ λ©λͺ¨λ¦¬ μ μ λ€μ κ°μ© λ©λͺ¨λ¦¬ νλ‘ λ°ν
- λ³μμ μ‘΄μκΈ°κ°(Lifetime) - μκ°μ μΈ κ°λ
- λ³μκ° νΉμ λ©λͺ¨λ¦¬ μμΉμ λ°μΈλ© λμ΄ μλ κΈ°κ°
- μ‘΄μ κΈ°κ°μ λ°λ₯Έ 4κ°μ§ κ²½μ°
- μ μ (Static) λ³μ, μ€ν-λμ λ³μ, λͺ μμ ν-λμ λ³μ, 묡μμ ν-λμ λ³μ
- μ μ Static λ³μ
- μ€νμ μ λ©λͺ¨λ¦¬μ λ°μΈλ©λμ΄μ νλ‘κ·Έλ¨μ΄ μ€ν μ’
λ£ν λκΉμ§ λμΌν λ©λͺ¨λ¦¬ μ
μ λ°μΈλ© λμ΄ μλ λ³μ
- μ μ λ³μλ μ μ μ§μ λ³μμ ν΄λΉ
- κ°μ²΄ μ§ν₯ μΈμ΄μμμ static μ§μ μλ ν΄λμ€ λ³μλ₯Ό μμ±
- κ°μ²΄κ° μμ±λκΈ° μ μ μ μ μΌλ‘ ν΄λΉ λ³μλ₯Ό μμ±
- μ₯μ
- ν¨μ¨μ±
- νλ‘κ·Έλ¨ μ μ νΉμ νΉμ μ§μμμμ μ§μ μ μ κ·Όμ΄ κ°λ₯
- (λ―Έλ―Έν μμ€ μ΄μ§λ§) μ μ λ³μμ ν λΉκ³Ό νμλ₯Ό μν μ€ν-μκ° λΆλ΄μ΄ μμ
- ν¨μ¨μ±
- λ¨μ
- μ μ°μ± κ°μ
- μ μ λ³μλ§μ κ°μ§λ νλ‘κ·Έλλ° μΈμ΄λ μ¬κ·μ νΈμΆμ μ§μν μ μμ
- μ μ°μ± κ°μ
- μ€νμ μ λ©λͺ¨λ¦¬μ λ°μΈλ©λμ΄μ νλ‘κ·Έλ¨μ΄ μ€ν μ’
λ£ν λκΉμ§ λμΌν λ©λͺ¨λ¦¬ μ
μ λ°μΈλ© λμ΄ μλ λ³μ
- μ€ν-λμ λ³μ
- ν΄λΉ λ³μμ μ μΈλ¬Έμ΄ μ€νλ λ κΈ°μ΅κ³΅κ°μ λ°μΈλ© λλ©° νμ
μ μ μ μΌλ‘ λ°μΈλ© λ¨ β κΈ°μ΅ κ³΅κ°λ§ λμ λ°μΈλ© λκ³ λλ¨Έμ§ μμ±μ μ μ λ°μΈλ©
- C, C++μ ν¨μ λ΄ μ§μλ³μ, νμλ§€κ° λ³μ λ±
- Java,Β C++μ λ©μλ λ΄ μ§μλ³μ, νμλ§€κ° λ³μ λ±λ±
- μ€ν-λμ λ³μλ μ€νμκ°μ μ€νμ ν λΉ
- μ₯μ
- κ° λΆνλ‘κ·Έλ¨ λ§λ€ μμ μ κΈ°μ΅ κ³΅κ°μ κ°μ§ (μ€νμ μμ΄λ)
- μ¬κ· λΆνλ‘κ·Έλ¨μ μμ±μ νμ©
- λ¨μ
- (λ―Έλ―Ένμ§λ§) ν λΉκ³Ό νμμ λ°λ₯Έ μ€ν-μκ° λΆλ΄
- (λ―Έλ―Ένμ§λ§, 무μν μ λ) κ°μ μ£Όμμ§μ λ°©μμΌλ‘ μ κ·Όνλ―λ‘ μ μ λ³μ보λ€λ λλ¦Ό
- λΆνλ‘κ·Έλ¨μ΄ κ³Όκ±° λ°μ΄ν°μ μ κ·Όμ μ μ½ @ fooμ μ μ΄κ° λ€μ΄κ° μμ λ, μ΄μ (main) μμμ λν΄μλ μ κ·Όμ΄ λΆκ°λ₯νλ€
- ν΄λΉ λ³μμ μ μΈλ¬Έμ΄ μ€νλ λ κΈ°μ΅κ³΅κ°μ λ°μΈλ© λλ©° νμ
μ μ μ μΌλ‘ λ°μΈλ© λ¨ β κΈ°μ΅ κ³΅κ°λ§ λμ λ°μΈλ© λκ³ λλ¨Έμ§ μμ±μ μ μ λ°μΈλ©
@ C/CPP, auto
@ μ¬μ§ 7_0001
- λͺ
μμ ν-λμ λ³μ
- νλ‘κ·Έλλ¨Έκ° λͺ
μμ μΌλ‘ μ€νμκ° λͺ
λ Ήμ΄μ μν΄μ ν λΉλκ³ νμλλ
μ΄λ¦μλ
λ©λͺ¨λ¦¬ μ - νμΒ ν λΉλκ³ νμλλ©°, ν¬μΈν°λ μ°Έμ‘°λ³μλ₯Ό μ΄μ©νμ¬ μ°Έμ‘°ν μ μμ
- μ κ·Όμ μ¬μ©νλ ν¬μΈν°λ μ°Έμ‘°λ³μλ λ€λ₯Έ μ€μΉΌλΌ λ³μμ²λΌ μμ±
- νμΒ ν λΉλκ³ νμλλ©°, ν¬μΈν°λ μ°Έμ‘°λ³μλ₯Ό μ΄μ©νμ¬ μ°Έμ‘°ν μ μμ
- λͺ
μμ ν-λμ λ³μμ μμ± λ° νμ λ°©λ²
- C: ν λ©λͺ¨λ¦¬ ν λΉμ μν μμ€ν μ½μ μ¬μ© - malloc(), alloc(), free() λ±
- C++: ν λ©λͺ¨λ¦¬ ν λΉμ μν μ°μ°μλ₯Ό μ¬μ© - new, delete
- Java, C#: ν λ©λͺ¨λ¦¬ ν λΉμ μν μ°μ°μ new, νμλ Garbage collectorκ° μ묡μ μΌλ‘ νμ
- λͺ
μμ ν-λμ λ³μμ νμ©μ²
- 리μ€νΈλ νΈλ¦¬μ κ°μ΄ μ€νμκ°μ λμ μΌλ‘ ν¬κΈ°κ° λ³νλ μλ£κ΅¬μ‘° ꡬμΆ
- λ¨μ
- ν¬μΈν°μ μ°Έμ‘° λ³μμ μ¬λ°λ₯Έ μ¬μ©μ μ΄λ €μ (leaking, stray? point)
- μ°Έμ‘°λΉμ©, κΈ°μ΅ κ³΅κ° κ΄λ¦¬ ꡬνμ 볡μ‘μ± λ±
- νλ‘κ·Έλλ¨Έκ° λͺ
μμ μΌλ‘ μ€νμκ° λͺ
λ Ήμ΄μ μν΄μ ν λΉλκ³ νμλλ
- μ묡μ ν-λμ λ³μ
- κ°μ΄ λ°°μ λ λ ν κΈ°μ΅ μ₯μμ λ°μΈλ©
- κ°μ΄ λ°°μ λ λλ§λ€ λ³μμ λͺ¨λ μμ±μ΄ λ°μΈλ© λ¨
- μ: JavaScript, Python λ±
- highs = [74, 84, 86, 90, 71];
- μ₯μ
- μ΅κ³ μ μ μ°μ±κ³Ό μΌλ°ν(generic) νλ‘κ·Έλ¨ μμ±μ μ 리
- λ¨μ
- μ€νμκ°μ μμ±μ κ΄λ¦¬ν΄μΌν¨μΌλ‘ μΈν΄ λΉμ©μ΄ λ§μ΄ λ¬
- μ»΄νμΌλ¬μ μν μ€λ₯ νμ§ λ₯λ ₯ μμ€ β νλ‘κ·Έλ¨μ μ λ’°μ± μμ€
HD global_var1, global_var2, count β dataμμ
λ°νμ
Text μμ, Readonly == μ°κΈ° μμ
κΈμ§ λ
global_var1, global_var2, count β dataμμ (μ΄λ€ λΆλΆμ readonly β μμ λ³μλ€, Static νλ‘κ·Έλ¨μ΄ μ€νλλ©΄μ κΊΌμ§λκΉμ§)
Stack (ν¨μκ° Callλ λ, i.e. Main, Mainμ λν μ€ν λ¦¬ν΄ μ΄λλ μ€, i, j, + fooμλνμ€νi, j, temp, pi) Heap - unmanaged heap, (Malloc)
OS HW
i.e. java JVM (class load (code + data μμ), stack, haep - managed heap) oS HW
Garbage Manager - μ°Έμ‘° count
π« μμ Scope
@ U κΈ°λ§κ³ μ¬ μΆμ : μ μ μμκ³Ό λμ μμμ κ°κ° μ€λͺ νκ³ , μ΄λ€μ μ₯λ¨μ μ λΉκ΅ μ€λͺ νμμ€.
- λ³μμ μμ(Scope) - 곡κ°μ μΈ κ°λ
- λ³μκ° μ°Έμ‘° κ°λ₯ν, κ°μμ μΈ(Visible) λ¬Έμ₯λ€μ λ²μ
- λ³μκ° μ΄λ€ λ¬Έμ₯μμ μ°Έμ‘°κ° κ°λ₯νλ©΄, λ³μλ κ·Έ λ¬Έμ₯μμ κ°μμ μ΄λ€.
- μμ κ·μΉ(Scope rules)
- μ΄λ¦μ μ΄λ λ³μμ μ°κ΄μ μ§κ² ν κ²μΈκ°λ₯Ό κ²°μ νλ κ·μΉ
- μ§μ(local) λ³μ vs λΉμ§μ(nonlocal) λ³μ
- μ§μ λ³μ: νλ‘κ·Έλ¨ λ¨μ(μ ν¨μ)λ λΈλ‘λ΄μ μ μΈλ λ³μ
- λΉμ§μΒ λ³μ: νλ‘κ·Έλ¨ λ¨μλ λΈλ‘λ΄μ μ μΈλμ΄ μμ§λ μμ§λ§ ν΄λΉ μμμμ κ°μμ μΈ λ³μ
- μ μ λ³μλ λΉμ§μ λ³μμ ν μ
- μ μ μμ Static Scope
- λ³μμ μμμ΄ λ³μμ μ μΈ/μ μ μμΉ κ·Έλ¦¬κ³ λΆνλ‘κ·Έλ¨λ€μ μνΈ κ°μ 곡κ°μ λ°°μΉ κ΄κ³μ μνμ¬ κ²°μ
- λ³μμ μμμ΄ μ€ν(Runtime)μ μ κ²°μ ν μ μμ
- μ¬λ νΉμ μ»΄νμΌλ¬κ° μμ€ μ½λμ λΆμμ ν΅ν΄ νλ‘κ·Έλ¨μ ν¬ν¨λ λͺ¨λ λ³μμ νμ μ κ²°μ κ°λ₯
- ALGOL 60μμ λμ λ ν λ§μ μΈμ΄μμ λμ
- λκ°μ§ ννμ μ μ μμ μΈμ΄κ° μ‘΄μ¬
- λΆνλ‘κ·Έλ¨(νΉμ ν¨μ)μ΄ μ€μ²© κ°λ₯ν κ²½μ°μ μ€μ²©μ΄ μλλ κ²½μ°
- λΆνλ‘κ·Έλ¨(νΉμ ν¨μ)λ μ μ μμμ μμ±
- λΆνλ‘κ·Έλ¨ μ€μ²©μ΄ κ°λ₯ν μΈμ΄
- μ€μ²©λ λΆνλ‘κ·Έλ¨μ ν΅ν΄ μ€μ²©λ μ μ μμμ μμ±μ΄ κ°λ₯
- JavaScript, Python λ±
- λΆνλ‘κ·Έλ¨ μ€μ²©μ΄ κ°λ₯νμ§ μμ μΈμ΄
- λΆνλ‘κ·Έλ¨μ μ€μ²©μ νμ©μΉ μμΌλ μ€μ²©λ ν΄λμ€ μ μλ λΈλ‘μ μν΄μ μ€μ²©λ μ μ μμ μμ± κ°λ₯
- CκΈ°λ° μΈμ΄λ€
- λΆνλ‘κ·Έλ¨(νΉμ ν¨μ)μ΄ μ€μ²© κ°λ₯ν κ²½μ°μ μ€μ²©μ΄ μλλ κ²½μ°
- λΆνλ‘κ·Έλ¨μ μ€μ²©μ΄ νμ©λλ μΈμ΄μ κ²½μ° (JS, Python λ±)
- κ°μ :
- λͺ¨λ μμλ€μ νλ‘κ·Έλ¨ λ¨μλ€κ³Ό μ°κ΄
- λͺ¨λ nonlocal λ³μμ λν μ°Έμ‘°λ λ€λ₯Έ νλ‘κ·Έλ¨ λ¨μμ μμ
- ν΄λΉ nonlocal λ³μμ λν μ κ·Όμ μμ κ·μΉ(Scope Rule)μ μν΄μλ§ κ°λ₯
- μμ κ·μΉ
- ν΄μ(Resolution)ν λ³μλ₯Ό μ°Έμ‘°λλ λΆνλ‘κ·Έλ¨(ν¨μ) μμμμ μ μΈμ μ°Ύμ
- λ°κ²¬ λ κ²½μ°: ν΄λΉ μμμ μ§μ λ³μλ‘μ ν΄μ (OK)
- λ°κ²¬μ΄ μλ κ²½μ°: μ μ λΆλͺ¨(static parent)μ μμμμ νμ
- μ μ μ‘°μ(staticΒ ancestor)λ₯Ό λ°λΌ κ°λ©° λ°κ²¬μ΄ λ κ²½μ° ν΄λΉ μμμ λ³μλ‘ ν΄μ (OK)
- λ§μ½ μ΅μμ νλ‘κ·Έλ¨ λ¨μκΉμ§μμλ λ°κ²¬μ΄ μλλ©΄ λ³μ λ―Έμ μΈ μλ¬ λ°μ
- μ§μ λ³μκ° μΈλΆ (μ μ) λ³μμ μ°μ ν¨
- ν΄μ(Resolution)ν λ³μλ₯Ό μ°Έμ‘°λλ λΆνλ‘κ·Έλ¨(ν¨μ) μμμμ μ μΈμ μ°Ύμ
- κ°μ :
i.e. JS, var/function Hoisting
i.e. Python, Scope Resolution Rule - LEGB Local Enclosed Global Built-in, λ€ μ°Ύμλ μμΌλ©΄ Name Error
π« λΈλ‘ Block
- Block
- λ§μ μΈμ΄μμ μ€ν μ½λ μ€κ°μ μλ‘μ΄ μ μ μμμ μ μλ₯Ό νμ©
- λΈλ‘μ΄λΌ λΆλ¦¬λ λΆλΆμ μ½λλ€μ΄ μμ μ μ§μ λ³μλ₯Ό κ°λ κ²μ νμ©
- λ³μμ μ°Έμ‘° κ°λ₯ν μμμ μ΅μν νλ ν¨κ³Ό
- ALGOL60μμ λμ λμμΌλ©° λ§μ μΈμ΄(CκΈ°λ° μΈμ΄)μμ μ±ν
- λΈλ‘(Block)λ΄μ λ³μλ€μ μ€ν λμ μΌλ‘ μλ
- ν΄λΉ λΈλ‘μ μ§μ ν λ λ©λͺ¨λ¦¬μ ν보λμλ€κ° λΉ μ Έλμ¬ λ νμ λ¨
- CκΈ°λ° μΈμ΄μ 볡ν©λ¬Έ(μ€κ΄νΈμ μΈμΈ μ½λλ€)λ΄μμ μ μΈλ¬Έμ κ°λ κ²μ νμ©ν¨
- λΈλ‘μ μν΄ μμ±λ μμμ λΆνλ‘κ·Έλ¨(ν¨μ)μ μν΄ μμ±λ μμκ³Ό λμΌνκ² μ·¨κΈ
- C/C++ μΈμ΄μμλ μ€μ²©λ ν¨μλ₯Ό νμ©νμ§ μμ
- λΈλ‘μ΄λΌ λΆλ¦¬λ λΆλΆμ μ½λλ€μ΄ μμ μ μ§μ λ³μλ₯Ό κ°λ κ²μ νμ©
- CκΈ°λ° μΈμ΄μμλ μ€μ²©λ ν¨μλ₯Ό νμ©νμ§ μμ, νμ§λ§ λΈλ‘μ ν΅ν΄μ μ€μ²©μ νμ©
- λΈλ‘μ 볡ν©λ¬Έ(μ€κ΄νΈμ μΈμΈ μ½λ)λ₯Ό μμ±νκΈ°μν΄ μ¬μ©
- CκΈ°λ° μΈμ΄μ 볡ν©λ¬Έ(μ€κ΄νΈμ μΈμΈ μ½λλ€)λ΄μμ μ μΈλ¬Έμ κ°λ κ²μ νμ©ν¨
- λΈλ‘μ μν΄ μμ±λ μμμ λΆνλ‘κ·Έλ¨(ν¨μ)μ μν΄ μμ±λ μμκ³Ό λμΌνκ² μ·¨κΈ
- Scope Resolution RuleμΒ Local > λΆλͺ¨ Scope > μ μ‘° Scope > Global
- μ§μ λ³μλͺ
μ μμμμμ λ³μλͺ
μ΄ μΆ©λν κ²½μ° μ§μλ³μ μ°μ
- μ μμ λ³μλ₯Ό μ°Έμ‘°νκ³ μΆμ κ²½μ° CλΒ externμ μ¬μ© C++λ :: μ°μ°μ μ¬μ©
- Java/C#μμλ μ€μ²© λΈλ‘μΒ νμ© νμ§λ§ μ€μ²©λ λΈλ‘μμμ λ³μλͺ
μ΄ μμ μμμμμ λ³μλͺ
κ³Ό μΆ©λμ νμ©νμ§ μμ
- μ΄λ¦μ μ¬μ¬μ©μ΄ μ€λ₯λ₯Ό μ λ°μν¬ μ μμμΌλ‘ μ΄λ¬ν κ²½μ°λ₯Ό λ°°μ
- JavaScriptμ PythonμΒ λΈλ‘μ κ°λ
μ μ 곡νλ λΈλ‘ Scopeμ μμ
- ν¨μ Scopeλ§ μ 곡
- μ μΈ μμ
- λ³μμ μ μΈ μμΉλ λ³μμ μμμ μν₯μ λ―ΈμΉ¨
- C89: ν¨μμ ν¬ν¨λ λͺ¨λ λ³μ μ μΈμ μ€μ²©λ λΈλ‘μ μν μ μΈμ μ μΈνκ³ λ κ·Έ ν¨μμ μμλΆλΆμ μμΌλ§ νλ€.
- C99, C++, Java, JavaScript, C#, Pythonλ±μΒ λ³μ μ μΈμ΄ νλ‘κ·Έλ¨ λ¨μμμ λ¬Έμ₯μ΄ λνλ μ μλ κ³³μ΄λ©΄ μ΄λλ μ§ λνλλ κ²μ νμ©
- μΌλ°μ μΌλ‘(C99, C++, Java), λͺ¨λ μ§μ λ³μμ μμμ μ μΈλ¬ΈμΌλ‘λΆν° κ·Έ μ μΈλ¬Έμ΄ λνλλ λΈλ‘μ λκΉμ§λ₯Ό νμ±
- C#μ λΈλ‘ μ΄λμ μ μΈμ΄ λλ κ·Έ λΈλ‘ μ μ²΄κ° μμ
- μ£Όμ: λ³μλ₯Ό μ¬μ©νκΈ° μ μ ν΄λΉ λ³μλ μ μΈμ΄ λμ΄ μμ΄μΌ ν¨
- JavaScriptμμΒ varλ‘ μ μΈλ λ³μλ μ΄λμ μ μΈλμ΄ μλ hoisting λ¨ (letμ μλ¨)
- JavaScriptμμ λ³μμ μ μΈ μμ΄ λ³μλ₯Ό μ¬μ©νλ κ²μ΄ κ°λ₯, μ΄ κ²½μ° λ³μμ κ°μ undefinedκ° λ¨
- C, C++, Java, C#μ μ μ΄λ¬Έ λ΄ μ΄κΈ°ν λ³μλ ν΄λΉ μ μ΄λ¬Έ λ΄μμλ§ μλ―Έλ₯Ό κ°μ§
𫧠μ μ μμ
- μ μ λ³μ
- νμΌμ μν ν¨μ μΈλΆμ μμΉν λ³μ
- ν¨μ μ μλ€λ‘ ꡬμ±λ νλ‘κ·Έλ¨ κ΅¬μ‘°λ₯Ό νμ©νλ μΈμ΄μμ, λ³μ μ μλ€μ΄ ν¨μ μΈλΆμ μ¬ μ μμ
- C, C++, PHP, JavaScript, Python λ±
- ν¨μ μ μλ€λ‘ ꡬμ±λ νλ‘κ·Έλ¨ κ΅¬μ‘°λ₯Ό νμ©νλ μΈμ΄μμ, λ³μ μ μλ€μ΄ ν¨μ μΈλΆμ μ¬ μ μμ
- μ μ λ³μλ μ΄νμ μ€λ ν¨μλ€λ΄μμ κ°μμ μ
- μ μ λ³μλ ν¨μλ€μ κ°μμ μ΄λ©° νλ‘κ·Έλ¨ μ 체μ κ°μμ μΌ μ μλ€.Β μ΄λ μ€λ₯μ μμ²μ΄ λ μ μμ
- μ μ λ³μλ νμμ μ΄λ€. (GlobalΒ variableΒ isΒ necessaryΒ evil.)
- νΉν CλΒ μ μ 곡κ°μ κ΄λ¦¬νλ μ΄λ¦κ³΅κ°(namespace)μ΄ μμ
- νμΌμ μν ν¨μ μΈλΆμ μμΉν λ³μ
- C/C++μΈμ΄μμμ μ μ λ³μμΒ μ μΈκ³Ό μ μ
- μ μΈ: νμ λ° λ€λ₯Έ μμ±λ€μ λͺ μΈνλ κΈ°μ΅κ³΅κ°μ ν λΉμ νμ§ μμ
- μ μ: μμ±λ€μ λͺ μΈνκ³ κΈ°μ΅κ³΅κ°μ ν λΉ ν¨
- μ μΈμ μ¬λ¬λ² ν μ μμ§λ§ μ μλ νλ²λ§ κ°λ₯
- μ: extern int var1;
- μ μμ μμΉνλ©΄ var1μ΄ λ€λ₯Έ νμΌμ μ‘΄μ¬ν¨μ μλ―Έ
- μ§μμ μμΉνλ©΄ var1μ΄ μ μμ μ‘΄μ¬ν¨μ μλ―Έ (λ€λ₯Έ νμΌμ μ μμ΄μ΄λ μκ΄μμ)
- Cμμ μ μκ³Ό μ§μλ³μμ μ΄λ¦μ΄ κ°μ κ²½μ° μ§μ μ°μ μ΄λ©° μ μ λ³μμ μ΄λ¦μ μνλ¨
- C++μμλ ::μ°μ°μλ₯Ό μ΄μ©νμ¬ μ μ λ³μλ₯Ό μ κ·Ό κ°λ₯
- PHPμ μ μ λ³μ
- PHP μ μλ³μμ μμμ μ μΈν μμΉλ‘λΆν° νμΌμ λκΉμ§ μ
- PHP μ μλ³μλ ν¨μλ΄μμ κΈ°λ³Έμ μΌλ‘ λΉκ°μμ μ΄λ λͺ
μμ μΌλ‘ κ°μμ μ΄κ² ν μ μμ
- μ μλ³μμ λμΌν μ§μλ³μκ° μ‘΄μ¬νλ©΄ λ³μμ΄λ¦μμ 첨μλ‘νμ¬$GLOBALλ°°μ΄μ μ΄μ©νμ¬ μ κ·Όκ°λ₯
- μ μλ³μμ λμΌν μ§μλ³μκ° μ‘΄μ¬νμ§ μμΌλ©΄ global μ μΈλ¬Έμ μ΄μ©νμ¬ μ κ·Όκ°λ₯
- JavaScriptμ μ μ λ³μ
- JSμ μ μλ³μλ λμΌν μ΄λ¦μ κ°μ§ μ§μ λ³μκ° μλ κ²½μ° ν΄λΉ μ§μμμλ μ§μ λ³μλ§ μ κ·Όμ΄ κ°λ₯νκ³ μ μ λ³μλ₯Ό μ κ·Όν μ μλ λ°©λ²μ μμ
- Pythonμ μ μ λ³μ
- μ μλ³μμ λμΌν μ΄λ¦μ κ°μ§ μ§μλ³μκ° μ‘΄μ¬νλ©΄ μ μ λ³μλ μνλ¨
- Pythonμ μ μλ³μλ ν¨μ λ΄μμ κΈ°λ³Έμ μΌλ‘ μ½κΈ°λ κ°λ₯ νμ§λ§ μ°κΈ°λ₯Ό μν΄μλ global μ μΈμ ν΄μ£Όμ΄μΌ ν¨
- κ·Έλ μ§ μμ κ²½μ° μλ¬ λ°μ
- μ μ μμμ νκ°
- μ₯μ
- λ§μ μν©μμ μ λμνλ λΉμ§μ λ³μλ₯Ό μ κ·Όνλ λ°©λ²μ μ 곡
- λ¨μ
- λ³μμ λΆνλ‘κ·Έλ¨μ λν μ κ·Όμ νμ μ΄μμΌλ‘ λ§μ΄ νμ©
- νλ‘κ·Έλ¨μ μμ νΉμ λ²μ μ
κ³Όμ μμ μ μ λ³μμ μ¬μ©μ λΆμΆκΈΈ μ μμ
- μ΄κΈ°μ μ€κ³λ₯Ό μ½κ² νκΈ°μν€κ³ μ μλ³μλ‘ λ¬Έμ λ₯Ό ν΄κ²°νλ €κ³ ν¨
- ν΄κ²°μ± μΌλ‘μ μΊ‘μνκ° μ μ λ¨
- μ₯μ
𫧠λμ μμ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// C#μ΄ λμ μ μλμ§λ§ μλ₯Ό λ€μ΄λ³Έλ€λ©΄
int x = 3;
void Main() => Sub1();
void Sub1()
{
int x = 7;
Sub2();
}
void Sub2()
{
int y = x;
Console.WriteLine(y); // 7
}
λΆνλ‘κ·Έλ¨μ νΈμΆ μμμ λ°λΌμ λ³μμ μμμ΄ κ²°μ
- λ¬Έμ μ
- λΆνλ‘κ·Έλ¨ λ΄μ μ§μ λ³μκ° λ€λ₯Έ μ€ν μ€μΈ λΆνλ‘κ·Έλ¨μ κ°μμ μ΄λ€.
- μ§μ λ³μλ₯Ό 보νΈν λ°©λ²μ΄ μμ
- μ μ μμλ³΄λ€ λμ μμμ΄ μ λ’°μ±μ΄ λ¨μ΄μ§
- λΉμ§μ λ³μμλν μ°Έμ‘°λ₯Ό μ μ μΌλ‘ νμ κ²μ¬λ₯Ό ν μ μμ
- νλ‘κ·Έλ¨μ νλ
μ μ΄λ ΅κ² ν¨
- νλ‘κ·Έλ¨ μμ± μμ λΆνλ‘κ·Έλ¨μ νΈμΆ μμλ₯Ό μ μ μμ
- λμ μμμμμ λΉμ§μ λ³μμ λν μ κ·Όμ μ μ μμμμμ λΉμ§μ λ³μμ λν μ κ·Όλ³΄λ€ λ리λ€.
- λΆνλ‘κ·Έλ¨ λ΄μ μ§μ λ³μκ° λ€λ₯Έ μ€ν μ€μΈ λΆνλ‘κ·Έλ¨μ κ°μμ μ΄λ€.
- μ₯μ
- λΆνλ‘κ·Έλ¨μ νΈμΆ μμ 맀κ°λ³μ μ λ¬μ ν νμκ° μμ
- νΈμΆ νλ ν¨μ(Caller)μ λ³μλ€μ νΈμΆ λλ ν¨μ(Callee)μμ 묡μμ μΌλ‘ κ°μμ μ
- λΆνλ‘κ·Έλ¨μ νΈμΆ μμ 맀κ°λ³μ μ λ¬μ ν νμκ° μμ
- λμ μμμ μ μ μμ λ§νΌ μ¬μ©λμ§ μμ
- μ₯μ λ³΄λ€ λ¬Έμ μ μ΄ λ λ§κΈ° λλ¬Έ
@ μμμ
π« μμ vs μ‘΄μκΈ°κ°
@ U κΈ°λ§κ³ μ¬ μΆμ : λ³μμ μμκ³Ό μ‘΄μ μκ°μ κ°κ° μ€λͺ νκ³ μ΄λ€μ΄ μλ‘ μ΄λ»κ² λ€λ₯Έμ§λ₯Ό 보μ΄λ μλ₯Ό μ μνκ³ μ€λͺ νμμ€.
λλλ‘ κ°μ 보μ΄κΈ°λ νμ§λ§ λ€λ¦!
μμμ 곡κ°μ , μ‘΄μκΈ°κ°μ μκ°μ κ°λ
i.e. ν¨μ μ static λ³μ
~ μ μ μμμμ Scope λ° λ³μ? λμ ν¬μΈν°λ₯Ό μ°λ©΄ κ°λ₯
π« μ°Έμ‘° νκ²½
μ΄λ€ λ¬Έμ₯μμμ μ°Έμ‘° νκ²½μ κ·Έ λ¬Έμ₯μμ κ°μμ μΈ λͺ¨λ μ΄λ¦λ€μ μ§ν©
- μ μ -μμ μΈμ΄μμμ μ°Έμ‘° νκ²½
- κ·Έ μ§μ μμμ μ μΈλ λ³μλ€κ³Ό κ·Έ μ‘°μ μμμ μν κ°μμ μΈ λͺ¨λ λ³μλ€λ‘ ꡬμ±
- λ¬Έμ₯μ΄ μ»΄νμΌ λ λ μ°Έμ‘° νκ²½μ΄ κ΅¬μΆλμ΄ μμ΄μΌ ν¨
π« μ΄λ¦ μμ
λ± ν λ²λ§ κ°μ λ°μΈλ© λλ λ³μ
κ°λ
μ±κ³Ό μ λ’°μ±μ ν₯μ
i.e. 3.1415 β PI
νλ‘κ·Έλ¨μ λ§€κ° λ³μν νλλ° μμ£Ό μ μ©
- C
- const (C) or #define (Preprocessor)
- constκ° νμ Checking/Debugging μ μ 리
- C/C++/Javaμμ μ΄λ¦ μμμ λν λμ λ°μΈλ©μ νμ©
- νμ§λ§ νλ²λ§ νμ©
- C#: const μ μ λ°μΈλ©, readonly λμ λ°μΈλ© νμ©
- Pythonμ μ΄λ¦ μμ νμ© λ¬Έλ² μμ
- λ¨μ§ μ΄λ¦ κ·μ½μΌλ‘ ν΄