본문 바로가기

여러가지

기말고사 대비 프기실 3강. Array

우리 학교 학생의 토플 점수를 기록하는 프로그램을 만들어 봅시다.


저번에 배운 스트럭쳐로는 힘들겠죠. 한 사람당 많은 정보를 저장하는게 아니니까.


어레이 라는 개념이 있습니다.


int a[20];


라고 하면 a[0],a[1],a[2],a[3]......., a[19] 이렇게 20개가 생성이 됩니다.


왜 처음 쓸때는 a[20] 이라 쓰면서 괜히 a[0]부터 시작해서 a[19]로 끝나느냐...


그것은 포인터와 관계가 있습니다. 그냥 그렇게 생긴다는걸 이해해야 합니다.


어레이는 숫자를 넣으면 넣는만큼 원하는 변수가 생겨서 아주 편리하죠.


활용방법은 그냥 똑같이 사용하면 됩니다.


int a[20];

a[2] = 3;

printf ("%d",a[2]);


이렇게 하면 a[2]에 3이 저장이 되겠죠.


더 쉽게 값을 주는 방법은


int a[5] = {4,5,6,7,8};


이렇게 주면 0부터 차례로 4,5,6,7,8이 들어가게 됩니다.


단, 주의 할점은 이렇게 쓰는건 처음에 정의 할때 뿐입니다.


int a[5];

a[5] = {4,5,6,7,8};


이나


int a[5];

a = {4,5,6,7,8};


은 에러를 냅니다.


또 하나더 편리한게 있는데


a[] = {1,2,3,4,5};


이렇게 쓰면 a[]는 알아서 a[5]라고 인식 됩니다.




이 강의 에서 배울것은


1. 펑션과 어레이

2. 스트럭쳐와 어레이

3. 다차원 어레이

4. 스트링


이렇게 4가지나 있습니다. 하지만 간단히 설명해 드리겠습니다.


1. 펑션과 어레이


어레이를 펑션에 넣는것은 그냥 변수들과 다를게 없습니다.


#include <stdio.h>


int add (int a)

{

return a+3;

}

int main()

{

int a[20];

a[2] = 3;

printf ("%d",add(a[2]));

return 0;

}


이렇게 말이죠.


하지만, 하나의 값을 넘겨주지 않고 어레이 전체를 넘겨주면 더 편하지 않을까요?


어레이 전체를 넘겨주러면 괄호를 생략하면 됩니다.


a[20]을 만들었다면 a라고 쓰는거죠.


add(a);


그런데 이때 중요한게 있습니다. 아직까지는 생각없이 함수를 썼습니다.


하지만 이제 깊이 알 필요가 있습니다.


 int i = 1;

add(i);


위 코드에서 i의 값을 함수에게 넘겨주는데 i를 직접 넘겨주는것이 아니라 i의 값을 복사해서 줍니다.


그래서 함수에서 아무리 달라져도 메인 에서는 아무 변화가 없죠.


하지만 a[20]에서의 add(a);는 그 어레이의 주소값을 복사해서 줍니다.


add(a);의 a는 어레이의 시작주소라는거죠. add(a[1]); 이렇게 주면 이건 주소가 아니지만요.


그래서 펑션에서 값을 바꾸면 실제 값도 바뀌게 됩니다.


쉽게 설명을 하자면 펑션은 책을 빌려주는 겁니다.


보통은 한페이지만 보자길래 그 페이지만 복사해서 주는겁니다.


하지만 책 전체를 요구하면 다 복사해서 주기는 뭐하니 그 책이 어디있는지 알려주는겁니다.


그러면 알려준데로 가서 그 책 자체를 가져가게 되죠.


이제 좀 이해가 됬을거라 생각을 합니다.


그럼 주소값을 받는 함수를 만들어 봅시다.


하나의 값이 아니라 주소를 받는것이기에 쓰는 방법이 살짝 다릅니다.


void add (int arr[20])

{

arr[0] += 1;

}

int main()

{

int a[20];

a[0] = 3;

add (a);

printf ("%d",a[0]);


return 0;

}


void add (int arr[20]) 라고 썼죠. 처음 어레이를 만들때 a[10]이라 했으면


