[C언어] # 0. C언어의 첫걸음, printf & scanf함수

Crush_on_Study·2022년 6월 5일
0

C언어 기초

목록 보기
1/11
post-thumbnail

안녕하세요, 비전공출신 SW엔지니어 Crush on Study입니다.

C언어 글을 다시 한번 오랜만에 복습차원에서 적게 되었습니다.
네이버와 티스토리에서도 다뤘지만, 그때보다 좀 더 기술적인 면에서 업그레이드 된 상태에서 시작하므로, 더 쉽게 이해할 수 있도록 노력해보겠습니다.

헤더파일 (디폴트)

0. 헤더파일 : #include <stdio.h>

> #include <stdio.h>

int main()
{
	printf("제 코드가 잘 보이시나요?");
    return 0;
}

위 코드는 앞으로 우리가 C언어를 공부하면서 자주 볼 함수들이 담겨있습니다.

제일 먼저, stdio.h입니다. 제목에도 적었듯이 stdio의 뒤에 .h은 "헤더파일"을 의미합니다. 헤더파일은 우리가 프로그래밍을 할 때, 사용하는 여러 함수들을 담고 있는 일종의 '라이브러리' 같은 것인데요.
<> 형태로 선언하는 헤더파일을 "표준 헤더파일"이라 하고, " " 형태로 선언하는 것을 "사용자 정의 헤더파일"이라 합니다.

쉽게 말해서, <>는 C언어에서 제공하는 디폴트고 " "는 유저가 커스터마이징한 헤더파일이라는 뜻으로 생각하면 됩니다.


#include <stdio.h>

Okay, 그럼 stdio.h은 무슨 기능을 담고있고 #include는 무슨 의미인가요?


  • stdio.h는 여러 기능들을 담고있지만 일단 제일 먼저 알아둘 것은 입출력함수기능을 제공한다는 것입니다.
    보셨겠지만, printf는 해당 문구를 출력하라는 것이고 scanf는 입력을 받는 함수입니다.

  • 그러면 #include는? 헤더파일을 선언하는 명령어입니다. 영어 뜻 그대로 '포함하다'의 의미를 갖고있는데요. 해당 프로그램에서는 <stdio.h>라는 헤더파일을 갖고오겠다! 라는 명령어라 보시면 되겠습니다. 그리고 헤더파일을 갖고오기 위해서는 항상 '#'을 이용해야한다는 것까지, 알아두시면 되겠습니다.

예시를 들자면

#include <stdio.h>  // 대표적으로 입출력 기능을 제공
#include <stdlib.h> // 대표적으로 동적할당 및 랜덤함수 기능 제공
#include <string.h> // 문자열 기능 제공
#include "Crush"  // 사용자 정의 헤더파일

이렇게 선언하면 됩니다. 이렇게 선언된 헤더파일들은 시스템이 종료될 때까지 프로그램 상에서 남아있게 됩니다.

main함수의 의미와 자료형

1. main함수 , 자료형의 종류들

int main()
{
	return 0;
}

처음보시는 분들은 대체 이게 뭔데? 하실텐데요. 우리가 회사나 대학을 다니면서 보고서를 작성할 때, 양식이 있듯이 C언어에도 기본적으로 지켜야 할 양식이 있습니다. 위 코드가 그러한 양식의 기본원문이라 보시면 됩니다.


  • int main()?
    int는 함수의 타입, main은 함수의 이름, ()는 함수가 입력받은 매개변수입니다. 입력받은 매개변수가 없을 때는 이렇게 ()로 공란을 두거나, 비어있다는 뜻으로 (void)라고 적기도 합니다.

  • 자료형?
    int같은 것을 자료형이라고 부르는데요, 이 자료형이라는 것은 변수를 선언할 때나 함수를 선언할 때 반드시 지칭해줘야할 것입니다. int의 경우는 영어로 integer의 약자로 '정수'라는 뜻을 담고 있습니다.

  • 그러면 main이라는 이름을 가진 함수는 정수형 타입인데 입력받은 매개변수는 없다. 라고 보면 되는가? 이게 대체 무슨 말인가?
    당연히 처음부터 바로 이해할 수는 없습니다. int main()은 사실 암묵적인 양식표현으로 기계처럼 쓰는 표현인데요. 우리가 main함수 말고도 다른 함수를 정의하고자 할 때, 그 함수를 통해 원하는 결과값을 내기 위한 프로그래밍을 할 것입니다. 그 때의 결과값이 정수인지 실수인지 아니면 문자인지에 따라 그에 상응하는 함수의 자료형을 선언해주면 됩니다.

#include <stdio.h>

int main()
{
  int a = 4; // 정수형 (4Byte)
  float b = 5.2; // 실수형 (4Byte)
  double c = 6.4; // 실수형 (8Byte)
  char d = 'Crush'; // 문자형 (2Byte)
  
  return 0;
}

