개인 곡뢀 과정을 κΈ°λ‘ν•©λ‹ˆλ‹€.

ν˜„μ—…μ—μ„œ 일 ν•˜κ³  CS의 μ€‘μš”μ„±μ„ λŠλΌλ©΄μ„œ 배우게 된 CS의 κΈ°μ΄ˆλ“€.. κ·Έ 쀑 μ˜€λŠ˜μ€ 컴퓨터가 λ³€μˆ˜λ₯Ό μ²˜λ¦¬ν•˜λŠ” 방법에 λŒ€ν•΄ 정리해 λ³Έλ‹€.


πŸš€ What I Will Learn

  1. Cμ–Έμ–΄μ—μ„œ μ‚¬μš©ν•˜λŠ” λ‹€μ–‘ν•œ λ³€μˆ˜λ₯Ό μ²˜λ¦¬ν•˜λŠ” 방법 읡히기
  2. 지역 λ³€μˆ˜, μ „μ—­ λ³€μˆ˜, λ ˆμ§€μŠ€ν„° λ³€μˆ˜ 등에 λŒ€ν•΄ μ΄ν•΄ν•˜κΈ°
  3. νŠΉμ •ν•œ ν•¨μˆ˜μ— 값을 μ „λ‹¬ν•˜κ±°λ‚˜ μ£Όμ†Œλ₯Ό μ „λ‹¬ν•˜λŠ” 방법 μ΄ν•΄ν•˜κΈ°

컴퓨터가 λ³€μˆ˜λ₯Ό μ²˜λ¦¬ν•˜λŠ” 방법

βœ”οΈ ν”„λ‘œκ·Έλž¨ λ©”λͺ¨λ¦¬ μ£Όμ†Œ

  • μ»΄ν“¨ν„°μ—μ„œ ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰λ˜κΈ° μœ„ν•΄μ„œλŠ” ν”„λ‘œκ·Έλž¨μ΄ λ©”λͺ¨λ¦¬μ— 적재(Load)λ˜μ–΄μ•Ό ν•œλ‹€

  • (λ‹Ήμ—°νžˆ) ν”„λ‘œκ·Έλž¨ 크기λ₯Ό μΆ©λ‹Ήν•  수 μžˆμ„ 만큼의 λ©”λͺ¨λ¦¬ 곡간이 μžˆμ–΄μ•Ό ν•œλ‹€

    • ν”νžˆ, μ»΄ν“¨ν„°λ“€μ˜ λ©”λͺ¨λ¦¬ 사양은 8GB, 16GB, 32GB 정도 λ˜λŠ”λ°
    • νŠΉμ •ν•œ ν”„λ‘œκ·Έλž¨μ„ 더블 ν΄λ¦­ν•΄μ„œ μ‹€ν–‰ν•˜λ©΄ κ·Έ ν”„λ‘œκ·Έλž¨μ΄ λ©”λͺ¨λ¦¬μ— μ μž¬λ˜μ–΄ μ‹€ν–‰λœλ‹€
  • 일반적인 μ»΄ν“¨ν„°μ˜ μš΄μ˜μ²΄μ œλŠ” λ©”λͺ¨λ¦¬(RAM) 곡간을 λ„€ κ°€μ§€λ‘œ κ΅¬λΆ„ν•˜μ—¬ κ΄€λ¦¬ν•œλ‹€.

    • μ½”λ“œ μ˜μ—­: μ½”λ“œλ₯Ό ν•œμ€„μ”© μ‹€ν–‰μ‹œν‚€λŠ” μ˜μ—­
    • 데이터 μ˜μ—­: μ „μ—­λ³€μˆ˜ ν˜Ήμ€ μ •μ λ³€μˆ˜λ₯Ό λ‹΄κ³  μžˆλ‹€. ν”„λ‘œκ·Έλž¨μ˜ μ‹œμž‘κ³Ό λ™μ‹œμ— ν• λ‹Ήλ˜κ³ , ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλ˜μ–΄μ•Ό λ©”λͺ¨λ¦¬κ°€ μ†Œλ©Έλ˜λŠ” μ˜μ—­
    • νž™ μ˜μ—­: κ°œλ°œμžκ°€ ν• λ‹Ή/ν•΄μ œν•˜λŠ” λ©”λͺ¨λ¦¬ 곡간이닀. 가비지 컬렉터가 μžλ™μœΌλ‘œ ν•΄μ œν•œλ‹€. 이 곡간에 λ©”λͺ¨λ¦¬ ν• λ‹Ήν•˜λŠ” 것을 동적 ν• λ‹Ή(Dynamic Memory Allocation)이라고도 λΆ€λ₯Έλ‹€.
    • μŠ€νƒ μ˜μ—­: ν”„λ‘œκ·Έλž¨μ΄ μžλ™μœΌλ‘œ μ‚¬μš©ν•˜λŠ” μž„μ‹œ λ©”λͺ¨λ¦¬ μ˜μ—­. ν•¨μˆ˜ 호좜 μ‹œ μƒμ„±λ˜λŠ” 지역 λ³€μˆ˜μ™€ λ§€κ°œλ³€μˆ˜κ°€ μ €μž₯λ˜λŠ” μ˜μ—­μ΄κ³ , ν•¨μˆ˜ 호좜이 μ™„λ£Œλ˜λ©΄ 사라진닀. | μ½”λ“œ μ˜μ—­ | 데이터 μ˜μ—­ | νž™ μ˜μ—­ | μŠ€νƒ μ˜μ—­ | | β€”β€”β€” | ———– | ————– | β€”β€”β€” | | μ†ŒμŠ€ μ½”λ“œ | μ Όμ—­ λ³€μˆ˜ | 동적 ν• λ‹Ή λ³€μˆ˜ | 지역 λ³€μˆ˜ | | | 정적 λ³€μˆ˜ | | 맀개 λ³€μˆ˜ |

