
Source Code
소스코드는 프로그래밍 언어 (C, Python, Java ..) 로 쓰여진 코드이다.
"Hello Wolrd" 를 출력하는 간단한 프로그램을 C로 만들어보면
#include <stdio.h>
int main(void)
{
printf("Hello World\n");
}
이런식으로 쓸 수 있다.
기본적으로 영어이고 인간이 읽고 쓰기 좋게 만들어졌다.
하지만 이 자체로는 컴퓨터가 이해할 수 없다.
0강에서 다뤘듯이 컴퓨터는 Machine Code (0과 1로만 구성된 이진법)를 쓰기 때문이다.
Complier
따라서 Source Code 를 Machine Code 로 바꿔주는 작업을 해야하는데
그 역할을 하는 것이 Compiler 이다.

컴파일러를 사용하는 방법은 언어마다 다르지만
C에서 컴파일하고 실행하는 방법은 다음과 같다.
$ make filename
$ ./filename
make 파일이름 명령어로 컴파일러에게 컴파일을 명령하고
./파일이름 으로 실행한다.
Variables / Types
#include <stdio.h>
#include <cs50.h>
int main(void)
{
string answer = get_string("what's your name?")
printf("hello, %s", answer);
}
* get_string 은 <cs50.h> 제공한 별도 함수로 사용자의 입력을 받는다.
위에서 variable answer는 string type이고 get_string()이 반환한 값을 가지고 있다 .
사용자의 입력을 받아 출력하는 위의 코드에서 변수는 answer 이다.
변수는 보관함처럼 사용자에게 받은 값을 보관하고 있다가 필요할 때 사용 할 수 있다.
bool (true or false), char (문자), float (실수), int (정수), long (큰 숫자), string (문자열)
이것들이 type 이다. 이외에도 다양한 type 이 존재한다.
왜 type이 첫번째로 나올까?
컴퓨터에 만약 01000001 이 저장되어 있으면
int 01000001 은 65이다.
char 01000001 은 'A' 이다.
그렇기 때문에 type이 먼저 결정되야 한다.
이와 더불어 type 에 따라 할당되는 bit 수가 달라진다. 즉 변수 보관함의 크기가 달라지는 것이다.
보관하려는 물품이 보관함에 알맞게 보관함을 준비해야한다.
printf 문을 보면 % 라는 자리표시자가 있는데 콤마 뒤에 있는 answer 가 %s 자리로 들어온다.
이때 중요한 것은 % 뒤의 알파벳인데 %s 라고 쓴것은 answer가 string 이기 때문이다.
만약 answer 가 int 였다면 %i 를 써야한다.
Conditionals
#include <stdio.h>
#include <cs50.h>
int main(void)
{
int x = get_int("x : ");
int y = get_int("y : ");
if (x < y)
{
printf("x is less than y\n");
}
else
{
if (x > y)
{
printf("x is greater than y\n");
}
else
{
printf("x is equal to y\n");
}
}
}
프로그래밍에서 들여쓰기는 중요하다. 들여쓰기를 어떻게 하냐에 따라 다른 결과가 나온다.
위의 코드를 따라가보면 우선 x와 y 값을 사용자에게 입력 받는다.
만약 x 가 y 보다 작다면 x is less than y 를 출력하고 끝난다.
만약 x 가 y 보다 크다면 if (조건) 에서 조건이 맞지 않기에 else 로 넘어온다.
그러면 바로 또 다른 if 를 만나게되는데 x > y 가 참이기 때문에 x is greater than y 를 출력하고 끝난다.
여기서 만약 x 가 y 와 같다면 else 로 넘어가게 되는데 그때서야 x is equal to y 를 출력한다.

Loops
#include <stdio.h>
int main(void)
{
int i = 0;
while (i < 3)
{
printf("meow\n");
i++;
}
}
나는 전에 반복문에 대해 단순히 반복하는 것 이상이다 라는 생각이 있었는데
사실은 반복문은 단순히 반복하는 것이다.
반복문에 while 문과 for문이 자주 사용되는데
i 를 0으로 설정하고 while(조건) 조건이 참이면 {}안의 내용을 실행한다
i ++ 는 i 에 1씩 더하는 것이므로 i 는 0, 1, 2, 가 되고 3이 되었을때 멈춘다.
while 문은 조건에 따른 반복을 할때 사용하기 좋은데
유의할 점은 반드시 조건을 false 로 만드는 상황을 만들어야 한다는 것이다.
위의 경우에서 만약 i++ 를 넣지 않으면 i 는 계속 0이고 계속 while 문을 만족한다.
meow를 영원히 출력하게 되므로 무한 루프에 빠지게 된다. 이런 경우 control c 로 탈출하자.
#include <stdio.h>
int main(void)
{
for(int i = 0; i < 3; i++)
{
printf("meow\n");
}
}
조건대신 몇번 반복할지 횟수로 반복하고 싶은 경우 for 문을 사용하면 된다.
for문이 while 문의 활용이라고 생각하면 순서가 자연스럽게 이해가 된다.
int i = 0; -> i 를 설정하는 것으로 최초 1회만 실행된다.
i < 3; 반복할 때 마다 참인지 확인한다.
i++; 반복할 때 마다 i 에 1씩 더한다.

