πŸŽ“λ°©μ†‘ν†΅μ‹ λŒ€ν•™κ΅/πŸ’»μ»΄ν“¨ν„°κ³Όν•™ 개둠

[컴퓨터과학 개둠] 12κ°• - ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄(2)

junbin2 2025. 11. 10. 19:09

βœ… 1. 블둝과 λ³€μˆ˜

(1) 블둝과 λ³€μˆ˜ - κ°œμš”

  • 블둝(block) κ³Ό λ³€μˆ˜(variable) 은 ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄κ°€ 데이터λ₯Ό μ €μž₯ν•˜κ³ , μ‹€ν–‰ λ²”μœ„λ₯Ό κ΄€λ¦¬ν•˜λŠ” κ°€μž₯ κΈ°λ³Έ λ‹¨μœ„μž„.
  • λ³€μˆ˜μ˜ μœ νš¨λ²”μœ„(scope) λ¬Έμ œλŠ” λ³€μˆ˜μ— λŒ€ν•œ κΈ°μ–΅ μž₯μ†Œμ˜ ν• λ‹Ή 및 μœ μ§€μ— λŒ€ν•œ 문제둜 λ³Ό 수 있음.
  • 즉, 블둝내 λ³€μˆ˜μ— λŒ€ν•œ 유효 λ²”μœ„ κ²°μ • λ¬Έμ œλŠ” ν”„λ‘œκ·Έλž¨μ˜ μ‹€ν–‰κ³Ό κΉŠμ€ 관련을 κ°€μ§„λ‹€.

[ 유효 λ²”μœ„ κ²°μ • 문제 ]

  • 블둝이 μ—¬λŸ¬ 겹으둜 쀑첩이 λ˜μ–΄μžˆλŠ” 경우 "μ–΄λ–€ λΈ”λ‘μ—μ„œ μ •μ˜λœ λ³€μˆ˜λ₯Ό μ–΄λ””κΉŒμ§€ μ“Έ 수 μžˆλ‚˜?", "겹쳐진 블둝 μ•ˆμ—μ„œ 같은 μ΄λ¦„μ˜ λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜λ©΄ μ–΄λ–€ κ±Έ 써야 ν•˜λ‚˜?" 와 같은 문제λ₯Ό μ˜λ―Έν•œλ‹€.

[ 블둝과 λ³€μˆ˜ ]

  • ν˜„μž¬μ˜ 고급언어듀은 μœ„μ™€κ°™μ΄ 블둝을 μ΄μš©ν•΄ ꡬ쑰적 ν”„λ‘œκ·Έλž˜λ°μ˜ 반볡, μ œμ–΄μ™€ 같이 볡합문을 κ΅¬ν˜„ ν•  수 있음.
  • μœ„μ™€ 같은 ꡬ쑰둜 블둝 λ‚΄λΆ€μ—μ„œ λ³€μˆ˜μ— λŒ€ν•œ λ©”λͺ¨λ¦¬ 관리λ₯Ό 블둝 λ‹¨μœ„λ‘œ 해쀄 수 있게 됨.
  • ( * 단, μ–Έμ–΄λ§ˆλ‹€ νŠΉμ„±μ΄ λ‹€λ₯΄κΈ° λ•Œλ¬Έμ— 블둝 λ‹¨μœ„λ‘œ ν•˜μ§€ μ•Šμ„ κ²½μš°λ„ 있음. )
  • ν•˜μ§€λ§Œ, μ—¬κΈ°μ„  λŒ€ν‘œμ μœΌλ‘œ μ“°μ΄λŠ” 블둝을 기초둜 λ³€μˆ˜μ˜ 유효 λ²”μœ„λ₯Ό κ΄€λ¦¬ν•˜λŠ” 방법에 λŒ€ν•΄μ„œ λ§ν• κ²ƒμž„.

(2) 블둝과 λ³€μˆ˜ - 유효 λ²”μœ„

  • 블둝듀은 μ€‘μ²©λ˜λŠ” ꡬ쑰도 κ°€μ§ˆ 수 μžˆμ–΄μ„œ 블둝 μ•ˆμ— λ‹€λ₯Έ 블둝이 λ“€μ–΄κ°€ μžˆμ„ 수 있음.
  • 블둝 λ‚΄λΆ€ 어디에 μœ„μΉ˜ν•˜λŠλƒμ— λ”°λΌμ„œ λ³€μˆ˜λ₯Ό μ „μ—­ λ³€μˆ˜, μ§€μ—­ λ³€μˆ˜λ‘œ λ‚˜λˆŒ 수 있음.

