SeoulTech 2011-2 nd 프로그래밍입문 (2) Chapter 5. 배열 박종혁교수 (http://www.parkjonghyuk.net) Tel: 970-6702 Email: jhpark1@snut.ac.kr
Learning Objectives 배열의소개 배열의선언과참조 For 루프와배열 메모리상의배열 함수에서의배열 함수인자로써의배열과리턴값 배열프로그램 부분적으로채워진배열, 검색, 정렬 다차원배열 5-2
배열소개 배열의정의 : 같은데이터형을가지는데이터의집합 첫번째 집합적 데이터형 그룹화 int, float, double, char 들은단순데이터형 아이템의리스트에사용 시험성적, 온도, 이름등 단순한변수의중복된선언을피하기위함 리스트를하나의개체처럼조작이가능 5-3
배열의선언 배열의선언 메모리할당 int score[5]; score 라는이름의 5 개정수형배열선언 5 개의변수를선언하는효과 : int score[0], score[1], score[2], score[3], score[4] 배열의구성요소 : 인덱스 (Index) 또는첨자 (subscript) 변수 배열의요소 (element) 대괄호안의값을인덱스또는첨자라고한다 [0] to [size 1] 5-4
배열에접근하기 인덱스 / 첨자를이용한접근 cout << score[3]; 대괄호의두가지사용법 : 선언부분에서는배열의크기를지정 나머지부분에서는배열의인덱스또는첨자를의미 크기, 첨자는반드시리터럴일필요는없음 int score[max_scores]; score[n+1] = 99; n 이 2 이면, score[3] 5-5
배열의사용 강력한저장매커니즘 다음과같은명령이가능 : i 번째인덱스변수까지이렇게실행하라 여기에서 i 는프로그램에의해계산된다 score 배열의모든요소를출력하라 사용자로부터입력받아 score 배열을채워라 스코어배열에서가장높은값을찾아라 스코어배열에서가장낮은값을찾아라 5-6
디스플레이 5.1 배열을사용한프로그램 (1 of 2) 5-7
디스플레이 5.1 배열을사용한프로그램 (2 of 2) 5-8
배열과 for 루프 자연카운팅루프 배열요소를순회하면서동작 예 : for (idx = 0; idx<5; idx++) { cout << score[idx] << "off by " << max score[idx] << endl; } 루프컨트롤변수 (idx) 는 0 부터 5 까지카운트됨 루프바디부분은 0 에서 4 까지실행된다 5-9
주요배열의함정 배열의인덱스는항상 0 으로시작! 0 은컴퓨터과학자들에게첫번째숫자 배열범위를벗어나는프로그래밍 예측할수없는결과 컴파일러는이러한에러를감지하지못함! 프로그래머가배열범위를벗어나지않게해야한다 5-10
주요배열의함정의예 인덱스의범위는 0 부터 array_size 1 까지 예 : double temperature[24]; // 24는배열의크기 // temperature 라는이름의 24개의 double 형데이터를가지는배열을선언 배열의요소는다음과같음 : temperature[0], temperature[1] temperature[23] 일반적인실수 : temperature[24] = 5; 인덱스 24 는범위를벗어남! 경고없이좋지않은결과를초래한다 실행도중오류발생 5-11
배열의크기를정의된상수로사용 배열의크기에정의 / 명명된상수를항상사용 예 : const int NUMBER_OF_STUDENTS = 5; int score[number_of_students]; 가독성향상 융통성향상 유지보수성향상 5-12
정의된상수의사용 배열의크기가필요할때언제든지사용가능 for 루프에서 : for (idx = 0; idx < NUMBER_OF_STUDENTS; idx++) { // 배열의조작 } 연관된크기의계산 : lastindex = (NUMBER_OF_STUDENTS 1); 함수로배열을넘겨줄때 (later) 크기의변경 프로그램에서한부분만수정하면된다! 5-13
메모리상의배열 (1/2) 단순배열을상기해보면 : 주소 를가지고메모리에할당 배열선언은전체배열을메모리에할당시킴 연속적인할당 주소가연속적으로할당된다는의미 인덱스계산이허용됨 배열시작점 ( 인덱스 0) 으로부터인덱스를증가시킴으로써 5-14
메모리상의배열 (2/2) 5-15
배열의초기화 단순변수들이선언과동시에초기화할수있는것과같이 : int price = 0; // 0은초기값 배열은다음과같이가능 : int children[3] = {2, 12, 1}; 다음과같은의미 : int children[3]; children[0] = 2; children[1] = 12; children[2] = 1; 5-16
배열의자동초기화 배열의크기보다적은수의값이주어진경우 : 처음부터순서대로채워짐 나머지는배열기본형의 0 값으로채워짐 배열의크기가없는경우 초기화값의숫자에따라배열의크기결정 예 : int b[] = {5, 12, 11}; 배열 b 의크기는 3 이된다 5-17
함수에서의배열 함수인자로서의배열 인덱스변수 배열의각각의요소 (element) 는함수의파라미터로사용될수있다 전체배열 모든배열요소는하나의개체로함수로전달될수있다 함수의리턴값으로서의배열 가능하다 chapter 10 5-18
인자로서의인덱스변수 인덱스변수는배열기본형의단순변수처럼취급된다 함수의선언 : void myfunction(double par1); 변수의선언 : int i; double n, a[10]; 다음과같은함수의호출이가능 : myfunction(i); // i는 double형으로변환 myfunction(a[3]); // a[3] 은 double 형 myfunction(n); // n은 double 형 5-19
인덱스변수사용시주의사항 myfunction(a[i]); i 의값이먼저결정 값이결정되고인덱스변수가전달됨 myfunction(a[i*5]); 컴파일러의관점에서는완벽하게정당한호출 프로그래머는배열의범위내에들도록책임져야함 5-20
인자로서의전체배열 전체배열은형식매개변수가될수있다 함수호출에서인자로전달되는것은배열의이름 배열매개변수 라한다 배열의크기도전달해야한다 일반적으로두번째매개변수 단순한 int 형의형식매개변수 5-21
디스플레이 5.3 배열매개변수를가지는함수 5-22
인자로서의전체배열의예 주어진이전의예 : main() 함수의정의에서이함수들이호출되는경우 : int score[5], numberofscores = 5; fillup(score, numberofscores); 첫번째매개변수는전체배열 두번째매개변수는정수형값 배열매개변수에대괄호가없는것에주의! 5-23
인자로서의배열 : 어떻게? 실제로무엇이전달되는가? 배열을 3개의부분으로나누어보면 첫번째인덱스변수의주소 (arrname[0]) 배열의기본형 배열의크기 단지첫번째부분이전달됨! 배열주소의시작부분 call-by-reference 와매우유사 5-24
배열매개변수 익숙하지않은형태 배열매개변수에서대괄호가없음 배열의크기는별도로전달이되어야한다 장점 : 단일함수로어떠한크기의배열도채울수있다! 함수의 재사용 특성을보여주는예시 예 : int score[5], time[10]; fillup(score, 5); fillup(time, 10); 5-25
const 매개변수수정자 상기할것 : 배열매개변수는실제로첫번째요소의주소가전달됨 call-by-reference 와유사 함수는배열의수정이가능하다! 종종필요하지만때로는필요하지않음! 수정으로부터배열내용을보호 배열매개변수앞에 const 수정자를사용 상수배열매개변수 컴파일러에게수정이허가되지않음을알려준다 5-26
배열을리턴하는함수 기본형을리턴하는것과같이배열을리턴하지못함 포인터 의사용이필요하다 chapter 10 에서논의할것임 5-27
자주사용되는유형 배열프로그래밍 부분적으로채워진배열 최대크기가반드시선언되어야한다 정렬 검색 ( 탐색 ) 5-28
부분적으로채워진배열 필요한배열크기의정확한예측은어렵다 가능한가장큰크기로선언되어야한다 배열에서입력된마지막데이터의위치를추적해야한다 추적 (tracking) 에필요한변수가추가되어야한다 int numberused; 배열에서현재요소의숫자를추적 5-29
디스플레이 5.5 부분적으로채워진 배열 (1 of 5) 5-30
디스플레이 5.5 부분적으로채워진 배열 (2 of 5) 5-31
디스플레이 5.5 부분적으로채워진 배열 (3 of 5) 5-32
디스플레이 5.5 부분적으로채워진 배열 (4 of 5) 5-33
디스플레이 5.5 부분적으로채워진 배열 (5 of 5) 5-34
전역상수 vs. 매개변수 상수는일반적으로전역으로선언 main() 함수의윗부분에선언 함수는배열크기상수를매개변수로갖는다 배열크기를의미하는매개변수를전달해줄필요가없을까? 기술적으로는 yes 왜우리는매개변수를사용하는가? 함수는대체로분리된파일에정의된다 함수는다른프로그램에의해재사용될수있다! 5-35
배열탐색 배열의전형적인사용 디스플레이 5.6 5-36
디스플레이 5.6 배열탐색 (1 of 4) 5-37
디스플레이 5.6 배열탐색 (2 of 4) 5-38
디스플레이 5.6 배열탐색 (3 of 4) 5-39
디스플레이 5.6 배열탐색 (4 of 4) 5-40
디스플레이 5.7 선택정렬 선택정렬알고리즘 5-41
디스플레이 5.8 배열정렬 (1 of 4) 5-42
디스플레이 5.8 배열정렬 (2 of 4) 5-43
디스플레이 5.8 배열정렬 (3 of 4) 5-44
디스플레이 5.8 배열정렬 (4 of 4) 5-45
다차원배열 하나이상의인덱스가추가된배열 char page[30][100]; 두개의인덱스 : 배열의배열 표현 : page[0][0], page[0][1],, page[0][99] page[1][0], page[1][1],, page[1][99] page[29][0], page[29][1],, page[29][99] C++ 은어떠한수의인덱스도허용 일반적으로두개이상사용하지않음 5-46
다차원배열매개변수 1 차원배열과유사 1 차원의크기는주어지지않는다 두번째매개변수로서제공됨 2 차원의크기는주어진다 예 : void DisplayPage(const char p[][100], int sizedimension1) { for (int index1=0; index1<sizedimension1; index1++) { for (int index2=0; index2 < 100; index2++) cout << p[index1][index2]; cout << endl; } } 5-47
요약 1 배열은같은형데이터의집합 배열의인덱스변수는다른단순한변수와동일하게사용된다 for- 루프 N 번반복하면서배열을통과 프로그래머는배열의범위를초과하지않게해야한다 배열매개변수는새로운종류 call-by-reference 와유사 5-48
요약 2 배열요소는연속적으로저장 메모리에연속적으로위치 함수에전달될때는단지첫번째배열요소의주소가전달 부분적으로채워진배열 tracking 필요 상수배열매개변수 배열내용의수정을방지 다차원배열 배열의배열을생성 5-49
Q&A 1-50