c언어 #7 - 배열, 문자열 (국비9일차)

오늘 배울 것은 배열!

1. 배열 
2. 문자열 (드디어 배우네..)
3. 다차원 배열

 

 

1. 배열

배열 Array - 같은 자료형의 변수 여러 개를 묶어서 저장하는 문법

 

 

 우리가 기존처럼 자료형을 선언하면 RAM에 따로따로 저장이 된다.

그러나 배열을 사용하면 RAM에서도 붙어서 저장이 된다.

etc-image-0

 

 

etc-image-1
배열 index

int형을 3개 묶은 배열을 만들었을 때, 값을 넣어주기 위해선

index를 사용해서 넣어줘야 한다. (index가 없으면 어떤 곳에 넣는지 모를 테니까)

index는 0에서부터 시작하기에

aaa[0], aaa[1], aaa[2] 이렇게 작성해줘야 한다.

(마치 아파트에 가면 모든 대문이 똑같으나, 호수로 구별되는 것처럼 index로 구별해줘야 한다.
여기서 아파트는 배열, 각각의 호수는 index라고 생각하면 편하다,)

 

 

즉, 배열은 만들 때만 한 번에 만드는 것이지, 개별로 제어해줘야 한다.

 

etc-image-2

 

또한 변수처럼 사용이 가능하다. (하나의 변수다.)

 

그렇다면 배열은 왜 쓸까?

etc-image-3

배열을 쓰면 쉽게 많은 수의 변수를 만들 수 있고,

또 많은 수의 변수를 쉽게 다룰 수 있기 때문이다.

 

그 예가 위의 사진처럼 반복문을 이용해서 배열에 있는 수를 출력하고 싶을 때다.

 

etc-image-4

배열은 우리가 아는 c언어 자료형에서 모두 사용가능하다.

 

etc-image-5
배열의 사이즈 보기

각 배열의 사이즈도 볼 수가 있다.

int는 하나가 4바이트니 3개를 묶어서 12바이트로 나올 것이고
double은 하나가 8바이트니 24바이트
char은 하나가 1바이트니 3바이트로 결과 값이 나오는 것이다.

 

그럼 배열을 만들었을 때,

변수 값을 초기화하는 방법처럼 한 줄로 처리하는 방법은 없을까?

etc-image-6
배열의 초기화

 

있다. 

{ } 이 괄호를 사용하면 된다.

 

이때 주의사항이 있다.

etc-image-7

 

이렇게 다음 줄에 통째로 대입을 하는 것은 안된다!

 

etc-image-8

또한 정해놓은 개수보다 많이 입력하면 에러가 난다. (마지막 60에 빨간 줄)

 

etc-image-9

반대로 정해놓은 개수보다 적게 입력하면

초기화하지 않은 나머지 값은 0이 된다.

 

다시 정리하면, 하나도 초기화하지 않으면 다 쓰레기 값이 들어가고

하나라도 초기화하면 초기화하지 않은 값은 0이 들어간다. 

(주의할 점 : 대입이 아닌 초기화다.)

etc-image-10

그리고 char형에서는 

아스키코드 0에 해당하는 null (비어 있는 값)이 나온다.

사진에 보면 g 밑에 출력되는 값이 안 보인다. 그것이 비어 있는 값이다.

 

etc-image-11

 

배열간의 대입 역시 index를 꼭 사용해서 해줘야 한다.

이게 많으면 많을수록 귀찮아 보일 수 있지만 우리에겐 반복문이 있으니까^^

 

etc-image-12

배열간의 연산 역시 통으로 하는 것이 아닌 개별적으로 해야 한다.

 

etc-image-13
배열 요소 입력받기

 

배열의 값을 scanf_s로 입력받을 때도 index를 사용해서 개별적으로 입력해야 한다.

 

etc-image-14

c언어에만 해당하지만 char형을 입력받을 때 엔터나 스페이스 등도 인식이 된다.

즉 다음 값을 치기 위해서 엔터를 누르면 그게 입력이 되는 것이다.

그럼 어떻게 해야 하나?

그냥 입력할 때 붙여서 입력을 해야 한다고 한다.

etc-image-15
char형 배열 입력시..

그리고 또 c언어에만 해당하지만 처음 배열을 선언할 때 index값을 변수로 사용불가능하다...

etc-image-16
c언어에선 불가능..

 

 


배열을 이용한 알고리즘

etc-image-17
배열에서 최대값 구하기

 

이 알고리즘이 너무 신선하고, 충격적이었다.

이렇게 간단하게 최댓값을 구할 수 있다니..

어제의 나라면 if문으로 엄청 복잡했을 텐데 말이다...

 

etc-image-18
배열 요소 모든 값 덧셈

 


 

2. 문자열 저장

 

 문자열은 한 문자 여러 개가 붙어 있는 것을 말한다.

