포슀트

🌚 ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄ - 이름, 바인딩, μ˜μ—­

πŸ’« 이름, 바인딩, μ˜μ—­


🫧 μ„œλ‘ 

  • λͺ…λ Ήν˜• μ–Έμ–΄
    • (ν˜„λŒ€ 컴퓨터) = 폰 λ…Έμ΄λ§Œ 컴퓨터에 λŒ€ν•œ 좔상화
    • λ©”λͺ¨λ¦¬μ— 데이터/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, …

@ ν˜„ν•™μ μΈ

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;
    • 순수 객체지ν–₯ μ–Έμ–΄μ—μ„œ λͺ¨λ“  λ°μ΄ν„°λŠ” 객체이며, μž„μ˜μ˜ λ³€μˆ˜λŠ” μž„μ˜μ˜ 객체λ₯Ό μ°Έμ‘°ν•  수 있음 β†’ λͺ¨λ“  λ³€μˆ˜λŠ” μ°Έμ‘° νƒ€μž…
      • 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)
            • λ§Œμ•½ μ΅œμƒμœ„ ν”„λ‘œκ·Έλž¨ λ‹¨μœ„κΉŒμ§€μ—μ„œλ„ 발견이 μ•ˆλ˜λ©΄ λ³€μˆ˜ λ―Έμ„ μ–Έ μ—λŸ¬ λ°œμƒ
        • 지역 λ³€μˆ˜κ°€ μ™ΈλΆ€ (μ „μ—­) λ³€μˆ˜μ— μš°μ„  함

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은 이름 μƒμˆ˜ ν—ˆμš© 문법 μ—†μŒ
    • 단지 이름 κ·œμ•½μœΌλ‘œ ν•΄
이 κΈ°μ‚¬λŠ” μ €μž‘κΆŒμžμ˜ CC BY 4.0 λΌμ΄μ„ΌμŠ€λ₯Ό λ”°λ¦…λ‹ˆλ‹€.