C#/이것이 C#이닀

2. C#의 데이터 ν˜•μ‹(κ°’ ν˜•μ‹, μ°Έμ‘° ν˜•μ‹), λ©”λͺ¨λ¦¬(μŠ€νƒ, νž™)

Rainbow🌈Coder 2022. 2. 4. 18:06
728x90

좜처https://youtu.be/GvUMF_UM8jU

 

데이터 ν˜•μ‹

(1) κΈ°λ³Έ 데이터 ν˜•μ‹ : μ •μˆ˜ ν˜•μ‹(char/uchar, signed byte/byte, short/ushort, int/uint), 뢀동 μ†Œμˆ˜ν˜•μ‹(float, double)

(2) 볡합 데이터 ν˜•μ‹ : 클래슀, ꡬ쑰체, μΈν„°νŽ˜μ΄μŠ€ etc

λ³€μˆ˜ : λ©”λͺ¨λ¦¬ μͺ½μ—μ„œ 보면 λ³€μˆ˜λž€ "데이터λ₯Ό λ‹΄λŠ” 일정 크기(데이터 ν˜•μ‹μ— 따라 결정됨)의 곡간"μ΄λΌλŠ” 의미λ₯Ό κ°–λŠ”λ‹€.

데이터λ₯Ό μ €μž₯ν•  수 μžˆλŠ” λ©”λͺ¨λ¦¬ 곡간(μœ ν˜•κ³Ό 크기가 μ •ν•΄μ Έ μžˆμ–΄μ•Όν•¨), μ½”λ“œμ—μ„œ 이름(μ‹λ³„μž)을 λΆ™μ—¬ μ‚¬μš©

 

κΈ°λ³Έ 데이터 ν˜•μ‹μ—λ„ κ°’ ν˜•μ‹κ³Ό μ°Έμ‘° ν˜•μ‹μ΄ 있고, 볡합 데이터 ν˜•μ‹μ—λ„ κ°’ ν˜•μ‹κ³Ό μ°Έμ‘° ν˜•μ‹μ΄ μžˆλ‹€.

 

λ³€μˆ˜λ₯Ό μ„ μ–Έν•œλ‹€(μ»΄νŒŒμΌλŸ¬μ—κ²Œ) : "이 λ³€μˆ˜μ— ν•„μš”ν•œ λ©”λͺ¨λ¦¬ 곡간을 μ˜ˆμ•½ν•΄λ‹¬λΌ."

μ„ μ–Έλœ λ³€μˆ˜μ—λŠ” λŒ€μž… μ—°μ‚°μžλ₯Ό 톡해 데이터λ₯Ό μž…λ ₯ν•  수 μžˆλ‹€.

μ„ μ–Έκ³Ό 데이터 할당을 λ™μ‹œμ— ν•  수 μžˆλ‹€.

μ΄ˆκΈ°ν™” : μ΄ˆκΈ°ν™”λž€, λ³€μˆ˜μ— 졜초의 데이터λ₯Ό ν• λ‹Ήν•˜λŠ” 것을 μ˜λ―Έν•œλ‹€. 

λ³€μˆ˜λ₯Ό μ„ μ–Έν•œ ν›„ 아무 데이터도 μž…λ ₯ν•˜μ§€ μ•ŠμœΌλ©΄ Cλ‚˜ C++μ—μ„œλŠ” μ“°λ ˆκΈ° 데이터가 λ“€μ–΄κ°„λ‹€.

C#μ—μ„œλŠ” 이런 문제λ₯Ό λ°©μ§€ν•˜λ„λ‘ μ΄ˆκΈ°ν™”λ˜μ§€ μ•Šμ€ λ³€μˆ˜κ°€ 있으면 μ»΄νŒŒμΌλŸ¬κ°€ μ—λŸ¬λ₯Ό λΏœμœΌλ©΄μ„œ μ‹€ν–‰ νŒŒμΌμ„ λ§Œλ“€μ–΄μ£Όμ§€ μ•ŠλŠ”λ‹€. κ·ΈλŸ¬λ―€λ‘œ 보톡 0으둜 μ΄ˆκΈ°ν™”ν•΄μ€€λ‹€. 

 