[ μ „μ—­ λ³€μˆ˜ ]

  • ν”„λ‘œκ·Έλž¨ μ½”λ“œμ˜ λͺ¨λ“  μ˜μ—­μ—μ„œ κΈ°μ–΅ μž₯μ†Œμ˜ 할당이 μœ νš¨ν•¨.
  • 즉, ν”„λ‘œκ·Έλž¨ μ‹œμž‘λΆ€ν„° λκΉŒμ§€ λ©”λͺ¨λ¦¬ κΈ°μ–΅μž₯μ†Œμ—μ„œ ν• λ‹Ή 받은 곡간이 μœ μ§€κ°€ λ˜λŠ” κ²ƒμž„.

[ μ§€μ—­ λ³€μˆ˜ ]

  • λ³€μˆ˜κ°€ μ •μ˜λœ 블둝 μ•ˆμ—μ„œλ§Œ κΈ°μ–΅ μž₯μ†Œμ˜ 할당이 μœ νš¨ν•¨.
  • 즉, μ§€μ—­λ³€μˆ˜λŠ” λΈ”λ‘μ˜ 싀행이 λ‹€ λλ‚˜κ²Œ 되면 ν•΄λ‹Ή λΈ”λ‘λ‚΄μ˜ λ³€μˆ˜λŠ” λ‚ λΌκ°€λŠ” λ²”μœ„λ₯Ό 가짐.

  • [ 블둝 1 ] 에 μ„ μ–Έ 및 μ΄ˆκΈ°ν™” 된 int gx = 10; 내뢀에 [ 블둝 2 ] κ°€ λ§Œλ“€μ–΄μ‘ŒμœΌλ―€λ‘œ, [ 블둝 2 ] μ—μ„œ gx λŠ” μ‚¬μš©μ΄ κ°€λŠ₯함.
  • 즉, [ 블둝 1 ] 이 λλ‚˜κΈ°μ „κΉŒμ§€λŠ” int gx = 10; 의 λ©”λͺ¨λ¦¬ 곡간은 μœ μ§€κ°€ 됨.
  • 반면, [ 블둝 2 ] 의 int y = 2;  의 μœ νš¨λ²”μœ„λŠ” [ 블둝 2 ] 이 λλ‚˜λ©΄ μ‚¬λΌμ§€κ²Œ 됨.
  • λ˜ν•œ, [ 블둝 2 ] 의 int gx = 20; 은 μƒˆλ‘œμš΄ λ³€μˆ˜λ₯Ό μ„ μ–Έ 및 μ΄ˆκΈ°ν™”λ₯Ό ν•œ 것이지 [ 블둝 1 ] 의 gx μ™€λŠ” μ „ν˜€ 관련이 μ—†μŒ.
  • μ΄λ ‡κ²Œ λ™μΌν•œ λ³€μˆ˜λͺ…을 μ„ μ–Έν•  수 μžˆλŠ” μ΄μœ λŠ”, 블둝이 λ‹€λ₯΄κΈ° λ•Œλ¬Έμ— 적용이 κ°€λŠ₯ν•œ κ²ƒμž„.
  • κ²°κ΅­ μž¬μ •μ˜λœ gx λΌλŠ” 말은 μ• μ΄ˆμ— ν‹€λ¦° ν‘œν˜„ 인듯..

(3) 블둝과 λ³€μˆ˜ - 유효 λ²”μœ„ κ·œμΉ™

[ 유효 λ²”μœ„ ]

  • 같은 μ΄λ¦„μ˜ λ³€μˆ˜κ°€ ν”„λ‘œκ·Έλž¨μ˜ μ—¬λŸ¬ κ³³μ—μ„œ μ •μ˜λ˜μ–΄ μ‚¬μš©λ  λ•Œ, μ–΄λ””μ„œ μ •μ˜λœ μ–΄λ–€ λ³€μˆ˜μ˜ 값을 μ°Έμ‘°ν•˜κ³  μ ‘κ·Όν•  κ²ƒμΈκ°€λŠ” 유효 λ²”μœ„ κ·œμΉ™μ— 따라 결정이 λœλ‹€.

[ 유효 λ²”μœ„ κ²°μ • 문제 ]

  • 블둝이 μ—¬λŸ¬ 겹으둜 쀑첩이 λ˜μ–΄μžˆλŠ” 경우 "μ–΄λ–€ λΈ”λ‘μ—μ„œ μ •μ˜λœ λ³€μˆ˜λ₯Ό μ–΄λ””κΉŒμ§€ μ“Έ 수 μžˆλ‚˜?", "겹쳐진 블둝 μ•ˆμ—μ„œ 같은 μ΄λ¦„μ˜ λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜λ©΄ μ–΄λ–€ κ±Έ 써야 ν•˜λ‚˜?" 와 같은 문제λ₯Ό μ˜λ―Έν•œλ‹€.
  • μ΄λŸ¬ν•œ 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„ , 유효 λ²”μœ„ κ·œμΉ™(유효 λ²”μœ„ κ²°μ • κΈ°μ€€)이 ν•„μš”ν•˜λ‹€.

