[CS50] 모두를 위한 컴퓨터 과학 - ch3

2025. 11. 16. 17:00·코딩

 

1. 배열

 

우리가 명령어를 실행할 때 정확히 어떤 일이 일어나는지 알아보도록 하겠습니다.

 

전처리(Precompile)

컴파일의 전체 과정은 네 단계로 나누어볼 수 있습니다. 그 중 첫 번째 단계는 전처리인데, 전처리기에 의해 수행됩니다. # 으로 시작되는 C 소스 코드는 전처리기에게 실질적인 컴파일이 이루어지기 전에 무언가를 실행하라고 알려줍니다.

예를 들어, #include는 전처리기에게 다른 파일의 내용을 포함시키라고 알려줍니다. 프로그램의 소스 코드에 #include 와 같은 줄을 포함하면, 전처리기는 새로운 파일을 생성하는데 이 파일은 여전히 C 소스 코드 형태이며 stdio.h 파일의 내용이 #include 부분에 포함됩니다.

 

 

컴파일(Compile)

전처리기가 전처리한 소스 코드를 생성하고 나면 그 다음 단계는 컴파일입니다. 컴파일러라고 불리는 프로그램은 C 코드를 어셈블리어라는 저수준 프로그래밍 언어로 컴파일합니다.

어셈블리는 C보다 연산의 종류가 훨씬 적지만, 여러 연산들이 함께 사용되면 C에서 할 수 있는 모든 것들을 수행할 수 있습니다. C 코드를 어셈블리 코드로 변환시켜줌으로써 컴파일러는 컴퓨터가 이해할 수 있는 언어와 최대한 가까운 프로그램으로 만들어 줍니다. 컴파일이라는 용어는 소스 코드에서 오브젝트 코드로 변환하는 전체 과정을 통틀어 일컫기도 하지만, 구체적으로 전처리한 소스 코드를 어셈블리 코드로 변환시키는 단계를 말하기도 합니다.

 

 

어셈블(Assemble)

소스 코드가 어셈블리 코드로 변환되면, 다음 단계인 어셈블 단계로 어셈블리 코드를 오브젝트 코드로 변환시키는 것입니다. 컴퓨터의 중앙처리장치가 프로그램을 어떻게 수행해야 하는지 알 수 있는 명령어 형태인 연속된 0과 1들로 바꿔주는 작업이죠. 이 변환작업은 어셈블러라는 프로그램이 수행합니다. 소스 코드에서 오브젝트 코드로 컴파일 되어야 할 파일이 딱 한 개라면, 컴파일 작업은 여기서 끝이 납니다. 그러나 그렇지 않은 경우에는 링크라 불리는 단계가 추가됩니다.

 

 

링크(Link)

만약 프로그램이 (math.h나 cs50.h와 같은 라이브러리를 포함해) 여러 개의 파일로 이루어져 있어 하나의 오브젝트 파일로 합쳐져야 한다면 링크라는 컴파일의 마지막 단계가 필요합니다. 링커는 여러 개의 다른 오브젝트 코드 파일을 실행 가능한 하나의 오브젝트 코드 파일로 합쳐줍니다. 예를 들어, 컴파일을 하는 동안에 CS50 라이브러리를 링크하면 오브젝트 코드는 GetInt()나 GetString() 같은 함수를 어떻게 실행할 지 알 수 있게 됩니다.


이 네 단계를 거치면 최종적으로 실행 가능한 파일이 완성됩니다.

 

 

 

2. 디버깅

 

디버깅이라는 중요한 요소에 대해 알려주는데, 정작 디버깅에 대한 자세한 설명이 조금 부족한 느낌..

 

프로그램은 일반적으로 인간보다 훨씬 빠르게 연산을 수행합니다. 그래서 프로그램을 실행시켜보는 것만으로는 무엇이 잘못됐는지 찾아내기 어렵습니다. 디버거는 프로그램을 특정 행에서 멈출 수 있게 해주기 때문에 버그를 찾는데 도움이 됩니다. 프로그래머는 멈춰진 그 지점에서 무슨 일이 일어나는지 볼 수 있습니다. 프로그램이 멈추는 특정 지점을 중지점이라고 합니다. 또한 프로그래머가 프로그램을 한번에 한 행씩 실행할 수 있게 해줍니다. 이로써 프로그래머는 프로그램이 내리는 모든 결정들을 단계별로 따라갈 수 있게 됩니다.

 

 

 

#include <stdio.h>

int main(void)
{
    for (int i = 0; i <= 10; i++)
    {
        printf("#\n");
    }
}

 

디버깅으로 해결할 수 없는 경우 : 이런 경우 실행은 문제가 없지만, 답이 틀리기 때문에 디버깅 대상.

 

#을 10개까지 출력하려고 가정하면, 이 경우에는 실패한 코드

 

