6. 배열(3-2)
1. 배열의 개념
배열(array)
프로그램 상에서 관련된 자료들이 공통된 성질을 가지고 어떤 규칙에 따라 연속적인 기억 장소의 집합으로 정해진 인덱스의 값들이 사상
(mapping)에 의해 이루어진 것
C 언어에서 배열의 선언 형식
자료형 배열명[첨자1][첨자2] …[첨자 n] ;
예
int score[10]; //과목별 성적을 저장하기 위한 배열 선언
for(i=0; i<10; i++)
sum += score[i]; //과목별 합계 계산
int score[10];
배열명(array name)
score는 배열에 부여된 이름
배열 요소(array element)
score[0], score[1], , score[9]와 같이 배열을 구성하는 요소
첨자(subscript)
[ ] 속의 숫자,
특히 score[i]와 같이 [ ]속에 있는 변수 i를 첨자 변수(subscripted variable)라 한다.
C 언어에서 배열의 첨자는 0(zero)를 포함한 양의 정수값을 가지는 정수형 상수, 기호상수, 변수, 그리고 산술식을 사용하여
나타낼 수 있다. 이때 첨자는 0(zero)에서 부터 시작하여 [배열요소 수 - 1] 사이의 값을 가진다.
리스트(list)란?
자료 원자(atom)들의 논리적, 순서적인 집합으로 인덱스(index)나 포인터(pointer)에 의해 비 순서적으로도 검색할 수 있는 자료구조
예를 들면, 문자 스트링(character string), 배열(array), 디스크(disk)나 테이프(tape) 같은 매체에 저장된 파일(file)도 리스트의 일종
※ 원자(atom) : field라 불리우는 서로 연관된 항목(item)들의 모임
2. 1차원 배열
첨자를 하나만 가진다.
배열 중에 가장 단순한 구조
벡터(vector) 구조라고도 한다.
A[n]을 크기가 n인 1차원 배열이라고 할 때 배열 요소 A[0],
A[1], A[n-1]의 메모리 위치가 효율적으로 결정될 수 있는 표현 방법
크기가 n 인 1차원 배열 A
A[0] A[1] … A[i] … A[n-1]
배열 표현
배열의 범위, 즉 하한값과 상한값을 명시하는 방법
배열명(하한값:상한값)
예를 들어, A(L:U) = {A(i) | i = L, L+1, , U-1, U}
1차원 배열 A의 요소의 개수 = U - L + 1
배열 A에서 인덱스가 i인 요소 A(i)의 주소 = B + (i - L) * k
예제) 1차원 배열 A[10]에서 배열의 시작주소가 100번지이고, 요소의
길이가 2바이트로 되어있는 경우, 임의의 6번째 요소(즉 A[5]의 주소를
계산하라. (단, C언어의 경우 배열의 첫 번째 요소의 첨자는 0로 시작한다.)
A[5]의 위치 = 시작주소 + (i - 0) ×10byte
= 100 + (5 - 0) ×2 = 110번지
3. 2차원 배열
2차원 배열
논리적으로 행과 열을 나타내는 두 개의 첨자로 각각의 배열 요소로 구분된다
행렬(matrix) 구조
2차원 배열을 선언하는 형식
배열명[첨자1][첨자2];
또는
배열명(하한값1 : 상한값1, 하한값2 : 상한값2)
2×3 배열, 즉 A[2][3] 또는 A(0:1, 0:2)인 배열을 논리적으로 표현한 예
기억장소에 저장방법
2차원 배열의 원소 개수
2차원 배열 A(r : m, c : n)라 할 때,
배열 A의 행의 개수 = m - r + 1
배열 A의 열의 개수 = n - c + 1
이므로 배열 A의 총 원소의 개수는 다음과 같다.
배열 A의 총 원소의 개수 = 행의 개수 × 열의 개수
= (m-r+1)×(n-c+1)
행 우선 방법(row-major order)
(예) 2차원 배열 A[2][3]의 경우 행 우선으로 표현하면
A[0][0] A[0][1] A[0][2] A[1][0] A[1][1] A[1][2]
사용되는 언어 : COBOL, PL/1, PASCAL, C 등
행 우선으로 저장되는 2차원 배열 A[m][n]에서 특정 배열 요소
A[i][j]의 주소는 A[0][0]를 시작 주소 α 라 할 때 다음과 같이 계산 할 수 있다.
2차원 배열 A[i][j]의 주소 = 시작주소 + (i - 1) X 열의개수 + (i - j)
= α + (i - 1) + (j - 1)
만약, 2차원 배열 A[m][n]에서 A[0][0]의 주소가 1일 경우
2차원 배열 A[i][j]의 주소 = (i - 1)n + j
C언어의 경우, 2차원 배열 A[m][n]에서 특정 배열 요소 A[i][j]의
주소는 A[0][0]을 시작 주소 α 라 하고 각 요소의 크기를 k 바이트라 할 때
2차원 배열 A[i][j]의 주소 = 시작주소 + (I X 열의개수 + j) X 배열요소의 크기
= α + (i X n + j) X k
열 우선 방법(column-major order)
2차원 배열 A[2][3]의 경우 열 우선으로 표현하면
A[0][0] A[1][0] A[0][1] A[1][1] A[0][2] A[1][2]
사용되는 언어: FORTRAN
열 우선으로 저장되는 2차원 배열 A[m][n]에서 특정 배열 요소
A[i][j]의 주소는 A[0][0]를 시작 주소 α 라 할 때 다음과 같이
계산 할 수 있다.
2차원 배열 A[i][j]의 주소 = 시작주소 + (j - 1) X 행의개수 + (i - 1)
= α + (j - 1)m + (i - 1)
만약, 2차원 배열 A[m][n]에서 A[0][0]의 주소가 1일 경우
2차원 배열 A[i][j]의 주소 = (j - 1)m + i
C언어의 경우, 2차원 배열 A[m][n]에서 특정 배열 요소 A[i][j]의
주소는 A[0][0]을 시작 주소 α 라 하고 각 요소의 크기를 k 바이트라 할 때
2차원 배열 A[i][j]의 주소 = 시작주소 + (j X 행의개수 + i) X 배열요소의 크기
= α + (j X n + i) X k