[ 유효 λ²”μœ„ κ·œμΉ™ ]

  • μ½”λ“œκ°€ μ—¬λŸ¬ λΈ”λ‘μ•ˆμ— μ€‘μ²©λ˜μ–΄ μžˆμ„ λ•Œ, μ–΄λ–€ λ³€μˆ˜λ₯Ό μ–΄λ””κΉŒμ§€ μ‚¬μš©ν•  수 μžˆλŠ”μ§€(μœ νš¨ν•œ λ²”μœ„)λ₯Ό μ •ν•˜λŠ” κ·œμΉ™
  • μ’…λ₯˜λŠ” λŒ€ν‘œμ μœΌλ‘œ 정적 유효 λ²”μœ„ κ·œμΉ™, 동적 유효 λ²”μœ„ κ·œμΉ™ 두 κ°€μ§€κ°€ 있음.

[ 정적 유효 λ²”μœ„ κ·œμΉ™ ]

  • λ³€μˆ˜μ˜ 유효 λ²”μœ„ 결정은 컴파일이 μ΄λ£¨μ–΄μ§€λŠ” μ‹œκΈ°μ— μ½”λ“œμ—μ„œ κ°€μž₯ κ°€κΉŒμ΄ μ •μ˜λœ κ²ƒμœΌλ‘œ 유효 λ²”μœ„κ°€ 결정됨
  • μ‰½κ²Œλ§ν•΄, 컴파일 μ‹œμ μ— 이미 μˆœμ„œλ₯Ό μ •ν•΄λ‘λŠ” 것이라고 보면 됨. ( ν˜„λŒ€ μ–Έμ–΄μ—μ„œ 많이 씀 )

[ 동적 유효 λ²”μœ„ κ·œμΉ™ ]

  • μ½”λ“œμ˜ μ‹€μ œ μ‹€ν–‰ ν™˜κ²½μ— 따라 λ³€μˆ˜μ˜ 유효 λ²”μœ„κ°€ 결정됨.
  • μ‰½κ²Œλ§ν•΄, 싀행쀑에 μ–΄λ””μ„œ 호좜이 되고, μ–΄λ””μ„œ μ‹€ν–‰λ˜λŠ”μ§€μ— λ”°λΌμ„œ λ³€μˆ˜μ˜ 유효 λ²”μœ„κ°€ κ²°μ •λ˜λŠ” 것을 μ˜λ―Έν•¨.

βœ… 2. ν•¨μˆ˜μ˜ κΈ°λ³Έ κ°œλ…

(1) λΆ€ν”„λ‘œκ·Έλž¨: ν•¨μˆ˜μ™€ ν”„λ‘œμ‹œμ €

[ λΆ€ν”„λ‘œκ·Έλž¨(Subprogram) ]

  • 반볡 μ‚¬μš©λ˜λŠ” μ½”λ“œ 뢀뢄을 ν•˜λ‚˜μ˜ λ‹¨μœ„λ‘œ λ¬Άμ–΄μ„œ, κ³ μœ ν•œ 이름을 λΆ€μ—¬ν•˜κ³ , κ·Έ 이름을 일반 λͺ…λ Ήμ–΄μ²˜λŸΌ μ‚¬μš©ν•  수 있게 λ§Œλ“  것을 μ˜λ―Έν•œλ‹€.
  • λΆ€ν”„λ‘œκ·Έλž¨μ˜ μ’…λ₯˜λŠ” 크게 ν•¨μˆ˜μ™€ ν”„λ‘œμ‹œμ €λ‘œ ꡬ뢄이 λœλ‹€.

[ ν•¨μˆ˜μ™€ ν”„λ‘œμ‹œμ € ]

  • ν•¨μˆ˜: 결과값을 λ°˜ν™˜ν•˜λŠ” νŠΉμ§•μ„ κ°€μ§„λ‹€. 즉, μž…λ ₯을 λ°›μ•„ 처리 결과값을 돌렀주고 싢을 λ•Œ μ‚¬μš©ν•¨.
  • ν”„λ‘œμ‹œμ €: 값을 λ°˜ν™˜ν•˜μ§€ μ•ŠλŠ” νŠΉμ§•μ„ κ°€μ§„λ‹€. 즉, νŠΉμ • μž‘μ—… μˆ˜ν–‰ λͺ©μ μœΌλ‘œ λ™μž‘ μžμ²΄κ°€ λͺ©μ μΌ λ•Œ μ‚¬μš©ν•¨.
  • λ‘˜ λ‹€ μž¬μ‚¬μš© κ°€λŠ₯ν•œ μ½”λ“œ λ‹¨μœ„λΌλŠ” μ μ—μ„œ λΆ€ν”„λ‘œκ·Έλž¨μœΌλ‘œ 뢈림.
  • # C, C++ 은 void 둜 λ°˜ν™˜κ°’μ΄ μ—†λŠ” κ²½μš°λ„ μžˆμ§€λ§Œ κ·Έλƒ₯ ν•¨μˆ˜λ‘œ ν†΅μΌν•΄μ„œ λΆ€

