Post

[C] λ°°μ—΄

πŸ“Œ λ“€μ–΄κ°€λ©°

Cλ₯Ό λ°°μš°λ‹€ 보면 β€œκ°™μ€ νƒ€μž…μ˜ κ°’ μ—¬λŸ¬ 개λ₯Ό ν•œκΊΌλ²ˆμ— 닀뀄야 ν•˜λŠ”β€ μˆœκ°„μ΄ μ˜¨λ‹€. 학생 5λͺ…μ˜ 점수, μ„Όμ„œ 100개의 μΈ‘μ •κ°’μ²˜λŸΌ. 이걸 λ³€μˆ˜ ν•˜λ‚˜μ— ν•˜λ‚˜μ”© λ‹΄μœΌλ©΄ score1, score2, … score100이 λ˜μ–΄λ²„λ¦°λ‹€. 이 문제λ₯Ό ν•΄κ²°ν•˜λŠ” 도ꡬ가 λ°”λ‘œ λ°°μ—΄(array)이닀.

λ°°μ—΄(array)μ΄λž€? λ™μΌν•œ νƒ€μž…μ˜ 데이터 μ—¬λŸ¬ 개λ₯Ό ν•˜λ‚˜μ˜ μ΄λ¦„μœΌλ‘œ λ¬Άμ–΄ κ΄€λ¦¬ν•˜λŠ” μ§‘ν•© 데이터 ꡬ쑰.

이번 κΈ€μ—μ„œλŠ” λ°°μ—΄μ˜ μ„ μ–ΈΒ·μ΄ˆκΈ°ν™”λΆ€ν„° 크기 계산, λ¬Έμžμ—΄κ³Όμ˜ 관계, 닀차원 λ°°μ—΄κΉŒμ§€ μˆœμ„œλŒ€λ‘œ μ •λ¦¬ν•œλ‹€.


1. λ°°μ—΄μ˜ μ„ μ–Έ

λ°°μ—΄ λ³€μˆ˜λŠ” λ‹€μŒ 두 κ°€μ§€ ν˜•μ‹μœΌλ‘œ μ„ μ–Έν•œλ‹€.

1
2
νƒ€μž… λ°°μ—΄λ³€μˆ˜λͺ…[배열길이];              // 길이만 μ§€μ •
νƒ€μž… λ°°μ—΄λ³€μˆ˜λͺ…[] = { μ΄ˆκΈ°κ°’, ... };    // μ΄ˆκΈ°κ°’ 개수둜 길이 μžλ™ κ²°μ •

μ—¬κΈ°μ„œ λ°˜λ“œμ‹œ κΈ°μ–΅ν•  κ·œμΉ™ ν•˜λ‚˜. λ°°μ—΄ 첨자(index)λŠ” 0λΆ€ν„° μ‹œμž‘ν•œλ‹€. 길이가 5인 배열이라면 μœ νš¨ν•œ μΈλ±μŠ€λŠ” 0 ~ 4λ‹€.

1
2
3
4
5
6
7
int arr[5];

인덱슀:   0        1        2        3        4
        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”
        β”‚ arr[0] β”‚ arr[1] β”‚ arr[2] β”‚ arr[3] β”‚ arr[4] β”‚
        β””β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”˜
          ↑ 첫 번째                          ↑ λ§ˆμ§€λ§‰ (길이-1)

μ‹€μ œλ‘œ 배열을 ν•˜λ‚˜ λ§Œλ“€μ–΄ 보자.

Desktop View

arrμ΄λΌλŠ” μ΄λ¦„μ˜ int νƒ€μž… 배열을 μ›μ†Œ(λ°©) 5개짜리둜 μ„ μ–Έν–ˆλ‹€. 인덱슀 0λΆ€ν„° 4κΉŒμ§€ 각각 1~5의 값을 λ„£μ—ˆλ‹€. 이제 printf("%d", arr[2]);둜 3번째 μ›μ†Œ(arr[2])의 값이 μ œλŒ€λ‘œ λ“€μ–΄κ°”λŠ”μ§€ ν™•μΈν•œλ‹€.

Desktop View

arr[2], 즉 μ„Έ 번째 μ›μ†Œμ˜ 값이 μ •ν™•νžˆ 좜λ ₯됐닀.


