본문 바로가기
[ CODING STUDY ]/》C언어 공부

C언어 14장(배열, 문자열, Array, Null terminated)

by MRG 2020. 5. 4.
728x90
반응형

▣ 안녕하세요^^
저번 시간에 숙제는 해보셨죠??
for 별찍기와 완성한 코딩을 해석해보는 것까지가 숙제였습니다.
많이 어려우셨겠지만 모두 다 해내셨을 거라 생각합니다.
아 그리고 30분이상 고민했는데 정말 안된다
노트에 쓰고해도 안된다고 하시면
정말 많은 좋은 분들에 자료가 있습니다.
코딩을 한번 참고해주시고 그걸 해석하면서 공부하고 
다시 자신만에 코딩으로 만들어보세요.
그래야 실력이 늘어납니다.
다른분들이 만든 코딩에 코드를 외우시면 안 됩니다.!!!



그럼 오늘 배열에 대해서 배워보겠습니다.



▣ 제가 scanf_s 입출력을 했을 때 
잠깐 공부했습니다.
하지만 오늘은 좀 더 깊이 코딩을 진행해보겠습니다. 
먼저 배열이 왜 필요한지 알아보겠습니다.

 

▣ 자 우리가 각각 이렇게 변수를 여러 개 만들어서 값을 저장해야 한다고 생각해보겠습니다.
그럼 이렇게 변수를 만들어서 하나하나 출력을 해야겠죠?
그런데 지금은 쉽지만 나중에 100개 1000개 100000개 등등 변수에 숫자가 많아지면 코드도 너무 많아지고
우리가 나중에 관리하는 것도 너무 어렵습니다.
그래서 배열을 사용합니다.



▣ 배열은 동일한 구조의 자료형을 기억 장치의 연속적인 공간에 여러 개 저장할 수 있는 자료 구조입니다. 
쉽게 이야기하면 우리가 똑같은 변수를 여러 개 만들고 싶을 때 쓰인다고 생각하시면 될꺼같습니다.

 

 

▣ 자 이렇게 배열을 만들어보겠습니다.
변수를 만드는 것과 동일하지만 배열 이름 옆에 괄호[]를 넣고 그 안에 변수를 몇 개 만들지만 넣어주면 됩니다.
그리고 밑에서 배열 한 개씩 값을 대입해서 하나하나 출력해보면 이렇게
결과가 나오게 됩니다.
변수 정의하는 것과 동일합니다.
하지만 배열에 숫자(인덱스)를 하나하나 넣어줘야 합니다.

 

 

▣ 그리고 우리가 변수를 정의하는 것처럼 
배열도 가능합니다. =대입 연산자를 넣고 {} 괄호를 넣어서 배열에 인덱스 수만큼 숫자를 넣어주면 됩니다.
인덱스는 기준 주소로부터 시작한 하나하나 배열에 값들을 이야기합니다.
이건 밑에서 다뤄보겠습니다.



그런데 저 배열에 최고치 숫자를 넘기면 어떻게 될까요?
네 당연히 내가 지정한 메모리에 자료형을 초과하기 때문에 오류가 납니다.
그러니 우리가 지정해서 만든 메모리 수만큼 값을 넣어줘야 합니다.
그럼 코딩이 더 간결해졌죠?

 

 

▣ 배열에 값을 한꺼번에 0으로 초기화하고 싶으면 이렇게 0을 넣어서 초기화를 하셔도 됩니다.
아주 편리하죠?
그럼 여기서 배열 안에 메모리를 한번 살펴보겠습니다.
우리가 변수를 할 때 했던 F9 = break point를 지정해서 확인해보겠습니다.

 


▣ 먼저 코딩을 멈출부분에 커서를 클릭하면 F9를 눌러 중단점을 찍습니다.
그런 다음에 F5를 눌러 디버깅을 시작하면

 

▣ 이렇게 오른쪽에 메모리 창이 나오게 됩니다. 

 

▣ 메모리 창이 안 나오시는 분은 이렇게 디버그에서 창에서 메모리 메뉴를 선택해주시면 됩니다. 
그럼 주소 검색에 aList를 입력해주면 그 메모리 쪽으로 가게 됩니다.
그럼 F10을 눌러서 하나하나 디버깅을 해보면 값이 들어가는 걸 볼 수 있습니다.

 