왜냐면 i = 0부터, i <= 10으로 0~10까지 세는데 그러면 총 11개가 나오기 때문

 

그렇기에

 

#include <stdio.h>

int main(void)
{
    for (int i = 0; i <= 10; i++)
    {
        printf("i is now %i: ", i);
        printf("#\n");
    }
}

 

이렇게 바꿔서 쓴다면 어디부분이 잘못됐는지 확실하게 알 수 있음

 

 

3. 배열

 

배열은 파이썬의 리스트 개념처럼 여러 개의 자료를 사용할 수 있도록 하는 자료구조.

 

하지만 여러 자료형을 같이 사용할 수 있는 리스트와는 다르게, 한 자료형만 쓸 수 있는 단점이 있는 게 배열

 

여러 자료형을 쓰려면 구조체를 통해 다른 자료형도 들어갈 수 있게 컨트롤 해야 함

 

#include <cs50.h>
#include <stdio.h>

int main(void)
{
    // Scores
    int score1 = 72;
    int score2 = 73;
    int score3 = 33;

    // Print average
    printf("Average: %i\n", (score1 + score2 + score3) / 3);
}

 

 

위에서도 배열과 똑같이 할 수 있지만, 문제는 score1, score2, score3에서 더 추가하려면 변수인 score4를 만들고 printf 함수에서도 계속 추가를 해야 한다.

 

 

#include <cs50.h>
#include <stdio.h>

int main(void)
{
    // Scores
    int scores[3];
    scores[0] = 72;
    scores[1] = 73;
    scores[2] = 33;

    // Print average
    printf("Average: %i\n", (scores[0] + scores[1] + scores[2]) / 3);
}

 

 

그렇기에 배열을 선언하고, score[0], socre[1], score[2]로 만들면 동일하게 출력이 가능

 

하지만, 기존의 구조와 동일하게 배열에서 요소를 추가할 경우 변수를 또 적어야 하는 부작용이 생김

 

그렇기에, 배열을 동적으로 받는 구조가 필요하다

 

#include <cs50.h>
#include <stdio.h>

float average(int length, int array[]);

int main(void)
{
    // 사용자로부터 점수의 갯수 입력
    int n = get_int("Scores:  ");

    // 점수 배열 선언 및 사용자로부터 값 입력
    int scores[n];
    for (int i = 0; i < n; i++)
    {
        scores[i] = get_int("Score %i: ", i + 1);
    }

    // 평균 출력
    printf("Average: %.1f\n", average(n, scores));
}

//평균을 계산하는 함수
float average(int length, int array[])
{
    int sum = 0;
    for (int i = 0; i < length; i++)
    {
        sum += array[i];
    }
    return (float) sum / (float) length;
}

 

 

위 코드를 보면

 

int n으로 입력하는 정수를 받고

 

정수 데이터 형태의 배열인 scores를 선언한 후에 n의 크기만큼의 데이터를 넣도록 제시함

 

 

 

'코딩' 카테고리의 다른 글

[부스트코스] Github으로 따라하는 버전 관리 수강  (0) 2026.01.24
[CS50] 모두를 위한 컴퓨터 과학 - ch5  (0) 2025.11.19
[CS50] 모두를 위한 컴퓨터 과학 - ch4  (0) 2025.11.17
[CS50] 모두를 위한 컴퓨터 과학 - ch2  (0) 2025.11.01
[CS50] 모두를 위한 컴퓨터 과학 - ch1  (0) 2025.10.30
'코딩' 카테고리의 다른 글
  • [CS50] 모두를 위한 컴퓨터 과학 - ch5
  • [CS50] 모두를 위한 컴퓨터 과학 - ch4
  • [CS50] 모두를 위한 컴퓨터 과학 - ch2
  • [CS50] 모두를 위한 컴퓨터 과학 - ch1
kunstlounge1
kunstlounge1
kunstlounge1 님의 블로그 입니다.
  • kunstlounge1
    kunstlounge1 님의 블로그
    kunstlounge1
  • 전체
    오늘
    어제
    • 분류 전체보기 (19)
      • 코딩 (7)
      • 공부 (1)
      • 제작일지 (3)
      • [도서] 공부 (1)
      • 여행 (6)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    CS50 #모두를 위한 컴퓨터 과학
    파이토치
    하나투어 동유럽 여행
    로텐부르크
    비엔나
    클림트
    벨베데레 궁전
    비쇼프스호펜
    오스트리아
    딥러닝
    카페투어
    잘츠부르크
    수료증
    react #toy프로젝트
    슈테판 대성당
    쇤브룬 궁전
    블룸필터
    하나투어
    인천공항 #하나투어 #동유럽여행 #4국9일
    부스트코스
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
kunstlounge1
[CS50] 모두를 위한 컴퓨터 과학 - ch3
상단으로

티스토리툴바