Functions
#include <stdio.h>
int main(void)
{
printf("Hello World\n");
}
위에 예시로 쓴 코드를 좀 더 자세히 보면 int type 의 main function 에서 printf 동작을 한다고 말할 수 있다.

함수는 이런식으로 작동한다. arguments 는 매개변수로 함수로 넘겨주는 인자이다.
위의 코드에서 argument 는 void 인데 이것은 보내줄 매개변수가 없다는 것이다.
side effects 는 함수가 동작해서 발생하는 것에 관한 것인데
위의 코드에선 Hello World 를 출력하는 side effects 가 발생한다.
Operations / Abstraction
#include <cs50.h>
#include <stdio.h>
int add(int a, int b);
int main(void)
{
// Prompt user for x
int x = get_int("x: ");
// Prompt user for y
int y = get_int("y: ");
// Perform addition
printf("%i\n", add(x, y));
}
int add(int a, int b)
{
return a + b;
}
연산자는 +, -, *, /, % 등이 쓰이고 계산을 위한 것이다.
추상화는 a + b 라는 작업을 함수화 시켜 재사용 할 수 있게 만들어 놓는 것이다.
전공책 같은 곳에선 결합성을 낮추고 이식성을 높인다고 표현한다.
scope 에 대한 얘기를 할 수 있는데 지역변수 / 전역변수 라는 말도 scope에 관한 것이다.
main 에 있는 변수 x 와 y 는 add 함수가 직접 접근 할 수 없다.
오로지 매개 변수로만 인자로 넘겨받아 return 으로 돌려주는 방식만 가능하다.
x, y 는 main 의 지역 변수이기 때문이다.
Integer overflow
정수를 담을 수 있는 크기는 32비트이다.
2의 32제곱으로 약 42억 정도이다.
어떤 게임이나 프로그램의 최대 계산 숫자가 2147..이런식인 것은
42억 정도의 숫자로 음수와 양수를 계산하면 -21억4~ +21억4 이정도이기 때문이다.
즉 이 숫자를 초과하는 값은 컴퓨터가 정확히 계산 할 수 없다. 이 경우를 integer overlow 라고 한다.
만약 더 큰 수를 계산하고 싶은 경우 type 을 long으로 사용해야 한다.
long 의 경우엔 64비트를 사용하는데 2의 64제곱은 어마어마하게 큰 수이다.
실수를 표현하는 경우는 float 을 사용하는데 마찬가지로 32비트이다.
float 도 소수점 이하 숫자가 길어지는 경우가 있는데 이럴 경우
double 을 사용하면 더 정확하게 표현이 가능하다.
하지만 어떤 경우에서도 정확하게 표현 할 수 없는 실수가 존재한다. 그것도 많이...
예를들어, 1/3 을 소수로 표현하면 0.33333... 이다
3이 무한히 이어지는데 이것은 float 이나 double 이나 정확한 값을 계산할 수 없다.
결국에는 표현할 bit가 없어지기 때문이다. 하지만 double이 float 보다는 훨씬 정확한 값을 제공한다.
0.1 같은 경우에도 부동소수점으로 딱 떨어지게 계산되는 수가 아니기 때문에
컴퓨터는 0.1을 정확하게 계산할 수 없고 근사값으로 계산하게 된다. 그래서 0.1 + 0.2 = 0.3 이 성립하지 않는 경우가 많다.
그래서 정확한 값을 저장해야할 때는 정수형으로 저장하는 것이 좋다.
'입문 > CS50X' 카테고리의 다른 글
[CS50X] 2024 Week3 Algorithms (1) | 2024.02.23 |
---|---|
[CS50X] 2024 Week2 Arrays Problem Set 2 (Scrabble, Readability, Substitution) (0) | 2024.02.22 |
[CS50X] 2024 Week2 Arrays (0) | 2024.02.22 |
[CS50X] 2024 Week1 C Problem Set 1 (Mario, Credit) (0) | 2024.02.21 |
[CS50X] 2024 Week0 Scratch (0) | 2024.02.20 |