▣ 그림에서 처럼 이런 구조로 메모에 값을 넣게 됩니다.
변수와 동일하다고 생각하시면 되지만 
배열에서 aList 이름은 주소를 나타냅니다.
변수에서는 어땠죠?
네 그 자체 인스턴스 값을 나타냈습니다.
그래서 printf("% d" 변수 이름) 이렇게 출력하면 바로 값이 나왔죠?
그런데 배열은 다릅니다.

 

▣ scanf를 받아올 때 배열은 주소 자체이기 때문에 변수처럼 & 기호를 붙이지 않고도 코딩이 가능합니다.
그리고 aList [0]으로 출력해야 그 저장한 값이 나옵니다.
왜냐?
위에 그림처럼 배열 이름에 기준 주소는 0번째 인덱스이기 때문입니다.
그럼 아까 이야기한 것처럼 인덱스는 기준 주소를 기준으로 0번째 +1 상대 주소들을 나타내는 고유번호라고 생각하시면 될 거 같습니다.

 

 

 

▣ 자 이렇게 메모리를 확인하면 0번째 주소 안에 있는 배열에 값이 들어가는 걸 확인할 수 있습니다.
그럼 그림에서만 확인하지 말고 직접 주소들을 확인해볼까요?

 

▣ 자 이렇게 메모리 주소를 하나하나 %p 포인터 형식으로 찍어보겠습니다.
그리고 두 번째 있는 건 코드는 배열에 +1을 했습니다.
그림 기준 주소에서 +1 되겠죠?
이것도 어떻게 되는지 확인해봅시다.

 

 

▣ 그럼 이렇게 기준 주소와 0번째 주소가 같다는 걸 알 수 있습니다.
그리고 +1 한 주소와 인덱스 1 주소랑 같다라는 걸 알 수 있습니다.



메모리와 주소를 이야기하니 많이 어렵죠?
하지만 그렇게 생각하실 필요 없습니다.
변수랑 같다고 생각하시면서 배열은 주소로 나타낸다라고만 생각하시면 조금 편하실 겁니다.



▣ 그리고 직접 위에 코드를 실습해보시면서 확인해주세요.
직접 하는 것과 다릅니다.

 

 


▣ 자 그럼 이런 의문이 드실 수 있을 겁니다.
& 이 기호는 주소를 나타내는 기호였죠?
그래서 scanf_s에서도 변수 이름 옆에 &기호를 붙였습니다.



그럼 이렇게 &aList + 1을 하면 어떻게 될까요?
쉽게 이야기하면 그 자료형에 크기만큼 가게 됩니다.
그래서 저렇게 이상하게 주소가 나오게 됩니다.
무슨 말이냐 int는 4byte였죠?
그럼 +1을 하면 4byte만큼 이동하게 됩니다.
정리를 하면
aList는 자료형이 int이죠?
주소에 연산은 * 포인터입니다.
그럼 &aList에 +1은 
int* + 1을 나타내게 됩니다.
그럼 int가 자료형이 4byte니깐
요소자료형 갯수만큼 더해지는걸 의미합니다.
5개에 int니깐 20byte만큼 가라라는 의미가 됩니다.
+2를 하게 되면 int* +2 니깐
40byte만큼 더해지면 저 숫자가 나옵니다.
밑에 오타가 있네요

 


▣ 이렇게 다시 만들어서 확인해보면
이렇게 기준주소부터 +1을 하게되면 +20 
+2를 하게되면 +40이 더해집니다.
기준 주소 기준이 아닌 상대 주소로 이동하게 되는 것입니다.
위에 있는 예제를 꼭 한번 해보시고 확인해보세요.
꼭 입니다.



그런데 많이 어렵죠? ^^;;
제가 괜히 설명한 거 같지만^^
나중에 포인터를 배우시면 이해하실 수 있을 겁니다. ^^



▣ 그래서 이 부분도 직접 한번 코딩만 진행해주세요.

 

 

▣ 자 우리가 scanf_s를 했을 때 배웠던 
문자열 부분도 이렇게 구현을 해보았습니다.



위에 있는 int형으로 배열을 만든 것과 동일합니다.
그냥 char 문자를 하나 저장할 수 있는 자료형으로만 바뀌었을 뿐입니다.



▣ 그럼 이렇게 코딩을 하고 메모리를 확인해보세요.
그럼 char 자료형 하나하나에 문자 하나씩 저장되는 걸 보실 수 있습니다.
이것도 직접 해보셔야 합니다.

 