(2) λΆ€ν”„λ‘œκ·Έλž¨: ν•¨μˆ˜μ™€ ν”„λ‘œμ‹œμ € - λ‚΄λΆ€ λ™μž‘

  • μœ„μ™€ 같이 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λŠ” 곳을 호좜 ν•¨μˆ˜, 호좜 λ‹Ήν•˜λŠ” ν•¨μˆ˜λ₯Ό ν”Όν˜ΈμΆœ ν•¨μˆ˜λΌκ³  ν•œλ‹€.
  • ν•¨μˆ˜μ˜ 호좜이 λ°œμƒλ˜λ©΄, ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•œ ν”„λ‘œκ·Έλž¨μ˜ μˆ˜ν–‰μ΄ μΌμ‹œ μ€‘λ‹¨λ˜κ³  호좜된 ν•¨μˆ˜λ‘œ μ‹€ν–‰ μ œμ–΄κ°€ 이전됨.
  • ν”Όν˜ΈμΆœ ν•¨μˆ˜μ˜ μ‹€ν–‰ 쀑에 ν•¨μˆ˜ μ’…λ£Œ 쑰건이 만쑱되면 μ‹€ν–‰ μ œμ–΄κ°€ ν˜ΈμΆœν•œ ν•¨μˆ˜λ‚˜ ν˜ΈμΆœν•œ ν”„λ‘œκ·Έλž¨μœΌλ‘œ λŒμ•„κ°.
  • ν•¨μˆ˜μ˜ μ œμ–΄ μ§„μž…μ μ€ 항상 첫 μ€„μ΄μ§€λ§Œ μ œμ–΄ μ’…λ£Œ(return) 쑰건에 λ”°λΌμ„œ μ—¬λŸ¬ μ€„μ—μ„œ μ΄λ£¨μ–΄μ§ˆ 수 있음.

(3) ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜

  • λ§€κ°œλ³€μˆ˜(parameter): 호좜 ν•¨μˆ˜μ™€ ν”Όν˜ΈμΆœ ν•¨μˆ˜ μ‚¬μ΄μ—μ„œ μ£Όκ³  λ°›λŠ” 데이터λ₯Ό μ˜λ―Έν•¨.
  • 호좜 ν•¨μˆ˜λŠ” ν”Όν˜ΈμΆœ ν•¨μˆ˜μ˜ μ‹€ν–‰ λŒ€μƒμ΄ 될 수 μžˆλŠ” 데이터λ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ λ„˜κΈΈ 수 있음.
  • ν”Όν˜ΈμΆœ ν•¨μˆ˜μ—μ„œ 처리될 값을 μ „λ‹¬ν•˜λŠ” λ§€κ°œλ³€μˆ˜λŠ” νŠΉμ • λ°μ΄ν„°ν˜•μ„ κ°€μ§ˆ 수 있음.
  • λ°˜ν™˜κ°’: ν”Όν˜ΈμΆœ ν•¨μˆ˜μ˜ μ‹€ν–‰ κ²°κ³Όλ₯Ό λŒλ €μ£ΌλŠ” λ°˜ν™˜κ°’λ„ νŠΉμ • 데이터 ν˜•μ„ κ°€μ§„λ‹€.
  • λ§€κ°œλ³€μˆ˜λ‘œ 데이터λ₯Ό λ„˜κ²¨ 처리 ν›„ λ°˜ν™˜κ°’μ„ 톡해 λ‹€μ‹œ μ „λ‹¬ν•˜λŠ” ꡬ쑰둜 λ³Ό 수 있음.

[ ν˜•μ‹λ§€κ°œλ³€μˆ˜ ]

// ν˜•μ‹ λ§€κ°œλ³€μˆ˜: () κ΄„ν˜Έ μ•ˆμ˜ λ³€μˆ˜λ₯Ό μ˜λ―Έν•¨.
int function(int x) {
    return x;
}
  • ν”Όν˜ΈμΆœ ν•¨μˆ˜μ˜ μ •μ˜μ— μ‚¬μš©λœ λ§€κ°œλ³€μˆ˜λ₯Ό μ˜λ―Έν•œλ‹€.

[ μ‹€λ§€κ°œλ³€μˆ˜ ]