etc-image-19
문자열 저장

 

이렇게 코딩을 하면 Hello가 서로 붙어서 저장된다.

그러나 문자열이 길면 얼마나 불편했을까?

 

etc-image-20

그래서 이런 방법이 가능하다.

{ } 를 쓰지 않고 문자열에 한해서 " " (큰 따옴표)를 사용하면 된다.

 

 

- 문자열 입력 방법

etc-image-21
배열 이름 = 배열 시작 주소

 

배열의 주소를 출력하고, 그다음에 배열의 이름으로 출력을 했다.

이렇게 하고 보니 배열의 첫 번째 주소와 배열 이름의 주소는 같은 값을 가지고 있다.

 

etc-image-22

즉 

aaa = &aaa[0] 이라는 것이다.

또 %s는 값이 시작하는 시작위치를 요구하는 것이다.

(%d, %c는 값을 요구)

 

이런 이유는 문자열이 얼마나 입력될지 모르기 때문에

몇 바이트 일지 모르기 때문이다.

그래서 시작 위치를 요구하는 것이다.

 

그렇다면 왜 뒤에 한문 같이 이상한 것이 나오는 것일까?

바로 시작 위치를 요구해서 그 부분부터 출력했지만

어디까지 출력하라는 것을 지정하지 않았기 때문이다.

 

 

 

그럼 이것은 어떻게 처리해야 할까?

printf("%s \n" "Hello"); 에서

"Hello"부분을 메모리에는 6칸으로 저장이 된다.

Hello 다음에 아스키번호로 0

Null(문자열 끝문자) 값이 들어가는 것이다.

그럼 컴퓨터가 이를 보고 

'아 문자열이 끝났구나'라고 생각을 하는 것이다.

 

etc-image-23
글자수보다 1바이트 더하기

그렇기에 글자수보다 1바이트를 더 입력해 줘야
(hello가 5글자인데 +1을 하여 6을 넣어줌)

마지막에 null 값이 들어가서

그 문자열이 끝났다는 것을 넣어줄 수 있다. 

 

 

그럼 일정 크기의 char형 배열을 입력하고

그 수보다 적은 문자를 입력한다면 

null 값은 어떻게 넣으면 될까?

etc-image-24
배열에 NULL 값 넣기

방법은 크게 3가지이다.

0을 넣거나 '\0'을 넣는 방법이 있다. 그러나 이 방법들은 잘 사용하지 않는다.

추천하는 방법은

NULL (꼭 대문자)를 넣는 방법이다.

 

 

위의 방법을 통해서 쉽게 입력하고

출력하는 방법을 알아봤다.

 

그러면 

scanf_s를 쓸 때도 쉽게 쓸 수 있지 않을까?

etc-image-25

만약 쉽게 사용이 안되면 간단한 입력에도 이렇게 길게 써야 한다.

 

etc-image-26

그러나 %s를 이용해서 사용하면 쉽게 쓸 수 있다.

 

그러나 여기엔 한 가지 단점이 있는데

스페이스 바와 엔터가 같은 것으로 인식이 된다는 것이다.

즉 Hello World를 입력하면

Hello 까지만 저장이 된다는 것이다.(c언어의 단점)

 

 

3. 다차원 배열

 

etc-image-27

왼쪽이 1차원 배열이라면

오른쪽은 2차원 배열이다.

 

아파트로 따지면 왼쪽은 1층에 5개의 호수가 있는 것이고

오른쪽은 3층짜리 아파트에 층마다 5개의 호수가 있는 상황인 것이다.

 

이런 방식으로 아파트 자체가 여러 개 있으면 3차원 배열

아파트의 모음인 단지가 여러개 있으면 4차원 배열..

이런 식으로 확장해 나갈 수 있다.

 

그럼 다차원 배열에 값을 넣어보자.

etc-image-28

다차원 배열을 그냥 나열하면 매우 복잡해진다.

우리는 반복문을 배웠으니 반복문을 사용하자.

 

etc-image-29

 

그럼 출력은 반복문으로 간단히 했는데

값 초기화는 쉽게 할 방법이 없을까?

 

etc-image-30
다차원 배열 값 초기화

 

이렇게 { } 안에 층마다 { }를 써서 입력해 주면 된다.
(단, 층을 구별하기 위한 { }는 모두 생략해도 된다. )

위의 사진처럼 작성하면 눈으로 보기도 쉽고 간편하기까지 하다.

 

etc-image-31

배열을 만들 때 값을 초기화하면 [] 값을 입력하지 않아도 된다.(java는 입력하면 안 된다 함)

 

etc-image-32

다만, 2차원 배열을 할 땐 앞에 것만 생략이 가능하다.
(그러지 않으면 컴퓨터가 예측할 수 없다. 2개씩 3층인지, 3개씩 2층인지, 4개씩 2층인지...)