[CS] TIL 3. C기초, 문자열


  1. C로 “hello, world”를 출력하는 프로그램을 만들 수 있다.
  2. C로 문자열 형식을 가진 변수를 선언하고 출력하는 프로그램을 만들 수 있다.


boostcourse모두를 위한 컴퓨터 과학 (CS50 2019) 강의를 듣고 정리한 필기입니다. 😀


1. C기초

1.1 C언어

C는 아주 오래되고 전통적인 순수 텍스트 기반 언어이다. 저번 TIL에서 짧게 언급했던 스크래치로할 수 있는 것들 이상의 것을 할 수 있다. 물론 스크레치에 비하면 사용자 친화적인면이 턱없이 부족하다.

#include <stdio.h>

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

C나 다른 언어를 접했다면 위 코드에대해서 두려움은 없겠지만, 처음 접하는 사람은 영어와 비슷한 단어들이 섞여있는 일종의 암호처럼 보일 수 도있다. 하지만 우리가 위의 글자를 이해한다면 우리는 나중에 유용하게 사용할 수 있는 개념과 기술을 알게 될 것이다.

title

왼쪽의 스크래치 블록은 지정 캐릭터가 “안녕”이라고 말하게 하는 것이었다.오른 쪽의 검은색 바탕에 있는 이상한 글씨들은 왼쪽의 스크래치 블록과 결과적으로 정확히 같다. (오늘쪽 = 왼쪽)

title

int main(void) 는 ‘시작한다’의 의미를 가지고 있다. 앞으로 우리가 작성할 코드 모두는 이 int main(void) { }의 중괄호 사이에 작성하게 될 것 이다. 즉. 해당 프로그램을 실행하게 되면 중괄호 사이에 있는 코드가 실행된다.

title

스크래치에서는 이를 say을 이용하여 텍스트를 출력했다. C에서는 printf()가 그 역할을 한다. printf(“hello, world\n”) 를 보면, 글자나 단어, 문장을 적을 때는 언제나 전달하고자 하는 것은 ""(쌍따옴표)감싸야한다. \n는 줄바꿈 기능을 한다. 줄바꿈을 하는 이유는 더 보기 좋기 때문이다.

문장의 끝을 알리는 .(마침표)는 C언에서 ;(세미콜론)이 그 역할을 한다.

title

이제 전체 코드로 돌아가 #include <stdio.h>는 무슨 역할을 할까?

다양한 언어에는 라이브러리가 존재한다. 이것은 프로그램에서 자주 사용하는 행동을 함수화 하여 저장한 파일이다. <stdio.h>가 그러한 역할을 하는데, #include <stdio.h><stdio.h>라는 이름의 파일을 찾아서 printf()함수에 접근할 수 있도록 한다.

프로그래밍 언어로 작성한 파일은 그 확장자가 매우 중요하다. 이유는 확장자에서 어떤 언어로 작성된 코드인지를 파악할 수 있기 때문이다. javascript는 “파일이름.js”라는 확장자를 사용하고 python은 “파일이름.py”를 사용한다. C로 작성한 코드 파일은 “파일이름.c”로 저장해야한다. 프로그래밍 언어는 파워포인트나 엑셀관 달리 자동으로 확장자가 붙지 않기 때문에 어떤 언어로 파일을 작성했는지를 직접 명시해줘야 한다.

1.2 컴파일러

title

우리가 직접 작성한 코드는 소스 코드 라고 불린다. 이를 2진수로 작성된 머신 코드로 변환해야 컴퓨터가 이해할 수 있다. 이런 작업을 컴파일러라는 프로그램이 수행해준다.

title

위 사진은 VScode를 직접 캡쳐한 것이다. 왼쪽이 현재 디렉토리에 저장되어있는 문서를 보여주는 것이고, 오른쪽 상단에는 코드를 작성하는 부분, 그 아래는 터미널 창이라고 한다.

터미널창의 명령어 프롬프트에서 >(리눅스나 맥 OS에서는 $로 표시된다.) 기호 옆에 우리가 원하는 명령어를 입력하면 된다. clang hello.c 라는 명령어를 입력하면 “hello.c”를 컴파일된다. (“clang” 을 컴파일일이다. ) 그 결과는 a.out 이라는 파일이 생성된다. ./a. out 이라는 명령어를 실행하면 컴퓨터가 현재 디렉토리에 있는 a.out이라는 프로그램을 실행시킨다. (./a. out에서 제일 앞에 있는 .(dot)은 지금 있는 현재 폴더를 나타낸다.)

참고) 줄바꿈을 할 때 \(백슬래시)가 ₩(원화)로 보일 때가 있다. 해당 문제는 ‘한글 윈도우’ 운영체제에서만 생기는 현상이다. 한글 윈도우에서는 \를 ₩로 표시를 해주기 때문이다. 따라서 ₩로 표시가 되어도 문제 없다.



2. 문자열

title

스크래치 강의를 보면 사용자의 이름을 입력 받고 그 사람의 이름을 불러서 인사를 하는 블록이 있었다.

title

