배열 : 동일한 자료형이 여러 개일 때 메모리에 연속적으로 저장해 놓고 쪼개서 사용하는 방법
배열의 선언 : int ary[5]; 자료형 배열명[요소개수];
배열의 사용 : 대괄호 속 [ ] 숫자가 몇 번째 배열인지 의미. int ary[5]; 자료형 배열명[배열에서의 위치, 첨자];
배열 초기화 int ary[5] = {1, 2, 3, 4, 5}
널 문자란 : 초기화한 문자의 남는 배열 요소에는 자동으로 0이 채워진다. 이 때 char형 배열에 저장된 0을 널 문자라고 한다.
널 문자의 용도 : 문자열의 끝을 표시.
Chap 8 배열
많은 양의 데이터를 메모리에 저장하는 배열 생성 방법
배열을 사용하는 방법과 배열이 문자열을 저장하는 방법
8-1 배열의 선언과 사용
배열 array : 같은 형태의 많은 데이터를 반복문으로 처리하기 위해 메모리에 연속적으로 저장해 놓고 쪼개서 사용하는 방법
동일한 자료형이 여러 개일 때 배열로 묶어서 처리
배열의 선언
배열 또한 다른 자료형처럼 선언을 통해서 저장 공간을 확보.
int ary[5];
자료형 배열명[요소개수]; 이다.
int형 변수 5개를 하나씩 선언하는 것과 전체 저장 공간의 크기는 같음.
그러나 메모리에 할당되는 방식에 차이가 있음.
변수를 선언하면 각 변수는 독립적인 저장 공간을 가지며 각각의 이름을 사용.
반면에 배열은 저장 공간이 연속으로 할당, 배열명이 전체 공간의 이름이 됨.
배열의 나누어진 조각을 배열 요소라고 하는데, 각각의 배열 요소는 int형 변수와 똑같이 사용함.
배열의 사용
첨자 속 의미
배열 선언할 때 : 배열 요소 전체 개수
사용할 때 : 각 요소가 배열에서 몇 번째에 있는지, 첨자라고 함.
배열 초기화
배열도 변수와 마찬가지로 최초 할당된 저장 공간에 쓰레기 값이 저장되어 있음.
그러므로 배열도 원하는 값을 가지려면 선언과 동시에 초기화해야 함.
1. (기본) 배열은 중괄호 { } 로 묶어 초기화.
int ary[5] = {1, 2, 3, 4, 5};
2. 초깃값이 배열 요소의 개수보다 적은 경우
int ary[5] = {1, 2, 3};
이때는 왼쪽부터 차례로 초기화하고 남은 배열 요소는 모두 0으로 채움.
3. 자동 초기화 기능
int ary[1000] = {0};
4. 배열 요소 개수 생략
int ary [ ] = {1, 2, 3};
이 경우 컴파일러는 초깃값 개수만큼 배열 요소 개수 정하고 저장 공간 할당함.
5. double형 배열과 char 배열 선언하고 초기화
각각의 자료형에 맞게 double형 배열은 실수 값으로 초기화되고, char형 배열은 문자로 초기화.
double ary[5] = {1.0, 2.1, 3.2, 4.3, 5.4};
char ary[5] = {'a', 'p', 'p', 'l', 'e'};
배열의 초기화는 선언 시 최초 한 번만 가능.
그 이후에는 배열 요소에 일일이 값을 대입해야 하며, 초기화 때처럼 중괄호 { } 를 사용한 대입 연산으로 한 번에 값을 바꾸는 것은 불가능.
배열과 반복문
연속된 배열 요소를 일일이 변수처럼 하나씩 떼어서 사용 -> 효율적이지 못함.
sizeof 연산자를 활용한 배열 처리
보통 많은 양의 데이터를 처리하므로 배열을 다룰 때는 반복문 사용이 필수. 배열 요소의 개수가 바뀌면 배열을 처리하는 반복문을 모두 수정해야 하는 부담이 있다.
이 문제의 해결책으로 배열 요소의 개수를 직접 계싼해 반복문에 사용하는 방법이 있다.
배열 요소의 개수 : sizeof(배열명) / sizeof(배열 요소)
이렇게 구한 배열 요소의 개수를 각 반복문의 반복횟수로 사용하면, 나중에 배열 선언문에서 요소의 개수를 바꾸더라도 나머지 코드를 수정할 필요가 없음.
확인 문제
1. 다음 설명에 따라 배열을 선언하세요.
//1번
int ary_1[5];
//2번
double ary_2[10];
//3번
int ary_3[3];
//4번
char ary_4[5]; // 널 종료 문자 \0을 포함하기 때문에 4가 아니라 5
2. 다음 그림과 일치하도록 배열을 선언하고 초기화하세요.
int ary[6] = {1, 2, 3};
3. 다음과 같이 초기화된 A 배열의 값을 복사해 B배열을 채운 후 출력하는 프로그램을 작성하세요.
8-2 문자를 저장하는 배열
char형 배열의 선언과 초기화
저장할 문자열의 길이보다 최소한 하나 이상 크게 배열을 선언해야 함. 널 문자를 저장하기 위해서.
char형 배열은 배열 요소의 형태가 char일 뿐 int형 배열이나 double형 배열과 다르지 않다.
따라서 초기화도 중괄호를 사용해 문자를 차례로 나열해도 됨.
그러나 문자 상수로 초기화하는 방법은 쉽지 않으므로, 문자열 상수로 초가화하는 방법 많이 씀.
널 문자의 용도
널 문자 : char형 배열의 남는 배열 요소에는 자동으로 0이 채워짐.
모든 문자는 아스키 코드 값으로 저장되므로 결국 널 문자는 아스키 코드 값이 0인 문자를 말하며 문자 상수로는 \0
으로 표현됨.
널 문자는 문자열의 끝을 표시하는 용도로 쓰임.
printf함수는 char형 배열에서 널 문자가 나올 때까지만 출력하도록 만들어졌다.
이런 규칙은 문자열을 처리하는 모든 함수에 적용됨.
scanf 함수로 문자열을 입력받을 때도 어김없이 널 문자가 사용됨.
grape 뒤에 널 문자를 추가해 문자열의 끝을 표시해서 grape가 출력된 것.
배열 요소에 문자를 직접 대입하는 경우, 마지막 문자 다음에는 널 문자 대입해야 함.
char형 배열 선언 시 주의할 점
1. 배열의 크기는 최대한 넉넉하게 선언하기
2. 배열 요소의 개수는 최소한 '문자열 길이+1'이어야 함.
문자열 대입
char형 배열이 문자열을 저장하는 변수의 역할을 하므로 초기화된 이후에도 새로운 문자열을 저장할 수 있다.
단, 문자열의 길이가 다를 수 있으므로 일반 변수처럼 대입 연산자를 사용하는 것은 불가능함.
이때는 strcpy 함수를 사용함.
strcpy 함수는 char형 배열에 새로운 문자열을 저장하는 함수.
저장할 문자열의 길이를 파악해 딱 그 길이 만큼 char형 배열에 문자열을 복사함. (널 문자도 자동으로 붙임.)
strcpy(저장된 배열명, 저장할 문자열)
문자열 전용 입출력 함수 : gets, puts
scanf 함수는 char형 배열에 문자열을 입력할 수 있으나 중간에 빈칸이 있는 경우 빈칸 전까지만 입력.
따라서 빈칸을 포함해서 문자열을 입력할 수 있는 새로운 방식이 필요.
get 함수는 빈칸을 포함해 한 줄 전체를 문자열로 입력함.
또한 이 함수와 짝을 이뤄 문자열을 출력하는 puts 함수도 있음.
빈칸을 포함해 문자열을 입력하는 gets 함수
인수로 char형 배열의 배열명 준다.
문자열 입력 중간에 빈칸이나 탭 문자 사용 가능
엔터를 누르기 전까지 전체를 하나의 문자열로 배열에 저장
입력할 배열의 크기를 검사하지 않으므로, 배열의 크기보다 긴 문자열을 입력하면 배열을 벗어난 메모리 영역을 침범할 수 있으므로 주의. ( 이 문제는 scanf 함수, strcpy 함수도 해당되며 컴파일러에 따라 안정성 문제 때문에 컴파일 제한하기도 함.)
gets와 짝을 이뤄 문자열을 출력하는 puts 함수
puts 함수는 문자열 상수나 char형 배열의 배열명을 주면 문자열을 화면에 출력함.
printf 함수와 문자열 출력 기능 같으나 자동으로 줄을 바꿈.
확인 문제
1. 다음 중 char형 배열이 바르게 초기화된 것은 O, 그렇지 않은 것은 X를 표시하세요.
① O : 남는 배열 요소에는 자동으로 널 문자 채워짐.
② O : 문자열의 끝의 널 문자를 포함해 9개의 배열요소 할당됨.
③ X : 널 문자 저장할 공간이 없음.
④ X : 배열 크기 작음. 중괄호 없이 하나의 문자열만 초기화 가능.
2. 다음 중 널 문자의 상수 표현법으로 옳은 것을 고르세요.
A : ④
3. 다음 코드는 2개의 문자열을 입력받아 위치를 바꾼 후에 출력합니다. 빈칸을 채워 프로그램을 완성하세요.