이렇게 변수에 대한 자료형으로도 쓸 수 있구요. 첫 글부터 많은 것을 설명하면 이게 마지막 글이 될 수도 있음을 잘 알기에 오늘은 이 글을 보고
"아, 그냥 일단 main함수는 int형으로 받으면 되겠구나." 하면 됩니다.
앞으로 연재할 글들을 계속해서 읽어보시면 자연스레 이해하게 될 것입니다.


  • 근데 return은 뭔가?
    return은 void자료형을 제외한 나머지 자료형들로 선언이 될 때, 반드시 코드의 맨 마지막에 적어줘야하는 것입니다. 이름 그대로 '반환'의 의미를 갖고 있고 위 main함수는 코드수행을 마칠 때 '0'값을 반환한다는 뜻을 담고 있습니다.

이 사진에서 return value 0 이라고 적힌거 보이시나요?
printf함수가 해당 문구인 Welcome to Crush on Study Velog!를 성공적으로 출력한 뒤, 종료할 때 0 값을 반환했습니다.

여기서 말하는 0은 암묵적으로 '프로그램이 정상적으로 수행되고 마쳤다' 라는 약속표현입니다. 문제가 있다면 1 혹은 -1로 return을 합니다. 뭐 어떻게하든 상관없는데 교재나 수업들을 보면 return 0return 1을 제일 많이 사용합니다.

return에 대한 이야기도 추후에 다룰 것이니 아직은 0과 1이 그런 의미구나~ 하셔도 됩니다.


입력함수 scanf

2. 입력함수 scanf에 대해

출력함수가 있다면, 당연히 입력함수도 있을 것입니다. C언어에서는 이를 scanf라 하고, 마찬가지로 stdio.h 헤더파일에서 scanf함수도 제공합니다.

소스코드를 봅시다. 일단 우리가 앞에서 배운 내용들이 보입니다.
0. printf랑 scanf를 사용해야하므로 stdio.h 헤더파일을 #include로 해서 불러왔고...
1. 코드를 수행시키기 위해 main함수를 int형으로 받았고...
2. 프로그램이 정상적으로 수행 후 종료되었음을 알리기 위해 return 0;을 했고...
3. 변수 n을 정수형으로 선언했고...

어? 근데 %d는 뭐지? &은 뭐고?


자, 제가 앞에서 자료형에는 문자형, 정수형, 실수형 등등이 있다 했었습니다. 그럼 컴퓨터한테 변수 a는 정수형이니까 정수로 출력해라~ 이렇게 하면 알아들을까요?

그렇지 않습니다. 컴퓨터가 알아들을 수 있는 명령어로 정의를 해주어야 합니다.
정수형이라는 의미를 담고있는게 %d입니다. 이러한 명령어를 '형식 지정자'라고 합니다.


형식 지정자

형식 지정자의 종류들

형식 지정자자료형메모리 크기
%d정수형 int4Byte
%c문자형(문자 하나) char2Byte
%s문자형(문자열) char2Byte
%f실수형 float4Byte
%lf실수형 double8Byte

제일 많이 쓰이는 형식 지정자들만 먼저 모아봤습니다.
그러면 다시 돌아와서 소스코드를 봅시다.

여기서 변수 n은 정수형으로 선언되었습니다. 그러면 변수 n을 입출력하기 위해선 정수형에 대응되는 형식 지정자를 넣어줘야겠지요? 그래서 %d를 적은 것입니다.

만약 변수 n이 char거나 float였다면 위의 표를 참고해서 적합한 형식지정자로 입력을 하면 될 것입니다.


그럼 오늘 글의 마지막으로 & (앰퍼샌드)에 대해 설명하겠습니다.
얘는 앞으로도 자주 나올 기호인데, C언어에서는 &가 변수가 저장된 메모리 주소값을 호출하는 기능을 가집니다.

  • 이게 무슨 말이냐구요?

    위 소스코드를 봅시다. 정수형 타입의 변수 n을 선언해준 순간, n은 4Byte크기 메모리 공간을 할당받게 됩니다. 그리고 그 공간은 주소를 함께 부여받게 됩니다. 마치, 우리의 거주지처럼요. 저로 예시를 들면 Crush on Study는 경기도 고양시 일산동구에 살고있으므로 저라는 사람이 이 세상에 선언된 순간, 일산동구라는 주소값도 함께 배정받았다는 것입니다.

    컴퓨터도 똑같아요. 변수 n에 값을 입력해주기 위해 n이 살고있는 메모리 공간의 주소를 호출해야 확실히 입력을 해줄 수 있겠죠? 주소를 모르면 이 n이 어떤 n인지 모르니까요.

    여러분들이 큰맘먹고 이쁜 아이템을 샀는데 주소를 제대로 입력안했더니 다른 사람이 받았다? 이거 못참죠. 컴퓨터도 똑같습니다.


첫 글부터 꽤 많은 내용을 담게 되었네요. 자제하려고 했는데ㅎㅎ.. 첫 글만 조회수가 높지않길 바랍니다!

profile
방구석백수 코드몽키

0개의 댓글