오늘 배울 것은 배열!
1. 배열
2. 문자열 (드디어 배우네..)
3. 다차원 배열
1. 배열
배열 Array - 같은 자료형의 변수 여러 개를 묶어서 저장하는 문법
우리가 기존처럼 자료형을 선언하면 RAM에 따로따로 저장이 된다.
그러나 배열을 사용하면 RAM에서도 붙어서 저장이 된다.
int형을 3개 묶은 배열을 만들었을 때, 값을 넣어주기 위해선
index를 사용해서 넣어줘야 한다. (index가 없으면 어떤 곳에 넣는지 모를 테니까)
index는 0에서부터 시작하기에
aaa[0], aaa[1], aaa[2] 이렇게 작성해줘야 한다.
(마치 아파트에 가면 모든 대문이 똑같으나, 호수로 구별되는 것처럼 index로 구별해줘야 한다.
여기서 아파트는 배열, 각각의 호수는 index라고 생각하면 편하다,)
즉, 배열은 만들 때만 한 번에 만드는 것이지, 개별로 제어해줘야 한다.
또한 변수처럼 사용이 가능하다. (하나의 변수다.)
그렇다면 배열은 왜 쓸까?
배열을 쓰면 쉽게 많은 수의 변수를 만들 수 있고,
또 많은 수의 변수를 쉽게 다룰 수 있기 때문이다.
그 예가 위의 사진처럼 반복문을 이용해서 배열에 있는 수를 출력하고 싶을 때다.
배열은 우리가 아는 c언어 자료형에서 모두 사용가능하다.
각 배열의 사이즈도 볼 수가 있다.
int는 하나가 4바이트니 3개를 묶어서 12바이트로 나올 것이고
double은 하나가 8바이트니 24바이트
char은 하나가 1바이트니 3바이트로 결과 값이 나오는 것이다.
그럼 배열을 만들었을 때,
변수 값을 초기화하는 방법처럼 한 줄로 처리하는 방법은 없을까?
있다.
{ } 이 괄호를 사용하면 된다.
이때 주의사항이 있다.
이렇게 다음 줄에 통째로 대입을 하는 것은 안된다!
또한 정해놓은 개수보다 많이 입력하면 에러가 난다. (마지막 60에 빨간 줄)
반대로 정해놓은 개수보다 적게 입력하면
초기화하지 않은 나머지 값은 0이 된다.
다시 정리하면, 하나도 초기화하지 않으면 다 쓰레기 값이 들어가고
하나라도 초기화하면 초기화하지 않은 값은 0이 들어간다.
(주의할 점 : 대입이 아닌 초기화다.)
그리고 char형에서는
아스키코드 0에 해당하는 null (비어 있는 값)이 나온다.
사진에 보면 g 밑에 출력되는 값이 안 보인다. 그것이 비어 있는 값이다.
배열간의 대입 역시 index를 꼭 사용해서 해줘야 한다.
이게 많으면 많을수록 귀찮아 보일 수 있지만 우리에겐 반복문이 있으니까^^
배열간의 연산 역시 통으로 하는 것이 아닌 개별적으로 해야 한다.
배열의 값을 scanf_s로 입력받을 때도 index를 사용해서 개별적으로 입력해야 한다.
c언어에만 해당하지만 char형을 입력받을 때 엔터나 스페이스 등도 인식이 된다.
즉 다음 값을 치기 위해서 엔터를 누르면 그게 입력이 되는 것이다.
그럼 어떻게 해야 하나?
그냥 입력할 때 붙여서 입력을 해야 한다고 한다.
그리고 또 c언어에만 해당하지만 처음 배열을 선언할 때 index값을 변수로 사용불가능하다...
배열을 이용한 알고리즘
이 알고리즘이 너무 신선하고, 충격적이었다.
이렇게 간단하게 최댓값을 구할 수 있다니..
어제의 나라면 if문으로 엄청 복잡했을 텐데 말이다...
2. 문자열 저장
문자열은 한 문자 여러 개가 붙어 있는 것을 말한다.
이렇게 코딩을 하면 Hello가 서로 붙어서 저장된다.
그러나 문자열이 길면 얼마나 불편했을까?
그래서 이런 방법이 가능하다.
{ } 를 쓰지 않고 문자열에 한해서 " " (큰 따옴표)를 사용하면 된다.
- 문자열 입력 방법
배열의 주소를 출력하고, 그다음에 배열의 이름으로 출력을 했다.
이렇게 하고 보니 배열의 첫 번째 주소와 배열 이름의 주소는 같은 값을 가지고 있다.
즉
aaa = &aaa[0] 이라는 것이다.
또 %s는 값이 시작하는 시작위치를 요구하는 것이다.
(%d, %c는 값을 요구)
이런 이유는 문자열이 얼마나 입력될지 모르기 때문에
몇 바이트 일지 모르기 때문이다.
그래서 시작 위치를 요구하는 것이다.
그렇다면 왜 뒤에 한문 같이 이상한 것이 나오는 것일까?
바로 시작 위치를 요구해서 그 부분부터 출력했지만
어디까지 출력하라는 것을 지정하지 않았기 때문이다.
그럼 이것은 어떻게 처리해야 할까?
printf("%s \n" "Hello"); 에서
"Hello"부분을 메모리에는 6칸으로 저장이 된다.
Hello 다음에 아스키번호로 0
Null(문자열 끝문자) 값이 들어가는 것이다.
그럼 컴퓨터가 이를 보고
'아 문자열이 끝났구나'라고 생각을 하는 것이다.
그렇기에 글자수보다 1바이트를 더 입력해 줘야
(hello가 5글자인데 +1을 하여 6을 넣어줌)
마지막에 null 값이 들어가서
그 문자열이 끝났다는 것을 넣어줄 수 있다.
그럼 일정 크기의 char형 배열을 입력하고
그 수보다 적은 문자를 입력한다면
null 값은 어떻게 넣으면 될까?
방법은 크게 3가지이다.
0을 넣거나 '\0'을 넣는 방법이 있다. 그러나 이 방법들은 잘 사용하지 않는다.
추천하는 방법은
NULL (꼭 대문자)를 넣는 방법이다.
위의 방법을 통해서 쉽게 입력하고
출력하는 방법을 알아봤다.
그러면
scanf_s를 쓸 때도 쉽게 쓸 수 있지 않을까?
만약 쉽게 사용이 안되면 간단한 입력에도 이렇게 길게 써야 한다.
그러나 %s를 이용해서 사용하면 쉽게 쓸 수 있다.
그러나 여기엔 한 가지 단점이 있는데
스페이스 바와 엔터가 같은 것으로 인식이 된다는 것이다.
즉 Hello World를 입력하면
Hello 까지만 저장이 된다는 것이다.(c언어의 단점)
3. 다차원 배열
왼쪽이 1차원 배열이라면
오른쪽은 2차원 배열이다.
아파트로 따지면 왼쪽은 1층에 5개의 호수가 있는 것이고
오른쪽은 3층짜리 아파트에 층마다 5개의 호수가 있는 상황인 것이다.
이런 방식으로 아파트 자체가 여러 개 있으면 3차원 배열
아파트의 모음인 단지가 여러개 있으면 4차원 배열..
이런 식으로 확장해 나갈 수 있다.
그럼 다차원 배열에 값을 넣어보자.
다차원 배열을 그냥 나열하면 매우 복잡해진다.
우리는 반복문을 배웠으니 반복문을 사용하자.
그럼 출력은 반복문으로 간단히 했는데
값 초기화는 쉽게 할 방법이 없을까?
이렇게 { } 안에 층마다 { }를 써서 입력해 주면 된다.
(단, 층을 구별하기 위한 { }는 모두 생략해도 된다. )
위의 사진처럼 작성하면 눈으로 보기도 쉽고 간편하기까지 하다.
배열을 만들 때 값을 초기화하면 [] 값을 입력하지 않아도 된다.(java는 입력하면 안 된다 함)
다만, 2차원 배열을 할 땐 앞에 것만 생략이 가능하다.
(그러지 않으면 컴퓨터가 예측할 수 없다. 2개씩 3층인지, 3개씩 2층인지, 4개씩 2층인지...)
'# 개발 > C언어' 카테고리의 다른 글
c언어 #8 - 포인터 (국비10일차) (0) | 2023.01.12 |
---|---|
c언어 연습문제 #8 (국비9일차) (0) | 2023.01.11 |
c언어 연습문제 #7 (국비8일차) (0) | 2023.01.10 |
c언어 #6 - 함수(function), 지역,전역,정적변수, 재귀호출 (국비8일차) (0) | 2023.01.10 |
c언어 연습문제 #6 - 응용 (국비7일차) (0) | 2023.01.09 |