참고둜, HEAPκ³Ό STACKμ˜μ—­μ€ 사싀 같은 곡간을 κ³΅μœ ν•œλ‹€. HEAP이 λ©”λͺ¨λ¦¬ μœ„μͺ½ μ£Όμ†ŒλΆ€ν„° ν• λ‹Ήλ˜λ©΄ STACK은 μ•„λž˜μͺ½λΆ€ν„° ν• λ‹Ήλ˜λŠ” 식이닀. κ·Έλž˜μ„œ 각 μ˜μ—­μ΄ μƒλŒ€ 곡간을 μΉ¨λ²”ν•˜λŠ” 일이 λ°œμƒν•  수 μžˆλŠ”λ° 이λ₯Ό 각각 HEAP OVERFLOW, STACK OVERFLOW라고 μΉ­ν•œλ‹€.

Stack μ˜μ—­μ΄ 크면 클 수둝 Heap μ˜μ—­μ΄ μž‘μ•„μ§€κ³ , Heap μ˜μ—­μ΄ 크면 클수둝 Stack μ˜μ—­μ΄ μž‘μ•„μ§„λ‹€.



βœ”οΈ λ³€μˆ˜μ˜ μ’…λ₯˜μ™€ λ©”λͺ¨λ¦¬ ν• λ‹Ή

:: μ „μ—­λ³€μˆ˜(Global Variable)

  • μ „μ—­λ³€μˆ˜λž€ ν”„λ‘œκ·Έλž¨μ˜ μ–΄λ””μ„œλ“  μ ‘κ·Ό κ°€λŠ₯ν•œ λ³€μˆ˜
  • ν”„λ‘œκ·Έλž¨μ˜ μ‹œμž‘κ³Ό λ™μ‹œμ— λ©”λͺ¨λ¦¬μ— ν• λ‹Ήλ˜κ³ 
  • ν”„λ‘œκ·Έλž¨μ˜ 크기가 컀질수둝 μ „μ—­λ³€μˆ˜λ‘œ 인해 ν”„λ‘œκ·Έλž¨μ΄ λ³΅μž‘ν•΄μ§ˆ 수 μžˆλ‹€
  • λ©”λͺ¨λ¦¬μ˜ 데이터(Data) μ˜μ—­μ— μ μž¬λœλ‹€