// μ‹€ λ§€κ°œλ³€μˆ˜: 호좜 ν•¨μˆ˜μ˜ () 인자둜 λ„˜κΈ°λŠ” 값을 μ˜λ―Έν•¨.
int a = function(10);

int function(int x) {
    return x;
}
  • 호좜 ν•¨μˆ˜μ—μ„œ ν”Όν˜ΈμΆœ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜κΈ° μœ„ν•΄ μ‚¬μš©λœ λ§€κ°œλ³€μˆ˜λ₯Ό μ˜λ―Έν•¨.

(4) ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜ - 호좜 방식

  • ν˜ΈμΆœν•˜λŠ” ν”„λ‘œκ·Έλž¨κ³Ό ν˜ΈμΆœλ˜λŠ” ν•¨μˆ˜ μ‚¬μ΄μ˜ λ§€κ°œλ³€μˆ˜λ₯Ό μ „λ‹¬ν•˜λŠ” 방식에 따라 κ°’ 호좜 방식, μ°Έμ‘° 호좜 λ°©μ‹μœΌλ‘œ λ‚˜λ‰¨.

[ κ°’ 호좜 방식 ]

void change(int a, int b) { // κ°’ 호좜 방식
    a = 100;
    b = 200;
    printf("%d, %d\n", a, b); // result: 100, 200
}
int main() {
    int a = 1, b = 2;
    add(a, b); // 값을 λ„˜κΈ΄κ²ƒμž„.
    printf("%d, %d\n", a, b); // result: 1, 2
}
  • μ‹€ λ§€κ°œλ³€μˆ˜λ‘œ λ“€μ–΄κ°€λŠ” 것은 μ£Όμ†Œκ°’μ΄ μ•„λ‹Œ μ‹€μ œ 값을 λ„˜κΈ°κ²Œ 되며, 이후 ν˜•μ‹ λ§€κ°œλ³€μˆ˜λ‘œ λ°›μ•„μ„œ 처리λ₯Ό ν•˜κ²Œ λœλ‹€.
  • ν•΄λ‹Ή 방식은 ν˜•μ‹ λ§€κ°œλ³€μˆ˜λ‘œ μ„ μ–Έ 된 a와 bλŠ” μ‹€ λ§€κ°œλ³€μˆ˜λ‘œ μ „λ‹¬ν•˜λŠ” μΈμžκ°’μœΌλ‘œ μ΄ˆκΈ°ν™”κ°€ λœλ‹€.
  • 즉, μƒˆλ‘­κ²Œ λ³€μˆ˜κ°€ 선언이 되고 μ΄ˆκΈ°ν™”κ°€ λ˜λŠ” 방식이며, ν•΄λ‹Ή ν˜•μ‹ λ§€κ°œλ³€μˆ˜λŠ” ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œλ§Œ μœ νš¨ν•œ 수λͺ…을 κ°€μ§€κ²Œ λœλ‹€.

[ μ°Έμ‘° 호좜 방식 ]

void change(int *a, int *b) {
    *a = 100;
    *b = 200;
    printf("%d, %d\n", *a, *b); // result: 100, 200
}

int main() {
    int a = 1, b = 2;
    add(&a, &b);  // μ£Όμ†Œλ₯Ό 전달 (μ°Έμ‘° 호좜)
    printf("%d, %d\n", a, b);  // result: 100, 200
}
  • μ‹€ λ§€κ°œλ³€μˆ˜λ‘œ 인자λ₯Ό λ„˜κΈΈ λ•Œ 값이 μ•„λ‹Œ μ£Όμ†Œκ°’μ„ 보내주고 ν˜•μ‹ λ§€κ°œλ³€μˆ˜μ—μ„œλŠ” μ£Όμ†Œκ°’μ„ λ°›λŠ” 방식이닀.
  • 즉, ν˜•μ‹ λ§€κ°œλ³€μˆ˜κ°€ 값을 받을 λ•Œ, κ°’ 전달 방식과 λ™μΌν•˜κ²Œ ν˜•μ‹ λ§€κ°œλ³€μˆ˜λŠ” λ³€μˆ˜λ₯Ό μ„ μ–Έκ³Ό λ™μ‹œμ— μ΄ˆκΈ°ν™”λ₯Ό ν•˜κ²Œ λœλ‹€.
  • λ‹€λ§Œ λ‹€λ₯Έμ μ€ ν•΄λ‹Ή λ³€μˆ˜κ°’μœΌλ‘œ μ£Όμ†Œκ°’μ„ λ„£μ—ˆκΈ° λ•Œλ¬Έμ— ν¬μΈνŒ…μ΄ λ˜μ–΄μžˆλŠ” μƒνƒœμ΄λ‹€.
  • 즉, change() ν•¨μˆ˜μ˜ ν˜•μ‹ λ§€κ°œλ³€μˆ˜λ‘œ μ„ μ–Έ 및 μ΄ˆκΈ°ν™” 된 a 와 b λŠ” μƒˆλ‘œ λ§Œλ“€μ–΄μ§„ λ³€μˆ˜μ§€λ§Œ, λ‚΄λΆ€μ—λŠ” main() μ—μ„œ μ„ μ–Έ 된 a 와 b 의 μ£Όμ†Œκ°’μ„ κ°€μ§€κ³  있기 λ•Œλ¬Έμ— μˆ˜μ •μ΄ μΌμ–΄λ‚œλ‹€λ©΄ main() a , b 의 값이 변경이 되게 λœλ‹€.

