Download presentation
Presentation is loading. Please wait.
1
배열, 포인터, 참조 배열은 같은 형을 가지는 변수들의 묶음이다.
2
이 장에서 다룰 내용 배열 1 포인터 2 new와 delete 3 참조 4 5 포인터와 참조의 확장
3
01_배열 배열 배열의 기본형태와 사용 예 변수들의 묶음 Index를 이용해서 접근 가능 배열형 배열명[배열크기];
배열형 배열명[배열크기] = {초기화}; [기본 형태] int Number[3]; int Number[4] = {"ABCD"} ; [사용 예]
4
01_배열 배열의 사용 배열 사용의 기본형태와 사용 예 색인번호(Index)를 이용해서 사용 색인번호는 0 부터 시작
변수의 사용과 크게 다르지 않음 배열 사용의 기본형태와 사용 예 배열명[색인번호] = 값; 변수명 = 배열명[색인번호]; 배열명[색인번호] = 변수명; 배열명[색인번호1] = 배열명[색인번호2]; [기본 형태] Number[1] = 80; Num = Number[1]; Number[1] = Num; Number[10] = Number[20]; [사용 예]
5
01_배열 배열명 ‘배열형’은 변수형처럼 기본적인 형(primitive type)이 올 수도 있고, 구조체나 클래스와 같은사용자 정의형이 올 수도 있다.‘ 배열명’은 변수명과 같은 제약사항이 있으므로 배열명을 정할때에는 제약사항을 고려하여 이름을 붙여야 한다. 배열명 사용 예 적용 비고 Number int Number[10]; ○ int형 변수 10개를 가진 배열이다. Name char Name[8]; char형 변수 8개를 가진 배열이다. LargeNumber double LargeNumber[3] = { 1000, 2000, 3000 }; double형 변수 3개에 각각의 값을 입력한 배열이다. 1stArray char 1stArray × 배열 크기를 정하지 않았다. zeroArray int zeroArray[0]; 크기가 0인 배열은 있을 수 없다.
6
색인번호를 이용해서 3개의 숫자를 차례로 입력한다.
[기본예제 8-1] 배열의 사용 01 #include<iostream.h> 02 03 void main() 04 { 05 06 int Number[3]; 07 08 char MyName[8] = { "ABCDEFG" }; 09 10 Number[0] = 50; 11 Number[1] = 80; 12 Number[2] = 90; 13 14 cout << "Number has 3 numbers : " << Number[0] << ", "; 15 cout << Number[1] << ", " << Number[2] << '\n'; 16 17 cout << "MyName 8 characters : " ; 18 for(int i = 0; i < 8; i++) 19 cout << "MyName[ " << i << " ] = " << MyName[i] << '\n'; 20 21 cout << '\n'; 22 23 if (MyName[7] == '\0') 24 cout << "MyName's 8th character = \\0" << '\n'; 25 } 3개의 int값을 가질 수 있는 배열형 변수 Number를 선언한다. 8개의 문자를 가질 수 있는 배열형 변수 MyName을 선언하고 초기화한다 색인번호를 이용해서 3개의 숫자를 차례로 입력한다. 출력을 통해서 3개의 숫자가 제대로 입력되었는지 확인한다. 마지막 문자를 확인하기 위한 코드다.
7
[기본예제 8-2] 객체 배열의 사용 - 1 01 #include <iostream.h> 02
03 class Unit 04 { 05 06 private: 07 int x; 08 int y; 09 10 public: 11 Unit(int i, int j) 12 { 13 x=i; 14 y=j; 15 }; 16 17 void Print() 18 { 19 cout << x << ", " << y << "\n"; 20 }; 21 }; 배열을 만들 Unit 클래스를 선언한다.
8
[기본예제 8-2] 객체 배열의 사용 - 2 22 23 int main(int argc, char* argv[ ]) 24 {
25 Unit aUnit[2] = { 26 Unit(1,2), 27 Unit(3,4) 28 }; 29 30 for (int i = 0; i < 2; i++) 31 { 32 cout << "aUnit[ " << i << " ] = "; 33 aUnit[i].Print(); 34 } 35 36 return 0; 37 38 } 두 개의 Unit 변수를 가지는 배열형 변수 aUnit을 선언한다.
9
02_포인터 포인터 this 포인터의 기본형태와 사용 예 포인터형* 변수형; 포인터형* 변수명 = 초기화;
포인터는 지정된 메모리 공간을 가리킴 &, * 연산자를 사용 this 동일한 클래스내의 맴버 함수들에 자동으로 전달되는 포인터이자, 호출한 객체를 가리키는 포인터 포인터의 기본형태와 사용 예 포인터형* 변수형; 포인터형* 변수명 = 초기화; [기본 형태] int* number; int* number = NULL; [사용 예]
10
[기본예제 8-4] 포인터형 변수의 사용 01 #include<iostream.h> 02 03 void main()
04 { 05 06 int number = 45; 07 int* pNumber = NULL; 08 09 pNumber = &number; 10 11 cout << "Address of Number = " << pNumber << '\n'; 12 cout << "Value of Number = " << *pNumber << '\n'; 13 } int형 변수를 선언하고, 45의 값을 입력한다. int 포인터형 변수를 선언하고, NULL로 값을 초기화한다. 역참조를 통해 number의 값을 출력한다.
11
[기본예제 8-5] 객체 포인터의 사용 - 1 01 #include <iostream.h> 02
03 class Unit 04 { 05 06 private: 07 int x; 08 int y; 09 10 public: 11 Unit(int i, int j) 12 { 13 x=i; 14 y=j; 15 } 16 17 void Print() 18 { 19 cout << x << ", " << y << "\n"; 20 } 21 22 }; 23 Unit class를 선언한다.
12
[기본예제 8-5] 객체 포인터의 사용 - 2 Unit 포인터형 변수에 배열의 시작 주소를 입력한다
24 int main(int argc, char* argv[ ]) 25 { 26 27 Unit aUnit[2] = { 28 Unit(1,2), 29 Unit(3,4) 30 }; 31 32 int i; 33 34 Unit* pUnit = aUnit; 35 36 cout << "Using '->' operator\n"; 37 for (i=0; i<2; i++) 38 { 39 pUnit->Print(); 40 pUnit++; 41 } 42 43 pUnit = aUnit; 44 45 cout << "Using '.' operator\n"; 46 for (i=0; i<2; i++) 47 { 48 (*pUnit).Print(); 49 pUnit++; 50 } 51 52 return 0; 53 } Unit 포인터형 변수에 배열의 시작 주소를 입력한다 pUnit은 포인터이므로 객체포인터를 참조하기 위해 화살표(->) 연산자를 사용한다. pUnit를 역참조하여, Unit 객체를 얻어 오기 위해 도트(.) 연산자를 사용한다.
13
03_new와 delete 동적 생성 new / delete new / delete 의 기본형태와 사용 예
런타임(runtime)시 그 값이 결정 new / delete 동적으로 메모리를 할당 / 해제 하는데 사용 new / delete 의 기본형태와 사용 예 객체형*객체명 = new 객체형(); 변수형*변수명 = new 변수형[변수 크기]; delete 객체명; delete[ ] 변수명; [기본 형태] Unit* pUnit = new Unit(1,2); int*plnteger = new int[10]; delete Unit; delete[ ] plnteger; [사용 예]
14
[기본예제 8-6] 포인터형 변수의 사용 01 #include <iostream.h> 02
03 int main(int argc, char* argv[ ]) 04 { 05 int *pInteger=NULL; 06 07 pInteger = new int; 08 09 if (!pInteger) 10 { 11 cout << "Allocation Fail...\n"; 12 return -1; 13 } 14 15 *pInteger = 777; 16 cout << "pInteger = " << *pInteger << "\n"; 17 18 delete pInteger; 19 20 return 0; 21 } int형 크기만큼 할당한다. 초기화가 되어 있는지의 여부를 검사한다. pInteger는 포인터형 변수므로 실제값을 입력하기 위해서 역참조한다. new로 할당한 메모리는 다 쓰고 꼭 delete 해줘야 한다.
15
[기본예제 8-7] Unit 객체의 동적 생성 - 1 01 #include <iostream.h> 02
03 class Unit 04 { 05 06 private: 07 int x; 08 int y; 09 10 public: 11 Unit(int x, int y) 12 { 13 this->x=x; 14 this->y=y; 15 } 16 매개변수와 멤버변수를 구분하기 위해 this 포인터를 명시한다.
16
[기본예제 8-7] Unit 객체의 동적 생성 - 2 17 void Print() 18 {
18 { 19 cout << x << ", " << y << "\n"; 20 } 21 22 }; 23 24 int main(int argc, char* argv[ ]) 25 { 26 Unit* pUnit = new Unit(1,2); 27 pUnit->Print(); 28 29 delete pUnit; 30 31 Return 0; 32 } 초기화가 되어 있는지의 여부를 검사한다. Unit 클래스의 생성자를 동적으로 호출한다. 반드시 할당을 해제해줘야 한다.
17
04_참조 참조 사용의 예 참조 연산자 복사하지 않고, 직접 객체를 이용하는 방법
함수에서 직접 매개 변수의 값을 변경해야 할 경우 출력매개변수(out)가 여러 개일 경우 객체의 크기가 커서 객체를 복사하는 것이 비효율적일 경우 참조 연산자 & 연산자 사용
18
[기본예제 8-8] swap() 함수의 사용 - 참조
01 #include <iostream.h> 02 03 void swap(int &x, int &y) 04 { 05 int t; 06 t=x; 07 x=y; 08 y=t; 09 } 10 11 int main(int argc, char* argv[ ]) 12 { 13 int i=4; 14 int j=7; 15 16 cout << "i : " << i << ",\t"; 17 cout << "j : " << j << "\n"; 18 swap(i,j); 19 cout << "i : " << i << ",\t"; 20 cout << "j : " << j << "\n"; 21 return 0; 22 } x와 y, 두 개의 값을 참조 형태로 넘겨 받는다. 복사된 x와 y값이 아닌 실제 main 함수에서 사용하는 변수값을 서로 바꾼다.
19
[응용예제 8-9] swap() 함수의 사용 - 포인터
01 #include <iostream.h> 02 03 void swap(int *x, int *y) 04 { 05 int t; 06 t=*x; 07 *x=*y; 08 [ ⑴ ] 09 } 10 11 int main(int argc, char* argv[ ]) 12 { 13 int i=4; 14 int j=7; 15 16 cout << "i : " << i << ",\t"; 17 cout << "j : " << j << "\n"; 18 swap(i,j); 19 cout << "i : " << i << ",\t"; 20 cout << "j : " << j << "\n"; 21 return 0; 22 } x와 y, 두 개의 값을 복사하지 않고, 그 변수들의 포인터를 넘겨 받는다. 복사된 x와 y값이 아닌 실제 main 함수에서 사용하는 변수값을 서로 바꾼다. *y = t;
20
예제모음_1 포인터형 변수를 이용한 성적 관리 요구사항 실행결과 ① 다음과 같이 학생 10명의 수학 성적이 있다.
a. 학생 번호: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 b. 수학 성적: 90, 88, 85, 55, 47, 92, 87, 30, 89, 55 ② 수학 성적이 가장 높은 학생을 찾아라. ③ 수학 성적은 정수로 한정한다. ④ 정수형 배열을 사용하라. 실행결과
21
예제모음_1 소스 - 1 01 #include<iostream.h> 02
03 int FindMaxNumber(int* argGrade) 04 { 05 int* grade = argGrade; 06 int maxNumber = 0; 07 int maxIndex = 0; 08 09 for(int i = 0; i < 10; i++) 10 { 11 if (*grade > maxNumber) 12 { maxNumber = *grade; maxIndex = i; 15 } 16 grade++; 17 } 18 19 return maxIndex; 20 } 현재 저장하고 있는 성적 중에서 가장 큰 성적을 찾기 위한 함수다. 성적의 개수가 10개므로 배열에서 10개의 값을 참 조한다. 현재 참조하는 포인터가 가리키는 값이 기존의 가장 큰 값보다 크면 그 값을 가장 큰 값으로 정의한다.
22
예제모음_1 소스 - 2 22 void main() 23 { 24 int grade[10] = { 90, 88, 85, 55, 47, 92, 87, 30, 89, 55 }; 25 int maxGradeIndex = 0; 26 27 maxGradeIndex = FindMaxNumber(grade); 28 29 cout << "Best grade = " << grade[maxGradeIndex] << '\n'; 30 cout << "StudentID = " << maxGradeIndex + 1 << '\n'; 31 } 가장 큰 수를 반환하는 함수를 호출
23
예제모음_2 두 개의 숫자를 내림차순으로 정렬 요구사항 실행결과
① 두 개의 숫자를 입력받아, 큰 순서대로 정렬해주는 함수를 작성하라. ② 함수의 정보는 아래와 같다. 함수명: ArrangeDesc 반환형: void 매개변수: 두 개의 int형 변수 ③ 포인트 또는 참조를 활용하라. 실행결과
24
예제모음_2 소스 - 1 01 #include<iostream.h> 02
03 void ArrangeDesc(int* argNum1, int* argNum2) 04 { 05 int temp = 0; 06 07 if (*argNum1 < *argNum2) 08 { 09 temp = *argNum1; 10 *argNum1 = *argNum2; 11 *argNum2 = temp; 12 } 13 } 14 15 void main() 16 { 17 int Number1 = 0; 18 int Number2 = 0; 19 20 cout << "Insert first number : "; 입력 받은 두 개의 숫자를 비교해서 뒤의 숫자가 크면 두 숫자의 순서를 바꾼다.
25
예제모음_2 소스 - 2 21 cin >> Number1; 22
23 cout << "Insert second number : "; 24 cin >> Number2; 25 26 ArrangeDesc(&Number1, &Number2); 27 28 cout << "The result = " << Number1 << " > " << Number2 << '\n'; 29 } 두 개의 숫자 주소를 함수의 인자로 입력한다.
26
요약 배열 배열이란 같은 형의 변수들을 추가, 삭제, 변경하기 쉽도록 하나의 묶음으로 묶어 놓은 것으로서, 다음과 같은 방법으로 선언한다. 배열형 배열명[배열크기]; 배열형 배열명[배열크기] = {초기화}; int Number[3]; int Number[5] = {"ABCD"}; 포인터 일상 생활에서 우리 집과 친구 집을 구분하기 위해서 사용하는 주소와 동일하게 프로그램에서도 주소라는 개념을 사용하는데, 이 주소를 포인터라고 생각하면 이해하기 쉽다. 그리고 포인터는 배열과 더불어 매우 강력하고 유용한 도구다. 포인터는 다음과 같이 정의한다. 포인터형* 변수형; 포인터형* 변수명 = 초기화; int* number; int* number = NULL;
27
IT CookBook for Beginner, C++ 기초 8장 끝
Thank You ! IT CookBook for Beginner, C++ 기초 8장 끝
Similar presentations