λ©”λͺ¨λ¦¬μ˜μ—­(μŠ€νƒ vs νž™) 

 

μŠ€νƒ(Stack) (κ°’ ν˜•μ‹κ³Ό 관련이 있음) "마치 게으λ₯Έ ν”„λ‘œκ·Έλž˜λ¨Έμ˜ 책상 μœ„μ— μŒ“μ—¬ μžˆλŠ” μ±… 더미와 같은 ꡬ쑰"

λ¨Όμ € μŒ“μ€ μ±…μΌμˆ˜λ‘ μ•„λž˜μ— 있고 λ‚˜μ€‘μ— μŒ“μ€ μ±…μΌμˆ˜λ‘ μœ„μ— μžˆμ–΄, 제일 μ•„λž˜μ— μžˆλŠ” 책을 κΊΌλ‚΄λ €λ©΄ μœ„μ— μŒ“μ—¬ μžˆλŠ” λͺ¨λ“  책을 걷어내듯이, μŠ€νƒμ΄ λ™μž‘ν•¨.

- 데이터λ₯Ό μŒ“μ•„ μ˜¬λ¦¬λŠ” ꡬ쑰의 λ©”λͺ¨λ¦¬

- λ‚˜μ€‘μ— μŒ“μΈ 데이터λ₯Ό λ¨Όμ € 제거

- μ²˜μŒμ— μŒ“μΈ 데이터λ₯Ό λ‚˜μ€‘μ— 제거

- μŒ“μΈ μˆœμ„œμ˜ μ—­μˆœμœΌλ‘œ ν•„μš”μ—†λŠ” 데이터λ₯Ό μžλ™μœΌλ‘œ 제거(μžλ™ λ©”λͺ¨λ¦¬)

 

νž™(Heap) (μ°Έμ‘° ν˜•μ‹κ³Ό 관련이 있음) "μŠ€νƒμ²˜λŸΌ μ €μž₯된 데이터λ₯Ό 슀슀둜 μ œκ±°ν•˜λŠ” λ§€μ»€λ‹ˆμ¦˜X,

λŒ€μ‹ μ— μ²­μ†ŒλΆ€(CLR의 κ°€λΉ„μ§€ 컬렉터)λ₯Ό 고용" κ°€λΉ„μ§€ μ»¬λ ‰ν„°λŠ” ν”„λ‘œκ·Έλž¨ 뒀에 μˆ¨μ–΄ λ™μž‘ν•˜λ©΄μ„œ νž™μ— 더이상 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 객체가 있으면 κ·Έ 객체λ₯Ό μ“°λ ˆκΈ°λ‘œ κ°„μ£Όν•˜κ³  μˆ˜κ±°ν•˜λŠ” κΈ°λŠ₯을 ν•œλ‹€.

- 자유둭게 데이터λ₯Ό μ €μž₯ν•  수 μžˆλŠ” λ©”λͺ¨λ¦¬

- 별λͺ… : μžμœ μ €μž₯μ†Œ(Free Store)

μŠ€νƒ λ©”λͺ¨λ¦¬ μ˜μ—­μ΄ μžˆλŠ”λ° ꡳ이 κ°€λΉ„μ§€ 컬렉터가 ν•„μš”ν•œ νž™ μ˜μ—­μ„ μ‚¬μš©ν•˜λŠ” 이유 :

μŠ€νƒμ— μŒ“μΈ 데이터듀은 μžμ‹ μ΄ νƒœμ–΄λ‚¬λ˜ κ³ ν–₯(μ½”λ“œ 블둝)이 μ’…κ²°λ˜λŠ” μ‹œμ μ— ν•¨κ»˜ μ œκ±°λœλ‹€.(μŠ€νƒμ˜ νŠΉμ„±μ΄μž ν•œκ³„)