βœ… 3. λ³€μˆ˜μ˜ 수λͺ…

  • λ³€μˆ˜κ°€ 값을 μ €μž₯ν•˜κΈ° μœ„ν•΄μ„œλŠ” κΈ°μ–΅ μž₯μ†Œ(λ©”λͺ¨λ¦¬) λ₯Ό ν• λ‹Ή λ°›μ•„μ•Ό ν•œλ‹€.
  • ν•΄λ‹Ή λ©”λͺ¨λ¦¬μ— λ³€μˆ˜κ°€ ν• λ‹Ή 되고 이후뢀터 ν•΄μ œλ  λ•ŒκΉŒμ§€λ₯Ό λ³€μˆ˜μ˜ 수λͺ…μœΌλ‘œ λ³Έλ‹€.
  • μ΄λŸ¬ν•œ λ³€μˆ˜μ˜ 수λͺ…은 ν• λ‹Ή 방식에 따라 μžλ™ ν• λ‹Ή, 정적 ν• λ‹Ή, μ§€μ • ν• λ‹Ή 3κ°€μ§€ λ°©μ‹μœΌλ‘œ λ‚˜λ‰œλ‹€.
  • μ΄λŸ¬ν•œ ν• λ‹Ή 방식이 λ³€μˆ˜μ˜ 수λͺ…을 κ²°μ •ν•˜κ²Œ λ˜λŠ” 것이닀.

(1) μžλ™ ν• λ‹Ή 방식

void test() {
    int x = 10;   // ν•¨μˆ˜ μ‹œμž‘ν•  λ•Œ μŠ€νƒμ— x 생성
}                 // ν•¨μˆ˜ λλ‚˜λ©΄ x μžλ™ μ†Œλ©Έ
  • λ³€μˆ˜κ°€ μ„ μ–Έλœ 블둝(ν•¨μˆ˜, ifλ¬Έ λ“±)이 μ‹œμž‘λ  λ•Œ μžλ™μœΌλ‘œ λ©”λͺ¨λ¦¬κ°€ 할당이 λœλ‹€. -> 보톡 μ§€μ—­λ³€μˆ˜
  • 이후, 블둝이 끝날 λ•Œ μžλ™μœΌλ‘œ ν•΄μ œ(회수)κ°€ λœλ‹€.
  • μ»΄νŒŒμΌλŸ¬κ°€ 관리해주며, 주둜 μŠ€νƒ μ˜μ—­μ— μ €μž₯이 됨. ( λŸ°νƒ€μž„ μ‹œμ μ— 블둝에 λ“€μ–΄κ°ˆ λ•Œ λ©”λͺ¨λ¦¬ ν• λ‹Ή λ°›λŠ”λ‹€ μƒκ°ν•˜λ©΄ 됨 )

(2) 정적 ν• λ‹Ή 방식

int count = 0;      // μ „μ—­ λ³€μˆ˜ → ν”„λ‘œκ·Έλž¨ μ‹œμž‘ μ‹œ λ©”λͺ¨λ¦¬ 확보
static int num = 5; // 정적 μ§€μ—­ λ³€μˆ˜ → μ—­μ‹œ ν”„λ‘œκ·Έλž¨ μ’…λ£Œ μ‹œκΉŒμ§€ μœ μ§€
  • ν”„λ‘œκ·Έλž¨μ΄ μ‹œμž‘λ  λ•Œ μžλ™μœΌλ‘œ λ©”λͺ¨λ¦¬λ₯Ό 확보함. ( 데이터 μ˜μ—­μ— μ €μž₯이 됨. ) -> 보톡 μ „μ—­λ³€μˆ˜
  • 이후, ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œκ°€ 되면 ν•΄μ œκ°€ 됨. ( 컴파일 μ‹œμ μ— λ©”λͺ¨λ¦¬ 할당이 λœλ‹€κ³  보면 됨. )
  • 즉, ν”„λ‘œκ·Έλž¨ μ „μ²΄λ™μ•ˆ μœ μ§€κ°€ 됨.

(3) μ§€μ • ν• λ‹Ή 방식