:: μ§€μ—­λ³€μˆ˜(Local Variable)

  • ν”„λ‘œκ·Έλž¨μ˜ νŠΉμ •ν•œ 블둝(block)/μŠ€μ½”ν”„(scope)μ—μ„œλ§Œ μ ‘κ·Όν•  수 μžˆλŠ” λ³€μˆ˜
  • ν•¨μˆ˜κ°€ 싀행될 λ•Œλ§ˆλ‹€ λ©”λͺ¨λ¦¬μ— ν• λ‹Ήλ˜μ–΄ ν•¨μˆ˜κ°€ μ’…λ£Œλ˜λ©΄ λ©”λͺ¨λ¦¬μ—μ„œ ν•΄μ œλœλ‹€
  • λ©”λͺ¨λ¦¬μ˜ μŠ€νƒ(Stack) μ˜μ—­μ— κΈ°λ‘λœλ‹€


:: μ •μ λ³€μˆ˜(Static Variable)

μ „μ—­λ³€μˆ˜μ™€ μ§€μ—­λ³€μˆ˜μ˜ νŠΉμ§•μ„ λͺ¨λ‘ 가지고 μžˆλ‹€

  • ν”„λ‘œκ·Έλž¨μ˜ νŠΉμ •ν•œ 블둝(block)/μŠ€μ½”ν”„(scope)μ—μ„œλ§Œ μ ‘κ·Όν•  수 μžˆλŠ” λ³€μˆ˜
  • ν”„λ‘œκ·Έλž¨μ΄ 싀행될 λ•Œ λ©”λͺ¨λ¦¬μ— ν• λ‹Ήλ˜μ–΄ ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλ˜λ©΄ λ©”λͺ¨λ¦¬μ—μ„œ ν•΄μ œλœλ‹€
  • λ©”λͺ¨λ¦¬μ˜ 데이터(Data) μ˜μ—­μ— κΈ°λ‘λœλ‹€
#include <stdio.h>

void process() {
	static int a = 5;
    a = a + 1;
    printf("%d\n", a);
}

int main(void) {
	process();   // 6
	process();   // 7
	process();   // 8
	system("pause");
	return 0;
}


:: λ ˆμ§€μŠ€ν„° λ³€μˆ˜(Register Variable)

  • 메인 λ©”λͺ¨λ¦¬ λŒ€μ‹  CPU의 λ ˆμ§€μŠ€ν„°λ₯Ό μ‚¬μš©ν•˜λŠ” λ³€μˆ˜
    • λ©”λͺ¨λ¦¬ λ³΄λ‹€λŠ” λ ˆμ§€μŠ€ν„°κ°€ CPU에 더 가깝기 λ•Œλ¬Έμ— 처리 속도가 λΉ λ₯΄λ‹€
    • 즉, λ ˆμ§€μŠ€ν„° λ³€μˆ˜λ₯Ό μ‚¬μš©ν–ˆμ„ λ•Œ μ†λ„μ μœΌλ‘œ μœ λ¦¬ν•˜λ‹€.
  • λ‹€λ§Œ, λ ˆμ§€μŠ€ν„°λŠ” 맀우 ν•œμ •λ˜μ–΄ μžˆμœΌλ―€λ‘œ μ‹€μ œλ‘œ (항상) λ ˆμ§€μŠ€ν„°μ—μ„œ μ²˜λ¦¬λ μ§€λŠ” μž₯λ‹΄ν• μˆ˜ μ—†λ‹€;;;
#include <stdio.h>

int main(void) {
	register int a = 10, i;
	for (i = 0; i < a; i++) {
		printf("%d\n", a);
	}
	system("pause");
	return 0;
}


