3. 배열

최준영·2021년 8월 25일
0

CS50

목록 보기
3/6

컴파일링


  • 컴파일의 전체 과정은 네단계로 나누어 볼 수 있다
  1. 전처리
    • 전처리기에 의해 수행된다
    • #include <stdio.h>에서 #include는 전처리기에게 다른 파일의 내용을 포함시키라고 알려준다. 여기서는 stdio.h라는 파일을 포함시키라고 알려주고 있다.
    • 전처리기는 명령을 듣고 포함시키기 위해 새로운 파일을 생성하는데, 이 파일은 여전히 C 소스 코드의 형태이다.
  2. 컴파일
    • 컴파일이라는 용어는 소스코드에서 오브젝트 코드로 변환하는 전체 과정을 통틀어 일컫기도 하지만, 구체적으로 전처리한 소스 코드를 어셈블리 코드로 변환시키는 단계를 말하기도 한다.
    • 컴파일러라고 불리는 프로그램은 C 소스코드를 어셈블리어라는 저수준 프로그래밍 언어로 컴파일한다.
    • 컴퓨터가 이해할 수 있는 언어와 최대한 가까운 프로그램으로 만드는 것이다.
  3. 어셈블
    • 어셈블리 코드를 오브젝트 코드로 변환시키는 것이다.
    • 컴퓨터의 중앙처리장치가 프로그램을 어떻게 수행해야하는지 알 수 있는 명령어 형태인 연속된 0과 1들로 바꿔주는 작업이다.
    • 이 변환작업은 어셈블러라는 프로그램이 수행한다.
  4. 링크
    • 소스코드에서 오브젝트 코드로 컴파일되어야할 파일이 한개가 아니라면, 링크라고 불리는 단계가 추가된다.
    • 프로그램이 (stdio.h, math.h와 같은 라이브러리를 포함해) 여러 개의 파일로 이루어져 있어 하나의 오브젝트 파일로 합쳐져야 한다면 연결시켜주는 작업이 필요하다.
    • 여러개의 다른 오브젝트 코드 파일을 실행 가능한 하나의 오브젝트 코드 파일로 합쳐준다.
  • 이 네 단계를 거치면 최종적으로 실행 가능한 파일이 완성된다.

디버깅


  • 코드에 들어있는 오류를 버그라고 한다. 또한 이 버그를 식별하고 고치는 과정을 디버깅이라고 한다.
  • 프로그램은 일반적으로 인간보다 훨씬 빠르게 연산을 수행하기 때문에 실행시켜보는 것만으로는 무엇이 잘못됐는지 찾기 어렵다.
  • 오류 자체를 알려주는 도구들도 있으며, printf를 의심가는 행에 끼워넣어서 확인해 볼 수도 있다.

코드의 디자인


  • 공백의 수나 줄바꿈과 같은 것들은 코드의 실행에 직접적인 영향을 주지는 않지만 가독성과 이해력에 영향을 줄 수있기 때문에 중요한 요소이다.

메모리


  • C에는 아래와 같은 여러 자료형이 있고, 각각의 자료형은 서로 다른 크기의 메모리를 차지한다.
    • bool: 불리언, 1바이트
    • char: 문자, 1바이트
    • int: 정수, 4바이트
    • float: 실수, 4바이트
    • long: (더 큰) 정수, 8바이트
    • double: (더 큰) 실수, 8바이트
    • string: 문자열, ?바이트
  • 컴퓨터에는 사진과 같은 RAM이라는 물리적 칩이 메모리 역할을 한다.
  • 작은 사각형 하나가 1바이트를 의미하고 이들이 모여 메모리가 된다고 생각하면 쉽다.

배열


  • 같은 자료형의 데이터를 메모리상에 연이어서 저장하고 이를 하나의 변수로 관리하기 위해 사용한다.
  • 전역변수란 main함수 밖에서 const int N = 3과 같이 const를 붙여서 코드 전반에 거쳐 바뀌지 않는 상수와 같은 변수를 선언할 수 있다.
  • 배열의 크기를 사용자에게 직접 입력받고, 그 크기만큼 루프를 돌면서 각 인덱스에 해당하는 값을 역시 사용자에게 동적으로 입력받아 저장할 수 있다.

문자열과 배열


  • 문자열 string은 문자 자료형 char 데이터들의 배열이다.
  • 여기서 가장 끝의 \0은 문자열의 끝을 나타내는 널 종단 문자이다.
  • 문자열을 담은 배열은 이차원 배열이라고 볼 수 있다.

문자열의 활용


  • string.h 라이브러리 안에 문자열을 활용할 수 있는 다양한 함수가 선언되어 있다.
  • strlen은 문자열의 길이를 알려주는 함수이다.
  • toupper()은 ctype 라이브러리 안에 정의되어 있으며, 대문자로 변환시켜 준다. 알파벳은 ASCII문자로 이루어져 있고 소문자에 32라는 값을 더하면 대문자로 변환할 수 있는 원리를 이용한 것이다.

명령행 인자


  • int main(void) {}로 많이 썼지만 void 대신 값을 입력받을 수 있다.
int main(int argc, string argv[])
{
    if (argc == 2)
    {
        printf("hello, %s\n", argv[1]);
    }
    else
    {
        printf("hello, world\n");
    }
}
  • 여기서 argc는 main함수가 받게 될 입력의 개수이다.
  • argv[]는 그 입력이 포함되어 있는 배열이다. 프로그램을 명령행에서 실행하므로, 입력은 문자열로 주어진다. 따라서 string 배열이 된다.
  • argv[0]는 기본적으로 프로그램의 이름이 저장된다. 하나의 입력을 더 한다면 argv[1]에 저장된다.
profile
do for me

0개의 댓글