위를 통해서 배울 수 있는 건 get_string(), 괄호 안에 있는 문자열을 묶은 쌍따옴표, answer라는 변수 명, string이라는 형식지정자 마지막으로 =이다.

  • get_string()

    이것을 C로 표현하면 위와 같다. get_string()#include <cs50.h>라는 라이브러리를 통해서 가지고 올 수 있다. 이것은 스크래치의 ask()와 비슷한 역할을 한다. string은 단어나 구절, 문장을 부르는 말이다. (정수, 소수와는 다른 종류의 데이터 이다.)

  • 괄호 안에 있는 문자열을 묶은 쌍따옴표

    get_string()의 괄호 사이에는 어떤 입력을 넣을 수 있다. 예를 들면 “당신의 이름은 무엇인가요?”와 같은 것을 말이다. 여기서도 쌍따옴표가 사용된다. 위에서 말했 듯이 문자열을 입력할 때는 단어든 구절이든 알파벳, 문자든 반드시 양 끝을 쌍따옴표로 감싸한다.

  • answer라는 변수명

    이렇게 get_string()를 이용해서 사용자에게 이름을 물어봤고, 이것을 활용하기 위해서 변수를 지정한 것이다. 변수를 지정할 때 zyx라고 해도 되지만, answer라고 하는 것이 보다 명시적이다. 변수명은 이렇게 안에 할당된 내용이 무엇인지 명시할 수 있는 이름으로 지정하는 것이 좋다.

  • string이라는 형식지정자

    C는 오래된 언어이기 때문에 데이터의 종류를 정확하게 알려줘야 한다. 이때, string을 형식지정자라고 한다. 이것은 0과 1만 사용하는 컴퓨터에게 “answer에 들어갈 것들은 문자야!”라고 말해주는 것이다. string 이외에 정소, 소수 등 다양한 종류가 더 있지만, 내일 배우도록 한다. 그리고 마무리는 꼭 ;(세미콜론)으로 해야한다.

  • =

    =는 일반적으로 같다가 아니라 화살표와 비슷하다고 생각하면 된다. 쉽게 말하면 오른쪽에서 왼쪽에 지정한다는 것이다. 프로그래밍에서는 이것을 할당하다 라고 말한다. (이름도 할당연산자이다.) 이것을 통해 `get_string("What's your name?\\n")`가 컴퓨터의 메모리 어딘가에 사용자에게 받은 이름이 저장된다.

title

이제 이것을 printf()를 출력해본다. 이 때, 유의할 점은 printf("hello, answer");이 아니라는 점이다. 이 코드를 실행한다면 answer에 저장된 사용자 이름이 아니라, hello, answer이 출려되게 된다. 우리가 하려는 것은 hello 뒤에 이 프로그램을 사용하는 사람의 이름을 넣어 인사하는 것이다. hellow 라는 단어와 사용자의 입력을 합쳐야 하는 것이다. printf()는 스크래치와 조금 달리 형식 지정자라는 것을 사용한다. 형식 지정자란, 값을 모르는 것을 화면 상에 출력하고자 할 때 사용하는 것이다. %와 문자열을 의미하는 s를 적어 형식 지정자를 사용한다. printf("hello, %s\n", answer);을 하면, 미래에 이 코드를 돌려도 그들의 이름을 부르며 인사할 수 있게 된다.


2.1 printf()

printf()를 작동하는 방식은 관련 문서를 읽거나 배우면 알 수 있는데 먼저 ""(쌍따옴표) 사이에 들어간 하나의 문자열을 입력 받는다. 그런데 거기에 형식 지정자가 있다면, 쉼표와 변수명을 같이 입력해줌으로써 컴퓨터에게 가져와야할 값을 알려준다.

2.2 영상 내 질문들

Q1. 다른 변수를 추가할 수 있나요?

▶이 코드에 변수를 추가하면 코드는 더 길어지만, 쉼표와 변수명을 추가해주기만 하면 된다. 그리고 변수들을 위한 형식 지정자를 문자열 내에 하나씩 넣어주면 되는 것이다. 그럼 왼쪽에서 오른 쪽 순으로 지정된다. 즉, 첫 번째 %s는 첫 번째 쉼표 뒤의 변수에 해당하고, 두 번째 %s는 두 번째 쉼표 뒤의 변수에 해당한다는 것이다. 입력하고자 하는 값이 문자열이라면 모든 형식 지정자에 %s가 필요하다. 다른 형식 지정자는 뒤에 살펴보고자 한다.

Q2. 문자열을 합치는 또 다른 방법이 있나요?

▶있지만, 앞으로 배울 내용에 해당하며, 현재로서는 printf()가 가장 쉬운 방법이다.

Q3. 문자열은 무엇일까요?

▶문자열은 쌍 따옴표 안에 들어간 0개 이상의 문자 배열이다. 즉, 다른 말로 하면 단어든 구절이든 문장이든 문단이든 0개 이상의 문자 혹은 알파벳 글자들이 쌍따옴표 안에 들어가 있다는 것이다.

Q4. 만약 \n이 쌍따옴표 밖에 있으면 어떻게 될까요?

▶오류가 발생한다.

2.3 컴파일하기

터미널창에 아래 명령어를 입력하여 컴파일을 할 수 있다.

$ clang -o string string.c -lcs50

여기서 -o stringstring.cstring.out 이라는 머신코드로 저장하도록 하는 명령어이다. -lcs50“link”라는 의미를 지닌 -l 이라는 인자에 우리가 추가로 포함한 “cs50” 파일을 합친 것이다. 이를 통해 컴파일시 cs50 파일을 연결하도록 알려줄 수 있다.

다소 복잡한 이런 과정 대신에, 아래 make 명령어를 통해 간단하게 컴파일을 수행할 수도 있다.

$make string

이와 같이 작성한 코드를 컴파일 하고 실행하면, 사용자에게 입력값을 받고 문장 내에 포함하여 출력하는 프로그램이 된다.




© 2020. by RIVER

Powered by RIVER