부스트코스에서 진행한 '모두를 위한 컴퓨터 과학(CS50 2019)'을 수강한 뒤 작성한 내용입니다.
몰랐던 내용을 위주로 정리했기 때문에 빠진 부분이 많을 수 있습니다.
1. C 기초
printf의 f는 '형식화'를 의미한다.
컴파일러 : '소스코드'를 컴퓨터가 이해하는 이진법으로 바꾸는 프로그램
소스코드 → 컴파일러 → 머신코드
clang : 코드를 컴파일하는 프로그램의 이름
./a.out | . | this directory |
/a.out | a.out이라는 파일 실행 |
ls로 나온 파일들 중 *가 붙어있으면 머신코드
2. 문자열
형식지정자 %
-l : 두 파일을 연결
hello : 머신코드, hello.c : 소스코드
make hello는 hello.c라는 파일을 찾아서 hello라는 파일을 만든다. (clang -o hello hello.c -lcs50)
3. 조건문과 루프
효율적으로 코딩하기(적은 CPU와 메모리 사용)
for(___; ___; 변수를 어떻게 수정할 것인가;)
4. 자료형, 형식 지정자, 연산자
가독성이 좋은 코드로 작성하기
뒤에 /가 붙으면 폴더.
cd는 기본 디렉터리로 간다.
- 강의에서 궁금했던 점
get_char를 쓸 때 문자 외에 다른 것을 입력하면 아무일도 안 일어난다고 하고, get_int를 쓸 때 정수 외에 다른 것을 입력하면 계속 물어본다는데 왜 다를까요??
→ 여러분이 사용하는 라이브러리는 cs50 라이브러리입니다. 수업에서 배운 것처럼 라이브러리를 사용하여 다른 프로그래머가 이미 구현해둔 코드를 우리가 쉽게 가져다 쓸 수 있습니다. get_int와 get_char가 어떻게 동작하는지는 https://man.cs50.io/에서 확인할 수 있습니다. 링크에 들어가 보면 여러분이 이해한 것과 달리 두 함수 모두 이상한 입력을 넣었을 때 사용자에게 다시 입력을 요청한다고 나와 있습니다 (user is reprompted). 실제로 제가 코드로 테스트를 해본 결과 get_char 함수와 get_int 함수 모두 이상한 입력값을 넣었을 때 계속해서 물어봅니다. 강의 19:20에서 강연자가 아무 일도 일어나지 않는다고 한 상황의 조건은 문자 외 다른 것을 입력했을 때가 아니라 'y' 혹은 'n'이 아닌 문자를 입력했을 때입니다. 그 예시로 'x'를 입력하여 아무 일이 일어나지 않는다는 것을 보여줍니다. 이는 'x'라는 입력을 처리하는 조건문이 없기 때문이죠. 실제로도 문자가 아닌 다른 값 (예, 문자열)를 입력한다면 get_int와 똑같이 올바른 입력값이 들어올 때까지 계속 물어본답니다. 꼭 직접 해보시기를 추천합니다 :)
5. 사용자 정의 함수, 중첩 루프
추상화 : 어떤 함수가 printf로 구현된 것을 몰라도 그 함수가 있다는 것만 알면 된다.
main 함수는 위에 있을수록 좋다. 함수명만 메인함수 위에 입력한다(프로토타입).
void는 입력을 받지 않는다.
함수 왼쪽에 있는 단어는 출력의 종류를 의미한다.
괄호 안은 입력의 종류를 의미한다.
중첩루프에서 보통 i는 열, j는 행을 의미한다.
사용자 정의 함수는 코드 재사용이 가능하여 효율적이고 간결하여 유지보수에 효과적이다.
6. 하드웨어의 한계
RAM은 모든 프로그램이 실행 중 저장되는 곳이다.
컴퓨터는 계산 결과 값에 가장 가까운 값을 저장한다. 유한한 정보를 사용해서는 무한한 숫자들을 100% 정확하게 저장할 수 없기 때문이다.
for문에 가운데 값을 입력하지 않거나 ture를 입력하면 무한루프가 된다.
부동소수점 부정확성
오버플로우가 나타났을 때 0이 나오는 이유 : 111에 1을 더하면 1000이기 때문이다.
오버플로우 방지를 위해서는 자료형을 크게 잡는다.