2. λ°°μ—΄ μ΄ˆκΈ°ν™”

배열을 μ„ μ–Έλ§Œ ν•˜κ³  μ΄ˆκΈ°ν™”ν•˜μ§€ μ•ŠμœΌλ©΄ μ“°λ ˆκΈ°κ°’(garbage value)이 λ“€μ–΄κ°„λ‹€. λ”°λΌμ„œ μ΄ˆκΈ°ν™”λŠ” μ€‘μš”ν•˜λ‹€. μ΄ˆκΈ°ν™” 방법은 크게 λ„€ κ°€μ§€λ‹€.

λ°©λ²•μ˜ˆμ‹œμ„€λͺ…
β‘  ν•˜λ‚˜μ”© λŒ€μž…arr[0]=1; arr[1]=2; β€¦μ›μ†Œλ§ˆλ‹€ 직접 λŒ€μž…. 길이가 크면 λ²ˆκ±°λ‘œμ›€
β‘‘ μ„ μ–Έκ³Ό λ™μ‹œμ—int arr[3] = {0,1,2};κ°€μž₯ 일반적인 방식
β‘’ 첫 μ›μ†Œλ§Œ μ§€μ •int arr[100] = {0};λ‚˜λ¨Έμ§€ 99κ°œλŠ” μžλ™μœΌλ‘œ 0
β‘£ 길이 μƒλž΅int arr[] = {1,2,3};μ΄ˆκΈ°κ°’ 개수둜 길이(=3) μžλ™ κ²°μ •

πŸ’‘ β‘’λ²ˆμ˜ 포인트: {0}으둜 첫 μ›μ†Œλ§Œ 지정해도 λ‚˜λ¨Έμ§€ μ›μ†ŒλŠ” μ „λΆ€ 0으둜 μ΄ˆκΈ°ν™”λœλ‹€. 이건 첫 값이 ν•˜ν•„ 0μ΄λΌμ„œκ°€ μ•„λ‹ˆλΌ, μ΄ˆκΈ°ν™” λͺ©λ‘μ— ν¬ν•¨λ˜μ§€ μ•Šμ€ μ›μ†ŒλŠ” 무쑰건 0으둜 μ±„μ›Œμ§€κΈ° λ•Œλ¬Έμ΄λ‹€. int arr[100] = {7} 이라 해도 λ‚˜λ¨Έμ§€ 99κ°œλŠ” 7이 μ•„λ‹ˆλΌ 0이 λœλ‹€.


3. λ°°μ—΄μ˜ 크기(size)와 길이(length)

두 κ°œλ…μ€ 이름이 λΉ„μŠ·ν•΄μ„œ ν—·κ°ˆλ¦¬κΈ° μ‰½μ§€λ§Œ μ—„μ—°νžˆ λ‹€λ₯΄λ‹€.

μš©μ–΄μ˜λ―Έμ˜ˆμ‹œ (int arr[3])
크기(size)배열이 μ°¨μ§€ν•˜λŠ” 총 λ°”μ΄νŠΈ4 byte Γ— 3 = 12 byte
길이(length)μ›μ†Œμ˜ 개수3

ν¬κΈ°λŠ” μ›μ†Œ νƒ€μž…μ˜ 크기에 따라 κ²°μ •λœλ‹€. intλŠ” 4byteμ΄λ―€λ‘œ, int νƒ€μž…μ— 길이 4인 배열은 총 4 Γ— 4 = 16 byteκ°€ λœλ‹€.

μ—¬κΈ°μ„œ sizeof() μ—°μ‚°μžκ°€ λ“±μž₯ν•œλ‹€. λ°μ΄ν„°μ˜ 크기λ₯Ό λ°”μ΄νŠΈ(μ •μˆ˜)둜 λŒλ €μ£ΌλŠ” μ—°μ‚°μžλ‹€.

1
2
3
sizeof(int)     // 4
sizeof(char)    // 1
sizeof(double)  // 8

이걸 ν™œμš©ν•˜λ©΄ λ°°μ—΄μ˜ 길이λ₯Ό 직접 계산할 수 μžˆλ‹€.