▣ 우리가 char형으로 배열을 만들고 문자를 하나씩 넣게 되면 이런 식으로 메모리에 저장이 됩니다.
하지만 끝부분에 무언가 있죠?
널 종단 문자열(null terminated string)이라고 합니다.
위키백과에서는 널 종단 문자열(-縱斷文字列, null-terminated string)은 컴퓨터 프로그래밍에서 문자열 및 널 문자('\0', ASCII에서는 NUL)로 끝나는 배열로 저장되는 문자열이다. 그 외에 C 프로그래밍 언어를 가리키는 C 문자열, 그리고 ASCIIZ(참고: C 문자열은 ASCII의 사용을 암시하지 않음)라고도 한다.
C 문자열의 길이는 (처음) NUL 바이트를 검색함으로써 발견된다. 문자열 길이와 관련한 O(n)(선형 시간)의 소요로 인해 속도가 저하될 수 있다. 다시 말해, NUL은 문자열 안에 위치할 수 없음을 뜻하며 NUL은 오직 문자열의 끝을 알리는 목적으로만 사용된다.
라고 나와 있습니다.



▣ 쉽게 이야기하면 컴퓨터가 문자열에 끝을 구분하기 위한 문자열이다 라고 생각해주세요.
그래서 항상 배열을 만들 때에도 \0이 들어갈 공간을 꼭 생각해서 생성해주세요.
이 부분은 너무 중요합니다.
우리가 나중에 문자열을 활용해서 반복에 조건을 만들때에도
문자열 끝 \0을 이용해서 구분합니다.



그럼 또 다른 배열 2차원 배열을 공부해보겠습니다.

 


▣ 자 이렇게 배열에 2차 배열이라는 것도 있습니다.
직접 코딩을 해보고 결과를 보겠습니다.

 

 


▣ 이렇게 결과가 나오는데요.
이건 쉽게 그림으로 표현해보겠습니다.

 

 

▣ 첫 번째 배열을 행 배열이라고 생각해주시고 두 번째 배열을 열 배열이라고 생각해주세요.
그럼 이렇게 10,20,30,40,50,60을 넣었을 때 순서대로 배열에 값에 대입이 되겠죠?
그럼 출력을 했을 때 우리가 행열로 대입을 한 것처럼 출력 결과가 나오게 됩니다.



이걸 활용해서 데이터 값을 정렬하기도 합니다.
3차 4차 이렇게 있기도 하지만 
우리가 2차원 배열까지만 보겠습니다.
이것도 때문에 배열에 쓰는 것조차 두려워하시는 분이 있더라고요.
너무 복잡하게 코딩을 안 하셔도 됩니다.
3차 4차 이렇게 궁금하신 분은 
다른 좋은 강사님들 자료를 보시면 될 거 같습니다.



▣ 우리는 2차원 배열까지 직접 만들어보고 실습해보세요.

 

 

▣ 메모리를 직접 살펴보면 진짜로 행열을 구분해서 저장하는 게 아닙니다.
아까 우리가 만들었던 1차원 배열처럼 메모리에 저장이 됩니다.
이 부분도 꼭 기억해주시고 쉽게
2차원 3차원 배열은 사람이 데이터를 구분하기 쉽게 하기 위해서 만든 것입니다.
컴퓨터가 그렇게 행열을 만들어서 저장하는 게 아닙니다. ^^;;



▣ 자 오늘은 배열에 대해서 배워보았습니다.
주소와 메모리에 대한 부분도 배워서 약간 멘붕이 오셨을 거라 생각합니다. ^^;;



▣ 그러니 꼭 제가 직접 해보세요 하는 부분은 꼭 해보셔야 합니다.
메모리 구조도 꼭 보시면서 중단점 찍어서 확인해주세요.
그래도 모르시겠다면 위에 있는 내용들 다시 꼼꼼하게 읽으시면서 코딩해주시고
더 좋은 강사님과 선생님들 자료를 보시면서 함께 공부해주세요.



▣ 숙제는 배열을 활용하여 최대, 최솟값 그리고 평균, 곱하기 등을 계산하는 프로그램을 만드는 것입니다.
우리가 앞부분에서 조금 해봤지만 배열을 사용하는 것 이기 때문에 조금 다를 겁니다.
조건문과 반복문도 함께 사용하셔야 합니다.
꼭 숙제해주세요.



▣질문 있으시거나 궁금하신 사항 그리고 필요한 코딩들 있으시면  댓글 남겨주세요.



그럼 다음장에 뵙겠습니다.



▣ 포기하지 마세요!!! 저도 했습니다!!! 파이팅!!!

728x90
반응형

댓글