2021. 1. 29. 21:25ㆍ컴퓨터과학/cs50
이번 강의에서 살펴 볼 것은 다음과 같습니다!
우리가 특정 자료형의 변수를 선언하면 이는 메모리상 어딘가에 특정 크기만큼의 자리를 차지하게 됩니다. 만약 비슷한 종류의 값을 모아서 저장하고 싶다면 어떻게 해야 할까요? 메모리상에서 여러 값을 연이어서 저장하고 사용하는 방법과 그 이점을 알아보겠습니다.
메모리
C에는 아래와 같은 여러 자료형이 있고, 각각의 자료형은 서로 다른 크기의 메모리를 차지합니다.
- bool: 불리언, 1바이트 --> 8bit
- char: 문자, 1바이트
- int: 정수, 4바이트 --> 32bit
- float: 실수, 4바이트
- long: (더 큰) 정수, 8바이트 --> 64bit
- double: (더 큰) 실수, 8바이트
- string: 문자열, ?바이트
컴퓨터 메모리에 있는 모든 변수들은 위와 같은 자료형을 가지고 있다.
아래의 그림은 RAM이다. 컴퓨터나 스마트폰의 하드 드라이브를 구성하고 있다.
오른쪽에 검은 칩들은 일정 크기의 바이트를 의미한다.
대부분 크지 않지만, 만약 메모리가 1GB이라면 10억 바이트가 될 거고, 요즘 더 큰 것도 많다!
컴퓨터나 스마트폰에 있는 이 검은 칩은 컴퓨터든 노트북이든 스마트폰이든 상관없이 소프트웨어 구동 시에 정보가 저장되는 곳이다!
노랑색으로 동그라미 친 부분인 칩을 여러 바이트들의 묶음이라고 생각할 수 있다!
실제로 그냥 이렇게 확대해서 여러 칸으로 나눈 뒤에 첫 칸은 첫 바이트이고, 두 번째 칸은 두번째 바이트이고 마지막 칸은 10억번째 바이트라고 생각할 수도 있다! 그냥 이 바이트들에 숫자를 붙인다.
만약 char, 즉 문자를 포함한 프로그램을 작성한다고 하면 컴퓨터 메모리 안의 이 수많은 작은 칸들 중 하나를 요청해야한다. 하지만 int는 어떨까? 4바이트이다. 즉 숫자를 정수로 저장한다면 컴퓨터 메모리에서 4바이트를 할당해야한다.
그럼 각 칸 안에는 뭐가 있을까? 8bit가 있고 혹은 8개의 작은 트랜지스터나 8개의 작은 전구이거나 무엇이든 간에 어떤 방식으로든 0과 1을 표현하고 있을 거다! 그게 각 칸이 나타내는 바이다!
char는 작은 따옴표를 이용하고 string은 쌍 따옴표를 이용해야한다! 이유는 C는 그 둘을 비교해야한다.
printf("%c %c %c\n", c1, c2, c3)에서 3개의 형식 지정자에 3개의 변수를 왼쪽부터 오른쪽으로 넣고 출력하는 코드다!
컴파일을 하면 HI!라는 출력결과를 얻을 수 있다.
H, I, !는 모두 char이다! char는 문자를 가리킨다!
ASCII와 유니코드로 문자를 숫자로 변환한다.
그럼 숫자는 어떻게 출력할까? printf에 어떤 형식 지정자를 사용할까? %i이다. 정수니까!
만약 그 값들을 실제로 보고 싶다면?
컴퓨터에게 말하길 c1은 char이지만, 정수처럼 여겨달라고 하는 거다!
변수 앞에 (int)를 적으면 된다! 이것을 형변환이라 부른다!
형변환이란? 하나의 자료형을 다른 종류로 바꾸는 행위를 뜻한다.
위의 코드를 컴파일을 하면, 72, 73, 33라는 결과가 나온다!
컴퓨터 메모리 내부에서 일어나는 일들을 이해하고, 그럼 이제 이걸 좀 더 시각적으로 보자!
만약 이게 제 메모리를 아주 크게 확대한 거라면, 총 10억개의 칸이 있다.
만약 c1, c2, c3 3개의 변수를 가진 프로그램이 있다면, 컴퓨터의 할일은 H를 하나의 칸에 넣고 I를 또다른 칸에 넣고, !를 세번째 칸에 넣는 것이다! 그리고 각 칸에 해당하는 변수명을 저장한다.
하지만 실제 그 위치에 저장된 건 H, I 그리고 !이다!
물론 이들은 char은 아니다! 엄밀히 말하면 숫자이다!
즉, 메모리 안에 저장된 건 사실 72, 73, 33이다!
하지만 이들은 사실 2진법으로 표현된다.
실제로 저장된 형태는 아래 그림과 같다!
이 0과 1들은 트랜지스터든 전구든 어떤 기술을 사용해서 구현되어 있다~
결국 0과 1의 조합일 뿐이다.
Q. 변수 3개를 정수로 선언하고 72, 73, 33을 저장한 뒤 %c로 출력할 수 있을까?!
A. 네, 그렇게 반대로도 가능합니다!
물론 그렇게 하려면 ASCII코드가 뭔지 알아야합니다. 72, 73, 33이다!
그런데 대부분의 프로그래머들은 그런 걸 신경쓰지 않는다.
단지 일종의 대응 관계가 있다는 사실 정도만 알고 있다!
이번엔 3개 문자 대신 3개의 정수를 써보자!
C에서는 여러 개의 값을 가진 하나의 변수를 만들고 싶을 때, 배열이라고 하는 걸 사용한다.
배열은 값들의 리스트로 모두 같은 자료형의 값들이 같은 이름의 변수에 저장되어있다.
즉 각각이 정수값인 점수 3개를 갖고 싶다면, 대괄호([ ])를 사용해서 원하는 점수의 갯수를 적고 세미콜론을 붙이면 된다!
이 컴퓨터에게 정수 3개를 위한 메모리를 달라고 하는 것이다.
이제 score1, score2, score3 대신에 각 점수들을 배열에 넣을 건데 배열의 이름을 적고 []를 이용해서 해당하는 위치에 1, 2,3이 아니라 컴퓨터 과학자들은 보통 0부터 세기 때문에 배열 역시 0부터 세어줘야한다!
배열의 첫번째 위치는 0이기 때문이다. 두번째는 1이고 세번째는 2가 된다.
아까와 같이 세 개의 변수가 생겼지만 한 변수에 모두 같이 저장할 수 있게 되었다!
Q. int score[3]에서 3은 세 개의 값을 하나의 변수에 저장하기 위한 공간을 의미!
Q. 이 모든걸 한 줄에 쓸 수 있을까요? 가능합니다! 중괄호를 사용가능하다!
'컴퓨터과학 > cs50' 카테고리의 다른 글
[컴퓨터 과학 cs50] 문자열 길이는 어떻게 찾을 수 있을까?! ASCII에서 함수쓰기까지~ (0) | 2021.01.30 |
---|---|
[컴퓨터 과학 cs50] 문자열은 배열에 어떻게 저장될까? (0) | 2021.01.30 |
[컴퓨터 과학 cs50] 배열(2) 좀 더 동적으로 만들 순 없을까? (0) | 2021.01.29 |
[컴퓨터 과학 cs50] 디버깅의 유래와 디버깅에 대해서 (0) | 2021.01.29 |
[컴퓨터 과학 cs50] c언어의 동작원리는 어떻게 될까? 컴파일링과 어셈블링 링킹에 대해서! (0) | 2021.01.28 |