1
λ°°μ—΄ 길이 = sizeof(배열이름) / sizeof(λ°°μ—΄μ›μ†Œνƒ€μž…);

sizeof(배열이름)은 λ°°μ—΄ 전체 크기(μ›μ†Œνƒ€μž… 크기 Γ— 길이)λ₯Ό λŒλ €μ£Όλ―€λ‘œ, 여기에 μ›μ†Œ ν•˜λ‚˜μ˜ 크기둜 λ‚˜λˆ„λ©΄ 길이만 λ‚¨λŠ”λ‹€.

1
2
3
4
5
6
int arr[3];

sizeof(arr) = 4 Γ— 3 = 12    (전체 크기)
sizeof(int) = 4             (μ›μ†Œ ν•˜λ‚˜μ˜ 크기)
────────────────────────────────
길이 = 12 / 4 = 3  βœ…

⚠️ Cμ—μ„œλŠ” 길이 0짜리 배열은 μ„ μ–Έν•  수 μ—†λ‹€.


4. λ°°μ—΄μ—μ„œ μ΅œλŒ€κ°’Β·μ΅œμ†Œκ°’ κ΅¬ν•˜κΈ°

λ°°μ—΄ ν•˜λ‚˜λ₯Ό λ§Œλ“€μ–΄ μ΅œλŒ€κ°’μ„ ꡬ해 보자.

Desktop View

μƒμˆ˜ MAXλ₯Ό 5둜 μ§€μ •ν•˜κ³  for문으둜 길이 5인 int λ°°μ—΄ arr에 κ°’ 5개λ₯Ό μž…λ ₯ν–ˆλ‹€. κ·Έλ ‡λ‹€λ©΄ 이 μ•ˆμ—μ„œ μ΅œλŒ€κ°’μ€ μ–΄λ–»κ²Œ μ°Ύμ„κΉŒ?

μ›μ†Œκ°€ 5개면 첫 λ²ˆμ§Έμ™€ 두 번째λ₯Ό λΉ„κ΅ν•˜κ³ , κ·Έλ‹€μŒ, κ·Έλ‹€μŒβ€¦ κ²°κ΅­ 4번의 비ꡐ가 ν•„μš”ν•˜λ‹€. μ›μ†Œκ°€ 100개면 99λ²ˆμ„ 비ꡐ해야 ν•˜λ‹ˆ μ†μœΌλ‘œλŠ” λΆˆκ°€λŠ₯ν•˜λ‹€. κ·Έλž˜μ„œ λ°˜λ³΅λ¬Έμ„ μ“΄λ‹€.

Desktop View

λ™μž‘ μ›λ¦¬λŠ” 이렇닀.

1
2
3
4
5
1. max ← arr[0]              (첫 μ›μ†Œλ₯Ό ν›„λ³΄λ‘œ λ„£λŠ”λ‹€)
2. i = 1λΆ€ν„° λ§ˆμ§€λ§‰κΉŒμ§€ 반볡
     if (arr[i] > max)       (더 큰 값을 λ§Œλ‚˜λ©΄)
         max ← arr[i]        (후보λ₯Ό κ°±μ‹ ν•œλ‹€)
3. 반볡이 λλ‚˜λ©΄ max = μ΅œλŒ€κ°’

maxλΌλŠ” λ³€μˆ˜μ— 첫 번째 μ›μ†Œλ₯Ό λ„£κ³ , for문으둜 (iλŠ” 1λΆ€ν„°) 더 큰 값을 λ§Œλ‚  λ•Œλ§ˆλ‹€ maxλ₯Ό κ°±μ‹ ν•œλ‹€. λ§ˆμ§€λ§‰ μ›μ†ŒκΉŒμ§€ 돌면 max에 μ΅œλŒ€κ°’μ΄ λ‚¨λŠ”λ‹€.

Desktop View

πŸ’‘ μ΅œμ†Œκ°’μ€ λΆ€λ“±ν˜Έ λ°©ν–₯만 λ°˜λŒ€(arr[i] < min)둜 λ°”κΎΈλ©΄ κ·ΈλŒ€λ‘œ ꡬ할 수 μžˆλ‹€.


5. λ°°μ—΄κ³Ό λ¬Έμžμ—΄(string)