:: ν•¨μˆ˜μ˜ 맀개 λ³€μˆ˜κ°€ 처리될 λ•Œ

  • ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•Œ, ν•¨μˆ˜μ— ν•„μš”ν•œ 데이터λ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ 전달
  • 전달 방식은
    1. 값에 μ˜ν•œ 전달 방식과
    2. 참쑰에 μ˜ν•œ 전달 방식이 μžˆλ‹€
      • 값에 μ˜ν•œ 전달 방식은 단지 값을 μ „λ‹¬ν•˜λ―€λ‘œ ν•¨μˆ˜ λ‚΄μ—μ„œ λ³€μˆ˜κ°€ μƒˆλ‘­κ²Œ μƒμ„±λœλ‹€ β†’ λΉ„μœ ν•˜μžλ©΄ μ§€μ—­λ³€μˆ˜μ™€ κ°™λ‹€
      • 참쑰에 μ˜ν•œ 전달 방식은 μ£Όμ†Œλ₯Ό μ „λ‹¬ν•˜λ―€λ‘œ μ›λž˜μ˜ λ³€μˆ˜ μžμ²΄μ— μ ‘κ·Όν•  수 μžˆλ‹€ β†’ λΉ„μœ ν•˜μžλ©΄ μ „μ—­λ³€μˆ˜μ™€ κ°™λ‹€

πŸ“ 값에 μ˜ν•œ 전달 방식(add ν•¨μˆ˜) μ˜ˆμ‹œ

  • add ν•¨μˆ˜λ‘œ 두 개의 값을 λ„£μœΌλ©΄ μƒˆλ‘­κ²Œ 두 λ³€μˆ˜κ°€ λ©”λͺ¨λ¦¬ 내에 ν• λ‹Ήλ˜μ–΄ 처리
  • λ”°λΌμ„œ μ›λž˜ λ³€μˆ˜μ˜ κ°’μ—λŠ” 영ν–₯을 λ―ΈμΉ˜μ§€ λͺ»ν•œλ‹€
#include <stdio.h>

void add(int a, int b) {
	a = a + b;
	// system("pause"); ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ 좜λ ₯ν•œλ‹€λ©΄ 결과값은 17
}

int main(void) {
	int a = 7;
	add(a, 10);
	printf("%d\n", a);  // 값에 μ˜ν•œ 전달 방식을 μ‚¬μš©ν–ˆμœΌλ―€λ‘œ 결과값은 7
	system("pause");
	return 0;
}

πŸ“ 참쑰에 μ˜ν•œ 전달 방식(add ν•¨μˆ˜) μ˜ˆμ‹œ

  • λ§€κ°œλ³€μˆ˜λ‘œ 값을 μ „λ‹¬ν•˜λŠ” 것이 μ•„λ‹Œ, λ³€μˆ˜μ˜ μ£Όμ†Œ 즉, πŸ“Žν¬μΈν„° 값을 전달
  • μ›λž˜ λ³€μˆ˜μ˜ 값에 μ ‘κ·Όν•˜μ—¬ 값을 λ³€κ²½ν•  수 μžˆλ‹€
#include <stdio.h>

void add(int *a) {
	(*a) = (*a) + 10;
}

int main(void) {
	int a = 7;
	add(&a);
	printf("%d\n", a);  // 17
	system("pause");
	return 0;
}



πŸ“Ž 포인터(Pointer)λž€?

ν¬μΈν„°μ˜ κ°œλ…

  • ν¬μΈν„°λŠ” νŠΉμ •ν•œ λ³€μˆ˜ μžμ²΄κ°€ μ‘΄μž¬ν•˜λŠ” λ©”λͺ¨λ¦¬μ˜ μ£Όμ†Œμ˜ 값을 가진닀
    • λ‹¨μˆœνžˆ μ£Όμ†Œκ°’λ§Œ μ €μž₯ν•˜λŠ”κ²Œ μ•„λ‹Œ, μ–΄λ–€ μžλ£Œν˜•μΈμ§€λ„ ν¬ν•¨ν•˜μ—¬ μ €μž₯
  • λ”°λΌμ„œ, κΈ°μ‘΄ aλ₯Ό μ΄μš©ν•΄μ„œλ„ 5λΌλŠ” 값을 찾을 수 μžˆμ§€λ§Œ, 포인터 λ³€μˆ˜μΈ bλ₯Ό μ΄μš©ν•΄μ„œλ„ 5λΌλŠ” 값을 찾을 수 μžˆλ‹€.