μ½”λ“œλΈ”λ‘ μ’…κ²° μ‹œμ κ³Ό 상관없이 데이터λ₯Ό μœ μ§€ν•˜κ³  싢을 λ–„,

μ–Έμ œκΉŒμ§€λΌλ„ ν”„λ‘œκ·Έλž˜λ¨Έκ°€ μ›ν•œλ‹€λ©΄ 데이터λ₯Ό 살릴 수 μžˆλŠ” 또 λ‹€λ₯Έ λ©”λͺ¨λ¦¬ μ˜μ—­μ„ CLR이 μ œκ³΅ν•˜λŠ” 것이닀.

 

νž™ μœ„μ— 데이터λ₯Ό μ˜¬λ €λ†“μœΌλ©΄ μ½”λ“œ 블둝 μ’…κ²° μ‹œμ κ³Ό 상관없이 λ°μ΄ν„°λŠ” 생λͺ…을 μœ μ§€ν•œλ‹€.

이 λ°μ΄ν„°λŠ” ν”„λ‘œκ·Έλž˜λ¨Έκ°€ 더 이상 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” μ“°λ ˆκΈ°κ°€ λ˜μ—ˆμ„ λ•Œ κ°€λΉ„μ§€ 컬렉터가 μˆ˜κ±°ν•΄μ„œ 버린닀.(λ©”λͺ¨λ¦¬μ—μ„œ 사라짐)

μ°Έμ‘° ν˜•μ‹μ˜ λ³€μˆ˜λŠ” νž™κ³Ό μŠ€νƒμ„ ν•¨κ»˜ μ΄μš©ν•˜λŠ”λ°,  νž™ μ˜μ—­μ—λŠ” 데이터λ₯Ό μ €μž₯ν•˜κ³  μŠ€νƒ μ˜μ—­μ—λŠ” 데이터가 μ €μž₯된 νž™ λ©”λͺ¨λ¦¬μ˜ μ£Όμ†Œλ₯Ό μ €μž₯ν•œλ‹€. 

데이터λ₯Ό 직접 μ €μž₯ν•˜λŠ” λŒ€μ‹  μ‹€μ œ 데이터가 μ €μž₯된 λ©”λͺ¨λ¦¬μ˜ μ£Όμ†Œλ₯Ό "μ°Έμ‘°"ν•œλ‹€κ³  ν•΄μ„œ "μ°Έμ‘° ν˜•μ‹"

 

 

 

κ°’ ν˜•μ‹μ€ λ³€μˆ˜κ°€ 값을 λ‹΄λŠ” 데이터 ν˜•μ‹μ„ λ§ν•˜κ³ ,

μ°Έμ‘° ν˜•μ‹μ€ λ³€μˆ˜κ°€ κ°’ λŒ€μ‹  값이 μžˆλŠ” 곳의 μœ„μΉ˜(μ°Έμ‘°)λ₯Ό λ‹΄λŠ” 데이터 ν˜•μ‹μ„ λ§ν•œλ‹€. 

 

κ°’ ν˜•μ‹(Value Type)

- λ©”λͺ¨λ¦¬μ— 값을 λ‹΄λŠ” 데이터 ν˜•μ‹

- μŠ€νƒμ— ν• λ‹Ή(즉, μžλ™μœΌλ‘œ 제거됨)

- κΈ°λ³Έ 데이터 ν˜•μ‹κ³Ό ꡬ쑰체가 여기에 ν•΄λ‹Ή

- κ°’ ν˜•μ‹μ˜ λ³€μˆ˜λŠ” λͺ¨λ‘ μŠ€νƒμ— μ €μž₯λœλ‹€.