Cμ—λŠ” λ³„λ„μ˜ λ¬Έμžμ—΄ νƒ€μž…μ΄ μ—†λ‹€. Cμ—μ„œ β€œλ¬Έμžμ—΄β€μ˜ μ •μ²΄λŠ” char[] 배열이닀. μ •ν™•νžˆλŠ” 끝이 '\0'(null 문자)둜 λλ‚˜λŠ” char[] 배열이닀.

null 문자('\0')λŠ” 곡백이 μ•„λ‹ˆλ‹€. 곡백(' ')은 λˆˆμ— 보이지 μ•Šμ„ 뿐 μ—„μ—°ν•œ ν•˜λ‚˜μ˜ λ¬Έμžμ§€λ§Œ, null은 0byte 크기의, λ¬Έμžμ—΄μ˜ 끝을 μ•Œλ¦¬λŠ” ν‘œμ‹μ΄λ‹€.

예λ₯Ό λ“€μ–΄ char str1[20] = "nice";λŠ” 각 μ›μ†Œμ— n, i, c, eκ°€ λ“€μ–΄κ°€κ³ , 5번째 μ›μ†Œ str1[4]μ—λŠ” μžλ™μœΌλ‘œ null λ¬Έμžκ°€ λ“€μ–΄κ°„λ‹€.

1
2
3
4
5
6
7
char str1[20] = "nice";

인덱슀:  0    1    2    3    4     5 ...
       β”Œβ”€β”€β”€β”€β”¬β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€
       β”‚ n  β”‚ i  β”‚ c  β”‚ e  β”‚ \0   β”‚ ...
       └────┴────┴────┴────┴──────┴─────
                            ↑ μ—¬κΈ°μ„œ λ¬Έμžμ—΄ 끝

그런데 μ΄λ ‡κ²Œ ν•˜λ©΄ μ–΄λ–»κ²Œ 될까?

1
char str2[] = {'n','i','c','e'};   // null λ¬Έμžκ°€ μ—†λ‹€!

Desktop View

nice 뒀에 μ΄μƒν•œ λ¬Έμžκ°€ λ”Έλ € λ‚˜μ˜¨λ‹€. μ»΄νŒŒμΌλŸ¬λŠ” null 문자λ₯Ό λ§Œλ‚  λ•ŒκΉŒμ§€ 계속 μ½λŠ”λ°, μœ„ λ°°μ—΄μ—λŠ” 끝에 null이 μ—†μ–΄μ„œ λ©”λͺ¨λ¦¬μ˜ μ—‰λš±ν•œ κ°’κΉŒμ§€ λ¬Έμžμ—΄λ‘œ 읽어버린 것이닀. λ”°λΌμ„œ μ•„λž˜μ²˜λŸΌ null 문자λ₯Ό 직접 λ„£μ–΄μ€˜μ•Ό ν•œλ‹€.

1
char str2[] = {'n','i','c','e','\0'};   // 이제 nice만 좜λ ₯λœλ‹€

6. 닀차원 λ°°μ—΄(n-dimensional array)

닀차원 배열은 λ°°μ—΄ 첨자λ₯Ό μ—¬λŸ¬ 개 μ‚¬μš©ν•œ 것이닀. 첨자 2개λ₯Ό μ“°λ©΄ 2차원 배열이닀.

어디에 μ“ΈκΉŒ? ν•„λ“œκ°€ 2개 이상인 자료λ₯Ό λ‹€λ£° λ•Œ μœ μš©ν•˜λ‹€. 예λ₯Ό λ“€μ–΄ 학생 5λͺ…이 각각 4κ³Όλͺ© μ‹œν—˜μ„ λ΄€κ³  κ·Έ 점수λ₯Ό μ €μž₯ν•  λ•Œ, arr[학생][κ³Όλͺ©] ν˜•νƒœλ‘œ 닀루면 κΉ”λ”ν•˜λ‹€.

선언은 μ΄λ ‡κ²Œ ν•œλ‹€.

1
int arr[4][3];   // 4ν–‰ 3μ—΄ (ν–‰λ ¬λ‘œ 보면 4Γ—3)

