3주차. 배열

홍석범·2022년 1월 6일
0

CS50 3주차 배열강좌 링크
이번 강좌는 컴파일링,디버깅,배열에 관한 강좌이다.

컴파일링

#include <stdio.h>

int main(void)
{
	printf("Hello, world!\n");
}

stdio.h는 헤더파일로써 c언어로 작성되어있다. 컴파일러가 프로그램을 컴파일할때 printf의 역할이 무엇인지를 알려주는 코드가 담겨있다.
컴파일의 4단계

  • 전처리(Preprocessing)
    C소스 코드의 경우 프로그램 헤더의 #~~부분을 통해 실질적으로 컴파일이 이루어지기 전에 해당파일의 내용을 포함시켜야한다고 알려주는 역할을 한다. 자바에서는 전처리 기능을 제공하지 않고 대신 class를 import시키거나 상수를 선언하는 방식으로 가져올수 있다고한다.
    참고링크
    https://groups.google.com/g/han.comp.lang.java/c/0nwDzNyNAMI
    https://soolper.tistory.com/9
  • 컴파일링(Compiling)
    소스코드를 어셈블리어로 바꾸어주는 단계. 기존의 소스코드를 어셈블리코드로 변환시켜줌으로써 컴퓨터가 이해할 수 있는 언어와 최대한 가까운 프로그램으로 만들어준다.
  • 어셈블링(Assembling)
    어셈블리코드를 머신코드로 변환한다.
  • 링크(Linking)
    현재 소스코드와 전처리과정을 통해 포함되어야할 파일들을 0과1로 이루어진 하나의 큰파일로 합치는 작업.

디버깅 & 코드의 디자인

코드에 있는 버그를 식별하고 고치는 과정. 디버거라는 프로그램을 통해 디버깅을 하게 되며 중지점(break point)를 선택하여 디버깅시 프로그램이 멈춰야되는 지점을 특정할 수 있다.

러버덕 디버깅(Rubber Duck Debugging)
치명적인 오류가 발생했을때, 누군가에게 질문하기 전에 책상 위의 오리에게 문제에 대해 설명하고 문제를 다시 해결해보는 방법. 뭔가 당황스러운 방법이긴한데 발생한 문제에 대하여 처음부터 설명하다보면 문제가 발생한 이유에 대해 자연스럽게 재정의 할수 있기 때문이라고 한다.

실제 업무에서는 코드에 문제가 있는지 지속적으로 점검해야될 필요성이 있으며 또한 유지보수를 위해 일정수준 이상의 가독성을 유지해 주어야한다. 같은 프로젝트 내에서 코드를 만드는데 있어서 규칙이나 규약이 있어야하고 실제 많은 기업들에서 코드를 작성할때 특정한 스타일 가이드를 따르는 지침이 있다고한다.
우리 회사는 따로 스타일 지침이없던데...DB의 컬럼명에 대해서는 주제영역,데이터사전을 만드는데 이것도 코드디자인에 포함되는 부분인가??

배열

각각의 자료형은 서로 다른 크기의 메모리를 차지한다.

  • boolean : 불리언,1바이트
  • char : 문자, 1바이트
  • int : 정수, 4바이트
  • float : 실수, 4바이트
  • long : (더 큰)정수, 8바이트
  • double : (더 큰)실수, 8바이트
  • string : 문자열, ?바이트
    코드에서 선언된 자료형들은 컴퓨터안의 RAM이라는 물리적칩에 저장되게된다.
    배열 : 같은 자료형의 데이터를 메모리상에 연이어 저장하고 이를 하나의 변수로 관리하기위해 사용.
#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);
}

위의 코드의 경우 점수를 동적으로 받을 수 없고, 배열이 3개로 설정되어있기 때문에 4개이상의 점수를 받을 수 없기때문에 좀 더 동적으로 바꾸어본다.

#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;
}

문자열과배열

문자열은 문자(char)의 데이터 배열을 의미한다.즉, 문자열은 문자의 갯수만큼의 바이트를 필요로 하게된다.C의경우 문자열의 가장끝에는 널 종단문자('\0')가 있는데, 이는 메모리상에서 다른변수의 시작점을 이전변수와 구분하기 위해서 사용되며 8비트가 모두 0으로 이루어져있다.

자바의 경우에는 널 종단문자를 사용하지 않고, 문자열의 길이를 저장하는 방식을 사용한다고 한다.
참고 링크

강의완료!!💯


profile
코딩하는 주니어개발자

2개의 댓글

comment-user-thumbnail
2022년 1월 6일

너무 빨리 올려서 재수없어요 그리고 중간에 님 회사 스타일 지침 적는 부분 오타잇삼 수정하삼;

1개의 답글