int *p = malloc(sizeof(int)); // 직접 μš”μ²­
*p = 10;
free(p);                      // 직접 ν•΄μ œ (μ•ˆ ν•˜λ©΄ λ©”λͺ¨λ¦¬ λˆ„μˆ˜)
  • ν”„λ‘œκ·Έλž˜λ¨Έκ°€ 직접 μš”μ²­ν•˜κ³  직접 ν•΄μ œν•΄μ•Ό 함.
  • νž™(Heap) μ˜μ—­μ— μ €μž₯이 되며, ν”„λ‘œκ·Έλž˜λ¨Έκ°€ 직접 관리λ₯Ό 함.

βœ… 4. 객체 μ§€ν–₯ ν”„λ‘œκ·Έλž¨μ„ μœ„ν•œ 좔상 μžλ£Œν˜•

(1) 좔상화

  • μΆ”μƒν™”λŠ” 곡톡점은 λ“œλŸ¬λ‚΄κ³ , 차이점은 감좔어 λ³΅μž‘ν•œ λŒ€μƒμ„ λ‹¨μˆœν•˜κ³  μΌλ°˜ν™”λœ ν˜•νƒœλ‘œ ν‘œν˜„ν•˜λŠ” κ³Όμ •μž„.
  • 즉, λ³΅μž‘ν•œ λŒ€μƒμ΄λ‚˜ κ°œλ…μ—μ„œ 핡심적인 μ†μ„±λ§Œμ„ μΆ”μΆœν•˜μ—¬ ν‘œν˜„ν•˜κ³ , λΆˆν•„μš”ν•œ 세뢀사항은 μˆ¨κΈ°κ±°λ‚˜ μ œκ±°ν•˜λŠ” 것을 μ˜λ―Έν•¨.
  • 의의: κ³΅ν†΅λœ νŠΉμ§•(μœ μ‚¬μ„±)을 λ¬Άμ–΄ ν•˜λ‚˜μ˜ κ·Έλ£Ήμ΄λ‚˜ κ°œλ…μœΌλ‘œ λ‹¨μˆœν™”ν•¨μœΌλ‘œμ¨ 이해와 μž¬μ‚¬μš©μ„ μ‰½κ²Œ ν•  수 있음.
  • μ •λ¦¬ν•˜λ©΄, 좔상화 μžμ²΄λŠ” λ³΅μž‘ν•œ κ±Έ λ‹¨μˆœν™”ν•˜λŠ” μ‚¬κ³ λ°©μ‹μœΌλ‘œ λ³Ό 수 있음.

[ μ˜ˆμ‹œ ]

  • 지도: 세상엔 건물, λ‚˜λ¬΄, μ‚¬λžŒ, μžλ™μ°¨ λ“± μˆ˜λ§Žμ€κ²Œ μžˆμ§€λ§Œ, μ§€λ„μ—λŠ” λ„λ‘œμ™€ μœ„μΉ˜ μ •λ³΄λ§Œ ν‘œμ‹œλ¨ ( λΆˆν•„μš”ν•œ 건 μƒλž΅ )
  • 리λͺ¨μ»¨: TV λ‚΄λΆ€ νšŒλ‘œλ‚˜ μ „κΈ° μ‹ ν˜ΈλŠ” λͺ°λΌλ„, λ²„νŠΌμœΌλ‘œ λͺ¨λ“  회둜λ₯Ό λ™μž‘μ‹œν‚¬ 수 있음. ( λ³΅μž‘ν•œ λ‚΄λΆ€ μˆ¨κΉ€, ν•„μš”ν•œ κΈ°λŠ₯ λ…ΈμΆœ )
  • μžλ™μ°¨: μš΄μ „ μ—”μ§„ μž‘λ™ μ›λ¦¬λŠ” λͺ°λΌλ„ ν•Έλ“€, μ—‘μ…€, 브레이크만 μ‘°μž‘ν•˜λ©΄ 됨 → 핡심 λ™μž‘λ§Œ μΆ”μΆœν•œ κ²°κ³Ό

[ κ²°λ‘  ]

  • 좔상화 μžμ²΄λŠ” ν”„λ‘œκ·Έλž˜λ° μ „λ°˜, 더 λ‚˜μ•„κ°€ μ‚¬κ³ μ˜ 방식 μ „λ°˜μ— μ“°μ΄λŠ” 일반적인 κ°œλ…μž„.
  • 즉, 절차적 ν”„λ‘œκ·Έλž˜λ°μ—μ„œ λ³΅μž‘ν•œ μ½”λ“œλ₯Ό ν•¨μˆ˜λ‘œ λ¬ΆλŠ” 것도 μΆ”μƒν™”λ‘œ λ³Ό 수 있음.
  • μ—¬κΈ°μ„œ 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ„ λ…Όν•˜λ©΄, 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ€ 객체의 좔상화λ₯Ό 톡해 κ΅¬ν˜„ν•˜λŠ” ν”„λ‘œκ·Έλž˜λ° κΈ°λ²•μž„.
  • 즉, 좔상화 κ°œλ…μ„ 객체에 μ μš©ν•΄ 객체 λ‹¨μœ„λ‘œ 곡톡점을 λ¬ΆλŠ” 좔상화λ₯Ό μ˜λ―Έν•˜λŠ” κ²ƒμž„.