μ΄ˆκΈ°ν™”λŠ” 1차원 λ°°μ—΄κ³Ό 원리가 κ°™μ§€λ§Œ, for문을 μ€‘μ²©ν•΄μ„œ μ‚¬μš©ν•œλ‹€.

Desktop View

λ°”κΉ₯ forκ°€ 행을, μ•ˆμͺ½ forκ°€ 열을 λŒλ©΄μ„œ [0][0], [0][1], [0][2], [1][0], … μˆœμ„œλ‘œ 값을 μ±„μš΄λ‹€.

1
2
3
4
5
        μ—΄0   μ—΄1   μ—΄2
ν–‰0   [0][0][0][1][0][2]
ν–‰1   [1][0][1][1][1][2]
ν–‰2   [2][0][2][1][2][2]
ν–‰3   [3][0][3][1][3][2]

첫 μ›μ†Œλ§Œ μ§€μ •ν•˜κ³  λ‚˜λ¨Έμ§€λ₯Ό 0으둜 μ΄ˆκΈ°ν™”ν•˜λŠ” 방법(int arr[4][3] = {0};)도 1차원 λ°°μ—΄κ³Ό λ™μΌν•˜κ²Œ λ™μž‘ν•œλ‹€.


πŸ“ 정리

1
2
3
4
5
6
7
8
λ°°μ—΄(array)
β”œβ”€ μ„ μ–Έ       int arr[5];  λ˜λŠ”  int arr[] = {...};  (μΈλ±μŠ€λŠ” 0λΆ€ν„°)
β”œβ”€ μ΄ˆκΈ°ν™”     β‘  ν•˜λ‚˜μ”©  β‘‘ μ„ μ–Έκ³Ό λ™μ‹œμ—  β‘’ {0}으둜 전체 0  β‘£ 길이 μƒλž΅
β”œβ”€ 크기/길이  size = 총 byte,  length = μ›μ†Œ 개수
β”‚             길이 = sizeof(λ°°μ—΄) / sizeof(μ›μ†Œνƒ€μž…)
β”œβ”€ μ΅œλŒ€/μ΅œμ†Œ  첫 μ›μ†Œλ₯Ό ν›„λ³΄λ‘œ 두고 λ°˜λ³΅ν•˜λ©° κ°±μ‹ 
β”œβ”€ λ¬Έμžμ—΄     char[] λ°°μ—΄ + 끝에 λ°˜λ“œμ‹œ '\0'
└─ 닀차원     arr[ν–‰][μ—΄], μ΄ˆκΈ°ν™”λŠ” 쀑첩 forλ¬Έ
κ°œλ…ν•œ 쀄 μ •μ˜
배열같은 νƒ€μž… 데이터λ₯Ό ν•˜λ‚˜μ˜ μ΄λ¦„μœΌλ‘œ 묢은 μ§‘ν•©
첨자(index)μ›μ†Œμ˜ μœ„μΉ˜. 0λΆ€ν„° μ‹œμž‘
μ“°λ ˆκΈ°κ°’μ΄ˆκΈ°ν™”ν•˜μ§€ μ•Šμ€ μ›μ†Œμ— λ“€μ–΄μžˆλŠ” 의미 μ—†λŠ” κ°’
sizeofλ°μ΄ν„°μ˜ 크기λ₯Ό byte둜 λŒλ €μ£ΌλŠ” μ—°μ‚°μž
null 문자'\0', C λ¬Έμžμ—΄μ˜ 끝을 μ•Œλ¦¬λŠ” ν‘œμ‹
닀차원 λ°°μ—΄μ²¨μžλ₯Ό 2개 이상 μ‚¬μš©ν•œ λ°°μ—΄

μ˜€λŠ˜μ€ 배열에 λŒ€ν•΄μ„œ μ•Œμ•„λ΄€λ‹€. μΈλ±μŠ€κ°€ 0λΆ€ν„° μ‹œμž‘ν•œλ‹€λŠ” 것, 그리고 C λ¬Έμžμ—΄μ€ λ°˜λ“œμ‹œ '\0'으둜 λλ‚˜μ•Ό ν•œλ‹€λŠ” 두 κ°€μ§€λ§Œ ν™•μ‹€νžˆ 작고 κ°€μž!

This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.