Let's kick it
[혼공C]ch.08 본문
- 아티스트
- ZEROBASEONE (제로베이스원)
- 앨범
- Doctor! Doctor!
- 발매일
- 2025.01.19
5주차 (2/10 ~ 2/16) |
Chapter 08 | 배열의 개념 정리하고 공유하기 | 널 문자의 정의, 용도와 표기법 공유하기 |
목차
- 숙제
- 실행 화면
- 숙제
배열(array) : 같은 형태의 데이터를 반복문으로 처리하기 위해 메모리에 연속적으로 저장해 놓고 쪼개 사용. 배열의 나누어진 조각을 배열 요소(element)라 함.
배열의 선언 : 다른 자료형처럼 선언을 통해서 저장공간 확보. 하나의 이름으로 한꺼번에 확보함. -> 한 번에 변수를 여러 개 선언.
자료형 배열명[요소개수];
변수 | 배열 |
선언하면 각 변수는 독립적인 공간을 가지며 각각의 이름을 사용. | 선언하면 저장공간이 연속으로 할당되어 배열명이 전체 공간의 이름이 됨. |
배열 요소를 선언할 때와 사용할 때 대괄호[] 속의 의미가 다름. 선언할 때는 전체 개수를 표시하고, 사용할 때는 각 요소가 몇 번째에 있는지 의미. 이 값이 첨자(배열에서의 위치)며, 배열의 첨자는 0부터 시작하므로 최대 '배열요소 - 1'까지만 사용 가능. 즉, 배열 요소가 5개면 첨자는 0~4까지만 사용 가능.
배열 요소는 값을 대입하거나 연산할 때 마치 하나의 변수처럼 사용됨.
배열 초기화 : 배열도 원하는 값을 가지려면 선언과 동시에 초기화해야 함. 왜냐면 최초 할당된 저장공간에는 쓰레기 값이 저장되어 있기 때문. 배열은 {} 중괄호로 묶어 초기화.
- 초기값이 배열의 요소 개수보다 적은 경우 남은 요소는 0으로 채워짐.
- 배열에 {0};을 넣어줌으로써 자동으로 배열 요소가 0으로 초기화됨.
- 초기값 넣어주면 배열 요소의 개수를 넣지 않아도 사용 가능함. -> 컴파일러가 초기값의 개수만큼 배열 요소 개수를 정하고 저장공간을 할당함.
- double형 배열은 실수값으로 초기화되고, char형 배열은 문자로 초기화됨.
char형 배열은 주로 문자열을 저장하는 용도로 사용.
ex) double ary[3] = {1.0, 2.1};
double ary[3] = {'a', 'b'};
배열의 초기화는 선언 시 최초 한 번만 가능. 그 이후에는 배열 요소에 일일이 값을 대입해야 하고, 초기화 때처럼 중괄호{}를 사용한 대입 연산으로 한 번에 값을 바꾸는 것은 불가능.
배열과 반복문
: 제어변수를 배열의 첨자를 사용해 반복문을 만든다면 반복과정에서 모든 배열 요소에 값 입력 가능.
sizeof 연산자를 활용한 배열 처리
: 많은 양의 데이터를 처리하는 배열은 반복문 사용이 필수적임. 하지만 배열 요소의 개수가 바뀌면 일일이 수정해야 하는 번거로움이 있음. 이 번거로움을 해결할 수 있는 방법이 sizeof 연산자를 이용해 배열 크기가 바뀌더라도 자연스레 사용이 가능함. 배열 요소의 개수를 각 반복문의 반복 횟수로 사용하면 코드 수정 필요 x.
배열 요소의 개수 구하는 방법 : sizeof(배열명) / sizeof(배열 요소)
sizeof 연산자를 배열명에 사용하면 배열 전체의 크기를 바이트 단위로 계산. 이 값을 배열 요소 하나의 크기로 나누면 배열 요소의 개수를 구할 수 있음.
- 추가 숙제
널문자 :
- 초기화 시 남은 공간은 자동으로 0(널 문자)으로 채워짐.
- 아스키코드 값이 0인 문자를 의미.
- 문자 상수로는 '\0'로 표현.
- 문자열의 끝을 표시하는 역할.
널 문자의 활용
- printf 함수는 널 문자가 나올 때까지만 출력
- scanf 함수는 입력받은 문자열 끝에 자동으로 널 문자를 추가
- 실행화면
선언만 하고 초기화하지 않아서 따로 입력하지 않은 ary[4]의 경우 쓰레기 값이 들어가 있어 쓰레기 값이 출력됨.
그래서 선언과 동시에 초기화해 쓰레기 값이 나오지 않게 만들어 주었음.
제어변수를 사용해 반복문 처리한 경우
sizeof연산자를 이용해 배열 요소의 개수를 계산한 값을 저장한 변수를 따로 두어 그 변수를 이용한 반복문
초기화된 A 배열의 값을 복사해 B 배열을 채운 후 출력하는 프로그램인데
A 배열 첨자가 0~2를 갖도록 나머지 연산자를 사용한다.
ex) i가 0 1 2 3 4 5 6 7 8 9 라면
0 1 2 / 3 4 5 / 6 7 8 / 9 -> 이렇게 3개씩 A배열의 첨자가 0, 1, 2가 반복하여 들어가게 되어
A배열의 값인 1,2,3이 B 배열에 차례대로 반복되며 들어가게 되는 것이다.
8 - 2 문자를 저장하는 배열
char형 배열은 문자들은 메모리에 연속된 공간에 저장할 수 있으므로 주로 문자열 저장에 사용. 알파벳은 1byte로 충분히 표현 가능함
char형 배열은 저장할 문자열의 길이보다 하나 이상 크게 저장해야 함. why? 널 문자(₩0)를 저장할 공간을 비워두기 위함. 널 문자는 문자의 끝을 나타내는 용도로 쓰임.
초기화 방법
1) 문자 상수로 하나씩 초기화 char str[6] = { 'a', 'p', 'p', 'l', 'e'};
2) 문자열 상수로 한 번에 초기화 char str[6] = "apple";
널 문자 : 초기화된 문자는 배열의 처음부터 차례로 저장되어 문자열을 만드는데 남은 공간(=배열요소) 자동으로 0으로 채워짐. 이렇게 배열에 저장된 0을 특별히 널문자라고 부름. 모든 문자는 아스키코드 값으로 저장됨. 결국 널 문자는 아스키코드값이 0인 문자를 말하며 문자 상수로는 ₩0으로 표현. 널 문자는 문자열의 끝을 표시.
printf함수가 배열의크기 상관없이 초기화된 문자열을 정확히 출력하는 이유도 널 문자가 있기 때문. printf함수는 char형 배열에서 널 문자가 나올 때까지만 출력하도록 만들어짐. 이런 규칙은 문자열을 처리하는 모든 함수에 적용.
scanf함수로 문자열을 입력받을 때도 어김없이 널 문자가 사용됨. 사용자가 입력한 문자열 다음에 자동으로 널 문자를 추가해 문자열의 끝을 표시.
char형 배열 선언 시 초기화하면 남는 배열요소는 자동으로 0으로 채워지므로 문자열의 끝에 널문자가 자동 저장되지만, 초기화하지 않은 상태에서 배열 요소에 직접 대입한다면 반드시 마지막 문자 다음에는 널 문자를 대입해야 함.
- char형 배열 선언 시 주의할 점
1. 배열의 크기는 최대한 넉넉히 선언.
-> 문자열의 길이가 일정하지 않은 경우 예상 가능한 가장 긴 문자열도 저장할 수 있도록 넉넉히 선언해야 함.
2. 배열 요소의 개수는 최소한 '문자열의 길이 + 1'.
-> 널 문자로 그 끝을 표시하므로 최소한 널문자까지 저장할 수 있도록 배열 요소 개수를 저장해야 함.
char형 배열이 변수처럼 문자열 저장하는 역할을 하므로 초기화 이후 새로운 문자열 저장 가능하지만, 일반 변수처럼 대입해서 사용하는 것은 불가능. 문자열의 길이가 다를 수 있어서!
그래서 strcpy함수를 사용해 char형 변수에 새로운 문자열을 저장한다.
저장할 문자열의길이를 파악해 딱 그 길이만큼만 char형 변수에 문자열을 복사함. 물론 널문자도 자동으로 추가됨.
string.h 헤더파일은 strcpy 함수와 같은 문자열을 다루는 함수들의 원형을 모아놓은 것.
strcpy함수 사용법 : strcpy(저장될 배열명, 저장할 문자열);
저장될 배열명인 첫번째 인수는 문자열을 모두 저장할 수 있도록 커야 함. 문자열 상수 사용 못 함 왜? 상수는 바뀌지 않는 고정값이니까
배열에 대입 연산자(=)를 사용하지 못하는 이유?
대입 연산자 왼쪽에 사용한 배열명이 컴파일 과정에서 배열이 할당된 메모리 주소값으로 바뀌기 때문.
strcpy함수를 사용가능한 이뉴는 strcpy함수가 메모리 주소값의 위치로 이동해 메모리 공간을 사용하도록 구현되어 있기 때문.
char형 배열에 문자열 대입 : strcpy함수
문자열 전용 입출력 함수 : gets(입력 함수), puts(출력 함수)
scanf함수는 char형 배열에 문자열을 입력할 수 있으나 중간에 빈칸이 있는 경우 빈칸 전까지만 입력함. 그래서 빈칸을 포함해 문자열을 입력할 수 있는 방식이 필요.
gets함수 : 빈칸을 포함해 한 줄 전체를 문자열로 입력.
gets함수 사용법: 인수로 char형 배열의 배열명을 넣어줌. gets(char형 배열명);
gets함수는 문자열 입력 중간에 빈칸이나 탭 문자 사용가능. enter를 누르기 전까지 전체를 하나의 문자열로 배열에 저장. 물론 마지막에 널문자를 붙여 문자열의 끝을 표시함.
주의할 점 : 입력할 때 항상 배열의 크기 고려하기. 입력할 때 배열의 크기를 검사하지 않기 때문에 배열의 크기보다 긴 문자열을 컴파일러에 따라 시스템 안정성 문제 때문에 컴파일 제한하기도 함.
puts함수 : gets함수와 짝을 이뤄 문자열을 출력하는 함수, 문자열 상수나 char형 배열의 배열명을 주면 문자열을 화면에 출력. printf함수의 문자열 출력 기능과 같지만, 문자열 출력 후 자동 줄 바꿈의 차이가 있음. 그래서 문자열 출력 후 바로 이어서 입력하는 것은 불가능.
'c언어' 카테고리의 다른 글
[혼공C]ch.08_도전 실전 예제 문제 (0) | 2025.02.03 |
---|---|
[혼공C]4주차_ch.07 (0) | 2025.02.01 |
[혼공C]3주차_ch.05,06 (0) | 2025.01.20 |
[혼공C]ch.04_도전 실전 예제 (0) | 2025.01.18 |
[혼공C]4-2_코드 실행 화면과 확인 문제 (0) | 2025.01.16 |