μ½”λ“œ 블둝 μ•ˆμ—μ„œ μƒμ„±λœ λͺ¨λ“  κ°’ ν˜•μ‹μ˜ λ³€μˆ˜λ“€μ€ ν”„λ‘œκ·Έλž¨ 싀행이 μ€‘κ΄„ν˜Έλ₯Ό λ§Œλ‚˜λ©΄ λ©”λͺ¨λ¦¬μ—μ„œ μ œκ±°λœλ‹€.

{//μ½”λ“œ 블둝 μ‹œμž‘
	int a = 100;
    int b = 200;
    int c = 300;
}//μ½”λ“œ 블둝 끝

μœ„ μ½”λ“œμ— μ„ μ–Έλœ μ„Έ λ³€μˆ˜ a,b,cλŠ” μ°¨λ‘€λŒ€λ‘œ μŠ€νƒμ— μŒ“μ˜€λ‹€κ°€ μ½”λ“œ 블둝이 λλ‚˜λ©΄μ„œ μŠ€νƒμ—μ„œ κ±·ν˜€ μ œκ±°λœλ‹€. 

μ•„λž˜ μΊ‘μ³λŠ” μ•žμ˜ μ½”λ“œκ°€ ν•œ 쀄씩 싀행될 λ•Œλ§ˆλ‹€ μŠ€νƒ λ©”λͺ¨λ¦¬μ— 데이터가 μ μž¬λ˜μ—ˆλ‹€κ°€ κ±·ν˜€λ‚˜κ°€λŠ” 과정을 보여쀀닀. 

a,b,c μˆœμ„œλŒ€λ‘œ μ„ μ–Έμ΄ˆκΈ°ν™” ν–ˆλ‹€λ©΄

c,b,a μˆœμ„œλŒ€λ‘œ κ±·ν˜€λ‚˜κ°„λ‹€. 

μ°Έμ‘°ν˜•μ‹(Reference Type)

- λ©”λͺ¨λ¦¬μ— λ‹€λ₯Έ λ³€μˆ˜μ˜ μ£Όμ†Œλ₯Ό λ‹΄λŠ” λ°μ΄ν„°ν˜•μ‹

- νž™μ— ν• λ‹Ή

(κ°€λΉ„μ§€ μ½œλ ‰ν„°μ— μ˜ν•΄ 제거됨 : νž™μ„ μ°Έμ‘°ν•˜λŠ” λ³€μˆ˜κ°€ 아무 것도 없을 λ•Œ νž™μ— λ‹΄κΈ΄(μ €μž₯된) 데이터λ₯Ό μ“°λ ˆκΈ° μ·¨κΈ‰!)

- 볡합 데이터 ν˜•μ‹

(κΈ°λ³Έ+볡합: λ©μΉ˜κ°€ ν¬λ―€λ‘œ νž™μ— 할당해놓고 μŠ€νƒμ—μ„œλŠ” μ£Όμ†Œλ₯Ό κ°€λ¦¬ν‚€κ²Œ 함)κ³Ό 클래슀 등이 여기에 ν•΄λ‹Ή

 

https://youtu.be/GvUMF_UM8jU

ν•œμ€„ μš”μ•½:

μŠ€νƒμ€ λ³€μˆ˜μ˜ 생λͺ… μ£ΌκΈ°(μ½”λ“œ λΈ”λŸ­)κ°€ λ‹€ ν•˜λ©΄ μžλ™μœΌλ‘œ 데이터λ₯Ό μ œκ±°ν•˜κ³ ,

νž™μ€ 더 이상 데이터λ₯Ό μ°Έμ‘°ν•˜λŠ” 곳이 없을 λ•Œ κ°€λΉ„μ§€ 컬렉터가 데이터λ₯Ό μΉ˜μ›Œμ£ΌλŠ” ꡬ쑰의 λ©”λͺ¨λ¦¬ μ˜μ—­μ΄λ‹€.

728x90