이름 μ„€λͺ…
μ£Όμ†Œ μ—°μ‚°μž(&) λ³€μˆ˜ μ•žμ— λΆ™μ–΄μ„œ λ³€μˆ˜μ˜ λ©”λͺ¨λ¦¬ μ‹œμž‘ μ£Όμ†Œ 값을 ꡬ함
포인터(*) 포인터 λ³€μˆ˜λ₯Ό μ„ μ–Έν•  λ•Œ μ‚¬μš©
κ°„μ ‘ μ°Έμ‘° μ—°μ‚°μž(*) μ„ μ–Έλœ 포인터 λ³€μˆ˜κ°€ κ°€λ¦¬ν‚€λŠ” λ³€μˆ˜λ₯Ό ꡬ함


ν¬μΈν„°μ˜ κ°•λ ₯ν•œ κΈ°λŠ₯

  • ν¬μΈν„°λŠ” 컴퓨터 μ‹œμŠ€ν…œμ˜ νŠΉμ •ν•œ λ©”λͺ¨λ¦¬μ— λ°”λ‘œ μ ‘κ·Όν•  수 μžˆλ‹€
  • λ”°λΌμ„œ 기쑴에 μ‘΄μž¬ν•˜λ˜ μ€‘μš”ν•œ λ©”λͺ¨λ¦¬ μ˜μ—­μ— μ ‘κ·Όν•˜μ§€ μ•Šλ„λ‘ ν•΄μ•Ό ν•œλ‹€
  • μ•„λž˜μ˜ μ½”λ“œλŠ” ꡉμž₯히 μœ„ν—˜ν•œ μ½”λ“œ μ˜ˆμ‹œμ΄λ‹€β€¦ 😱😱
int *a = 0x12345678;
*a = 0;
  • 닀쀑 ν¬μΈν„°μ˜ κ°œλ…λ„ μžˆλ‹€. μ˜ˆμ‹œ) ν¬μΈν„°μ˜ 포인터
int *a = 5;
int *b = &a;
int **c = &b;
  • λ°°μ—΄κ³Ό ν¬μΈν„°λŠ” 사싀 λ‚΄λ¬΄μ μœΌλ‘œ 거의 λ™μΌν•˜λ‹€. 배열을 μ„ μ–Έν•œ μ΄ν›„μ—λŠ” κ·Έ 이름 자체λ₯Ό 포인터 λ³€μˆ˜μ²˜λŸΌ μ‚¬μš©ν•  수 μžˆλ‹€.



✨ tl;dr

  • Cμ–Έμ–΄μ—μ„œλŠ” μ „μ—­λ³€μˆ˜, μ§€μ—­λ³€μˆ˜ λ“± λ‹€μ–‘ν•œ μ’…λ₯˜μ˜ λ³€μˆ˜κ°€ μ‚¬μš©λœλ‹€
  • ν•¨μˆ˜μ— 데이터λ₯Ό μ „λ‹¬ν•˜λŠ” 방법은 두 가지가 μžˆλŠ”λ°
    • 값을 μ „λ‹¬ν•˜λŠ” 방법과
    • μ£Όμ†Œλ₯Ό μ „λ‹¬ν•˜λŠ” 방법 이닀
  • ν¬μΈν„°λŠ” νŠΉμ •ν•œ λ³€μˆ˜κ°€ λ©”λͺ¨λ¦¬ 상에 μ‘΄μž¬ν•˜λŠ” μœ„μΉ˜ μ£Όμ†Œλ₯Ό μ €μž₯.
    • νŠΉμ •ν•œ λ©”λͺ¨λ¦¬ μ£Όμ†Œμ— λ°”λ‘œ μ ‘κ·Όν•  수 μžˆμœΌλ―€λ‘œ μ‘°μ‹¬μŠ€λŸ½κ²Œ μ‚¬μš©ν•˜μž!!