(2) ν”„λ‘œμ‹œμ €μ˜ 좔상화

  • μˆ˜ν–‰ 방법을 κΈ°μˆ ν•˜μ§€ μ•Šκ³  무엇이 μˆ˜ν–‰λ˜λŠ”κ°€λ₯Ό λ¬˜μ‚¬ν•¨μœΌλ‘œμ¨ μΆ”μƒν™”μ‹œμΌœ μ£ΌλŠ” μ‹€ν–‰κ³Όμ •μ˜ 좔상화 κΈ°λ²•μž„
  • μ‰½κ²Œλ§ν•΄, μ •λ ¬ ν•¨μˆ˜κ°€ μžˆλ‹€κ³  κ°€μ •ν•˜λ©΄ λ‚΄λΆ€μ˜ ꡬ체적인 μ•Œκ³ λ¦¬μ¦˜ λͺ…세없이 μ •λ ¬ ν•¨μˆ˜λΌλŠ”κ²ƒ 자체둜 정렬을 ν•˜κΈ° λ•Œλ¬Έμ— κ°€μ Έλ‹€κ°€ μ‚¬μš©ν•˜λ©΄ ν•˜λ©΄ λ˜λŠ” 경우둜 보고 μ΄λŸ¬ν•œ μˆ˜ν–‰λ§Œ λ¬˜μ‚¬ν•˜λŠ” ν•¨μˆ˜ μΆ”μƒν™”λ‘œ λ³Ό 수 있음.
  • 객체지ν–₯μ—μ„œ 객체 λ‚΄λΆ€μ˜ λ©”μ„œλ“œλŠ” “ν”„λ‘œμ‹œμ € 좔상화”의 μ—°μž₯선상에 μžˆλ‹€κ³  λ³Ό 수 있음.
  • κ²°κ΅­ 뢀차적인 속성인 κ΅¬ν˜„ μ†ŒμŠ€ μ½”λ“œ, μ•Œκ³ λ¦¬μ¦˜μ€ κ΅¬ν˜„λœ μ •λ ¬ μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œμ„œ ν”„λ‘œκ·Έλž˜λ¨Έ μž…μž₯μ—μ„œ μ€‘μš”ν•˜κ²Œ 보지 μ•Šκ²Œλ¨.

(3) 자료의 μΊ‘μŠν™”

  • μΊ‘μŠν™”λŠ” λ‚΄λΆ€ κ΅¬ν˜„μ„ 숨기고 μ™ΈλΆ€μ—μ„œλŠ” ν•„μš”ν•œ κΈ°λŠ₯만 λ³Ό 수 μžˆλ„λ‘ μ œν•œν•˜λŠ” 것을 μ˜λ―Έν•œλ‹€.
  • μΊ‘μŠν™”λ₯Ό μ‚¬μš©ν•˜λŠ” μ΄μœ λŠ” 객체의 일관성과 μ•ˆμ •μ„±μ„ μœ μ§€ν•˜κΈ° μœ„ν•΄μ„œμ΄λ‹€.
  • 즉, μΊ‘μŠν™”λœ λ‚΄λΆ€ μ½”λ“œμ˜ λ³€κ²½μœΌλ‘œ 인해 μ™ΈλΆ€ μ½”λ“œμ— 영ν–₯이 갈 수 μžˆμœΌλ―€λ‘œ 막기 μœ„ν•¨μž„.
  • 결과적으둜, μΊ‘μŠν™”λŠ” 데이터λ₯Ό κ°μΆ”κ±°λ‚˜ λ‹¨μˆœν™”ν•˜λŠ” κ°œλ…μ΄λ©° ν”„λ‘œκ·Έλž¨μ„ μž¬μ‚¬μš©ν•˜κΈ° μ‰½κ²Œ λ§Œλ“€κΈ° μœ„ν•œ 핡심 μ›λ¦¬μž„.
  • μΊ‘μŠν™”λ‘œ 인해 객체 λ‚΄λΆ€ ꡬ쑰λ₯Ό λͺ°λΌλ„ μ™ΈλΆ€μ—μ„œ 미리 μ •μ˜λœ 이름(λ©”μ„œλ“œ, μΈν„°νŽ˜μ΄μŠ€)만 μ•Œκ³  μ‚¬μš©μ΄ κ°€λŠ₯해짐.