[10]으로 받아야하는 식으로 뒤에 숫자가 바뀝니다. 왜 int arr[20]을 적느냐...


그냥 그렇게 적습니다. 이건 그냥 외우세요.


저 위의 코드를 실행시켜서 확인해보면 실제 a[0]값이 바뀐걸 알 수 있습니다.


value 가 아니라 reference 를 준거죠. (영어식 표현)


이 부분은 시험에 꼭 나올겁니다. 틀리지 마세요.



2. 스트럭쳐와 어레이


사실 어레이를 제대로 이해하고 있다면 굳이 설명할 필요가 없으나,


사람은 한번 듣고 이해할 수 없기에 스트럭쳐에 관해서 얘기해 보겠습니다.


 struct person

{

int age;

int height;

char initial[3];

};


int main()

{

person skku[20];

skku[0].initial[0] = 'a';

return 0;

}


그냥 이런식으로 어레이를 가진 스트럭트를 만들 수 있죠. 당연히 이해할겁니다.



3. 다차원 어레이


어레이안에 또 어레이를 만들어 봅시다. 예를 들어


arr[4][15] 이렇게 만들면



이렇게 4개 짜리가 15개 만들어지는 걸까요 아님



15개 짜리가 4개 만들어 지는 걸까요.


정답은 15개 짜리가 4개 만들어 지는 겁니다. 2번째 그림처럼요.


이렇게 다차원 어레이를 만들고 값을 줄때는


int a[][2] = {{1,2},{3,4},{5,6}};


이런식으로 줄 수 있습니다. 


a[][] 이렇게 주면 에러가 납니다. 그래서 a[][2]로 쓴거죠.


이런식으로 3차원, 4차원 까지도 만들 수 있으나 솔직히 2차원도 다루기 벅찹니다.



4. 스트링


프로그램을 짜면서 char하나에 한 영어 글자 밖에 못넣는다는것을 알았습니다.


하지만 어레이를 사용하면 단어, 문장을 넣을 수 있죠.


넉넉하게 100개 만들어 봅시다.


char name[100];


그리고 단어를 입력받아 봅시다.


scanf ("%s",name);


하나의 문자가 아닌걸 쓰거나 받을 때에는 %s를 사용합니다.


name 앞에 &가 없네요? 위에서 말했듯이 name자체가 주소이기 때문입니다.


그냥 단어를 쓰고 싶을 경우에는


char name[100] = "Waldo";

char irum[] = "Kimminsung";


이렇게 쓰면 됩니다. int 에서의 { }와 헷갈리지 마세요.


여기서 잠깐, 분명히 정의만 된 (선언만 된) 변수는 쓰레기 값을 가진다고 했습니다.


char name[100] = "Waldo";

printf ("%s",name);


으로 출력 할때 Waldo뒤에 쓰레기 값이 계속 출력될 수 있습니다. 크기가 100이니 100개 출력되겠죠.


하지만 그것을 방지하기 위해 '\0' 이 마지막 문자 뒤에 붙습니다. \0은 a와 같이 하나의


문자라고 생각해 주세요. 이걸로 문장이 끝났는지 알 수 있습니다. 우연으로 쓰레기 값이 \0라면


또 모를까 말입니다만...


그래서 Waldo는 5문자지만 \0까지 합쳐서 6개가 됩니다.


따라서 char name[] = "Waldo"; 의 name은 6개의 값을 가진다는거죠.


char name[6] = "Waldo"; 랑 같습니다.


하나하나 값을 주자면


char name[6] = {'W','a','l','d','o','\0'};


라는 거죠.


스트링은 자주 쓰이다 보니 라이브러리가 아예 따로 있습니다.


#include <string.h> 로 쓸 수 있죠.


자주 쓰이는건

char a[20] = "abc";

char b[30] = "bcd";

strcpy (a,b); // b를 a로 복사

strcat (a,b); // b를 a뒤에 붙임

int i = strlen (a); // a의 크기 (3) 를 줌

if (strcmp(a,b) == 0) // a와 b가 같으면 0값을 출력

printf ("same");


이렇게 4가지 입니다.


도전 연습문제


sort를 해봅시다. int arr[9] = {5,4,3,7,1,2,6,9,8}; 를 순서대로 배열시키는 프로그램을 짜 봅시다