반응형

printf("Welcome, Let's C Language.");  // 초등학생도 쉽게 이해시켜주는 C언어 글을 포스팅합니다.

 

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

이번 글에서는 주석 처리에 대한 소개와 #0,#1에서 다뤘던 내용들을 복습하고자 하는 차원에서 소스코드를 하나 만들어보고자 합니다.

 

Q. 먼저 이전 시간에 배운 내용을 잠깐 복습해봅시다.

A. 1) scanf에 대해 배웠습니다.

- 함수가 어떤 값을 출력한다면 반대로 입력을 받을 수 있는 기능도 있을겁니다. 입력을 받는 기능을 하는 명령어가 scanf입니다. 현재는 표준이 scanf_s로 되었고 이는 '버퍼 오버플로우' 라는 현상을 막기 위해 개정되었습니다. 

 

2) 자료형 타입에 대해 배웠습니다.

- int , double, float , unsigned (자료형 타입) 등등에 대해 배웠습니다. 각각의 자료형 타입은 표현할 수 있는 범위와 메모리 크기에서도 각자 다른 값을 갖습니다.

 

 

딱 보고 기억 나는게 없다. 하면 바로 이 전글을 참고하세요. (설마 아직까진 쉬운데 까먹으셨을까??)

https://crush-on-study.tistory.com/207

 

[C언어] #1. 자료형 타입과 scanf 함수에 대하여

printf("Welcome, Let's C Language."); // 초등학생도 쉽게 이해시켜주는 C언어 글을 포스팅합니다. 안녕하세요. 비전공자 출신 SW Test 엔지니어 Crush on Study입니다. 이번 글에서는 자료형 타입에 대한 소개..

crush-on-study.tistory.com

주석 처리 설명을 위한 소스코드

반응형
// 야, 이것도 출력해봐 컴퓨터야 ㅋㅋ
// 아니, 못해? 이걸 출력못해??????????? 

#include <stdio.h>

int main()
{   
    int tall;

	printf("How much your tall? : ");
    scanf_s("%d",&tall);

    printf("Your tall is %d",tall);

	return 0;
}

이전 시간에 짜놨던 소스코드에서 // 라는 걸 이용해서  제가 이상한 문구를 적었습니다. 하지만 이를 실행하면 제가 깝쭉거린 대사는 출력되지 않습니다. 그게 바로 // 때문인데요. 이걸 바로 '주석' 이라고 합니다.

주석은 프로그래밍을 하는데 있어서 구독자, 코워커에 대한 배려라고 할 수 있습니다. 또한, 자기 자신을 위한 것이기도 합니다. 

코드에 대한 설명을 할 때 주로 쓰는데요.  한줄로 설명할꺼면 //을   여러줄로 설명할꺼면 /* */로 하면 됩니다.

주석 2

이렇게 해도 초록색으로 칠해진게 보입니다. 초록색으로 칠해진 부분은 출력에 영향을 전혀 주지 않는다! 라고 이해하시면 되겠습니다.

 

자, 그러면 지금까지 배운걸 토대로 우리 인생의 첫 프로그램을 짜보도록 합시다.

소스코드의 목적은  1. 이름  / 2. 키  / 3. 몸무게    이 3개의 정보를 입력받아서 출력하고자 합니다.

소스 코드 하나하나씩 살펴보겠습니다. 거의 다 챕터0, 챕터1에서 배웠던 내용이고 2가지 정도만 새로 보이는 개념이네요. [ ] 랑 \n (역슬래시 n) 인데요. 일단 이거 제쳐두고 우리가 먼저 아는 것들부터 봅시다.

1. 변수를 먼저 선언했습니다.
키랑 몸무게 그리고 이름을 입력받고자 했습니다. 그렇기 때문에 가장 먼저 이들을 선언해줬습니다. 
2. printf & scanf_s를 통해 키,몸무게,이름을 입력받고 출력하였습니다.
각각의 자료형 변수 타입에 해당하는. 그러니까 int -> %d / float -> %f / char -> %s를 매칭시켜줬습니다.
%d,%f는 앞에서도 배운 내용이니까 익숙하실텐데 %s는 처음보는 것일겁니다.
char 자료형은 크게 2가지 형식지정자와 매칭이 됩니다. %c랑 %s인데요.
c의 경우는 '문자 하나'만을 받을 때 쓰는거고 s의 경우는 '문자 하나 뿐만 아니라 여러 문자들'까지 받을 때 씁니다.

* 보시면 char에다가 값을 선언해준게 "Crush"입니다. 만약 %c라고 했다면 앞에 C 하나만 출력이 됩니다. 왜냐? c라는 형식지정자는 문자 하나만을 입력받는다 했으니까 제일 앞에있는 C만 출력되겠죠. 이해되셨나요?
그래서 사실, c를 쓸 일은 거의 없습니다. 웬만하면 s 형식지정자를 사용하도록 합시다.

** char를 선언하고 printf마냥  문장 혹은 단어를 출력하기 위해서는 " " 큰따옴표를 이용해야 합니다. 작은따옴표해도 되긴해요.
3. ,tall  / ,weight / ,name이 뭐지?
printf를 출력할 때, 입력받은 값을 출력하기 위해선 위 코드에 나온 것처럼 큰따옴표 뒤에 (, 함수명)을 적어줘야 합니다. 

 

* 그럼 이제 안배운 내용을 한번 봅시다. 

1) [ ]가 뭐에요? 

- 아직 완전 기초단계임에도 불구하고 배열 개념을 불가피하게 쓰게 된 점이 죄송스럽지만 뒤에 굉장히 자세히 설명해드릴테니 오늘은 개념만 간단히 설명드릴게요.

이 괄호를 C언어에서는 배열(array)이라고 부릅니다. 예를 들어서요.

int a = 1;
int b = 2;
int c = 3;
int d = 4;
int e = 5;

이렇게 있다고 합시다. 변수 5개의 값들을 일일이 지정해줬는데요. 여간 귀찮은 일이 아닙니다. 그래서 이걸 간단히 표현하고자 생각한게 배열입니다. 변수 5개를 한 곳에 담아두자는 의미에서

int arr[5] = {1,2,3,4,5};

라고 표현을 합니다. arr은 함수의 이름입니다. 그리고 [5]는 arr라는 배열함수가 5개의 칸을 할당받았다. 라는 겁니다.

그리고 그 5개의 칸에는 각각 1,2,3,4,5라는 값이 저장되어있다. 라고 보시면 됩니다.

 

Q. 그러면 [ ]라고 비워둔 이유는 뭔가요?

A. 비워도 됩니다. 단, arr[]={1,2,3,4,5}; 이런 식으로 배열함수에 무슨 값들이 저장되어있는지 적어줘야합니다. 

그러면 굳이 [5]라고 적지않아도  "아, 값이 5개가 있으니까 5칸이겠구나." 라고 인식을 합니다.

그래서 "Crush"를 썼을 때, 굳이 [6]이라고 적지 않은 것입니다.

 

Q. 왜 [5]가 아니라 [6]인가요?

A. 자, 여기서 더 깊게 들어가면 여러분들 C언어 흥미 잃어버립니다. 그러니까 이 부분은 다음에 배열 제대로 배울 때 언급하겠습니다.

 

 

2) \n가 뭐에요?

출력값 화면

\n을 쓰면 출력을 할 때, 저런 식으로 Enter (개행)가 적용된 상태로 출력이 됩니다. 만약 \n을 안하면 Enter가 적용되지 않고 쭉 한 줄로 이어진 출력값을 마주하게 됩니다.

\n은 가독성을 위해 꼭 필요한 개념이므로 앞으로 자주 쓰게 될 것입니다.

반응형
반응형

printf("Welcome, Let's C Language.");  // 초등학생도 쉽게 이해시켜주는 C언어 글을 포스팅합니다.

 

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

이번 글에서는 자료형 타입에 대한 소개와 scanf함수에 대해 설명하고자 합니다.

 

Q. 먼저 이전 시간에 배운 내용을 잠깐 복습해봅시다.

A. 1) 전처리구문과 헤더파일에 대해 배웠습니다.

- 전처리구문은 main함수 및 그 외의 함수들을 실행하기전에 먼저 컴퓨터가 인식하고 가야할 것들을 가리킵니다.

- 헤더파일은 함수를 선언하기 위한 기본적인 라이브러리들을 의미하며, 이는 사용자의 입맛에 따라 커스텀을 할 수도 있습니다. 이 때, 커스텀한 헤더파일은 " "로 표기하며, 기본 헤더파일은 < >로 표기합니다.

 

2) int main()와 printf , return에 대해 배웠습니다.

- int는 함수의 자료형 타입 / main은 함수의 이름 / ()는 매개변수 (여기선 비어있으므로 =void)의 자리임을 알게 되었습니다. 그리고 printf란 뒤에 나온 문장들을 화면에 출력시켜달라는 명령어임을 배웠습니다.

return은 함수의 자료형 타입이 void가 아닌 다른 자료형 타입이 선언되었을 경우 적어주는 함수의 '마침표' 같은 기능을 함을 배웠습니다.

 

 

딱 보고 기억 나는게 없다. 하면 바로 이 전글을 참고하세요. (설마 까먹으셨을까?)

https://crush-on-study.tistory.com/206

 

[C언어] #0. C언어를 왜 배워야 하는가? / "Hello World"

printf("Welcome, Let's C Language."); // 초등학생도 쉽게 이해시켜주는 C언어 글을 포스팅합니다. 안녕하세요. 비전공자 출신 SW Test 엔지니어 Crush on Study입니다. 오늘부터 티스토리에서도 C언어를 포스팅

crush-on-study.tistory.com

#1. 두번째 강의 소스코드

반응형
#include <stdio.h>

int main()
{   
    int tall;

	printf("How much your tall? : ");
    scanf_s("%d",&tall);

    printf("Your tall is %d",tall);

	return 0;
}

우리가 가장 먼저 볼 소스코드는 int tall;입니다.

int tall;
1. int tall; : ?? 이게 뭘 의미하나요? 이거는 tall이라는 함수를 int라는 자료형 타입으로 선언을 하겠다. 라는 의미입니다. tall의 값은 지정되어있진 않지만  일단 우리는 이 소스코드를 통해 tall을 탄생시켰습니다.

나는 값을 넣어주고 싶다. 하시면 int tall = 0; 이런 식으로 넣어도 됩니다. 0이 아니라 무슨 숫자를 넣든 상관없어요.

근데 여기서 주의해야할 점. 바로 int가 가지는 의미와 범위입니다.

앞에서 #0번 C언어 글에서 적었지만 int는 정수를 의미하는 integer의 약자입니다. 즉, 소수는 허용되지 않습니다. -200, 0, 26 같은 음의 숫자, 0 , 양의 숫자만 인정됩니다.  그리고 이 정수가 가지는 범위는 한정되어 있습니다.

자료형 변수의 메모리 크기 & 범위

위의 표를 봅시다. int가 가지는 범위는 -2147483648 ~ +2147483647 이라 나왔습니다. 만약 여러분들이 int tall에다가 집어넣은 값이 2147483647로 끝부분의 범위에서 +1만 더해주면요.

쓰레기 값

이런 결과값이 출력이 됩니다. 음? 2147483648를 입력했는데 왜 다른 값이?? 그야 int가 가지는 범위를 초과한 값을 입력했기 때문에 이상한 결과가 나온 겁니다. 우리는 이걸 '쓰레기 값'이라고 부릅니다. 

그럼 이걸 수정하려면 더 큰 범위를 가지는 자료형 변수로 수정해서 선언해야겠죠? float도 있고 long long도 있네요.

근데 이 둘을 보면 둘 다 범위는 int보다 큰데 메모리 크기에서 차이가 보입니다. float는 4byte고 long long은 8byte네요. 그러면 인간적으로 메모리를 덜 잡아먹는 자료형 변수를 사용하는게 효율적인 프로그램이 될 것입니다.

 

따라서 우리는 float를 사용해서 다시 소스코드를 고쳐보고 동일한 값을 넣어보도록 하겠습니다.

#include <stdio.h>

int main()
{   
    float tall;

	printf("How much your tall? : ");
    scanf_s("%f",&tall);

    printf("Your tall is %d",tall);

	return 0;
}

오 이제 원하는 값대로 나오네요. 그쵸? float가 실수형 타입이다보니 뒤에 소수점까지 나오긴했지만 그래도 입력한 값이랑 똑같이 나왔습니다.

 

* char같은 문자형 타입을 제외하곤 정수&실수에서는 'unsigned (자료형 타입)' 이라는 선언을 심심찮게 볼 수 있습니다. 이 의미는 음의 숫자를 제외하고 그 만큼을 양의 숫자의 바운더리에 추가해라! 라는 뜻입니다.

쉽게 말하자면 -10~10이라는 범위를 가진다는 aaa 라는 자료형 타입이 있다 하겠습니다. 이 때, unsigned aaa 라고 선언하면 범위는 0~20이 됩니다. 

 

 

추가로 볼 개념은 scanf입니다.

scanf
1. 버퍼 오버플로우 : 소스코드를 보시다 문득 의문이 드신게 있을 겁니다. 이번 글의 제목. 그리고 이 테이블에서의 제목은
scanf인데 왜? 소스코드에선 scanf_s를?? 적었을까요? 

일부 IDE (통합개발환경 툴)에서는 scanf를 적을 시, 컴파일 에러가 나는 경우가 있습니다. scanf 함수는 형식지정자에 맞춰서 값을 입력받고 이를 할당된 메모리 주소에 값을 넣습니다. 이 입력 인자로 받은 주소에 값을 저장하는 과정에서 할당된 메모리의 크기를 벗어날 위험이 있습니다. 이걸 바로 "버퍼 오버플로우"라 합니다. 현재는 scanf대신 scanf_s를 표준으로 삼곤 하는데 가끔은 scanf해도 에러가 안나는 버전이 있기도 합니다.
2. 형식지정자? : 위에서 빨갛게 칠한 단어. 형식지정자란 뭘까요? 소스코드를 보시면 int형 타입의 함수값을 입력받을 때는
scanf_s(%d")를  float형 타입의 함수값을 입력받을 때는 scanf_s(%f")를 선언해줬습니다.
즉, 형식지정자란 값을 입력받거나 출력할 때, 자료형 타입에 대응되는 '약속'들을 의미합니다. 이 부분이 C언어에서 몇 안되는 외울거리들 중 하나입니다. 여러번 복습하고 직접 코드를 짜보면서  표를 보지않고도 쓸 수 있도록 합시다.
3. 메모리 주소 : scanf_s에서 형식지정자를 정하고 뒤에 '&' 라는 기호를 적었습니다.  &라는 기호를 앰퍼샌드라고 부르는데요. C언어에서 &는 함수에 대한 메모리 주소를 호출하는데 사용합니다. 만약 scanf_s를 쓸 때, &를 적지 않으면 컴파일 에러는 뜨지 않으나 실행이 안되는 현상을 마주하게 됩니다. 까먹지 말고 꼭 표기합시다. 저도 가끔씩 까먹어요 ㅋㅋㅋ 

 

#define _CRT_SECURE_NO_WARNINGS

- 아, 나는 scanf_s 쓰기 싫다. 뭐하러 두 문자 더 추가해줘야하냐? scanf할랭!! 하시는 분들을 위한 전처리구문입니다.

위 전처리구문을 소스코드 제일 위에다 선언해주시면 scanf함수에 대한 에러를 무시하고 사용할 수 있게 해줍니다.

근데 코딩테스트 같은거 볼 때 그냥 scanf_s가 표준이니까 귀찮더라도 이거 씁시다 ㅎㅎ

 

 

복습

Q1. scanf_s 함수를 통해서 본인의 키랑 몸무게를 출력해보세요. 이 때, 키는 정수형 자료로  몸무게는 실수형 자료로 선언하세요.

Q2. 오늘 배웠던 자료형 타입의 표에서 가장 작은 메모리 크기를 가지는 자료형 타입은 무엇인가요?

반응형
반응형

printf("Welcome, Let's C Language.");  // 초등학생도 쉽게 이해시켜주는 C언어 글을 포스팅합니다.

 

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

오늘부터 티스토리에서도 C언어를 포스팅하고자 합니다.

 

Q. 요새 코딩이 필수가 되어가고 있는데, 무슨 언어를 배우는게 좋을까요? 파이썬이 쉽다던데 파이썬할까요?

A. 본인이 무슨 분야를 하고싶냐에 따라 접근할 언어가 다릅니다.

Python같은 경우는 요즘 핫한 A.I / 데이터분석에서 강한 모습을 보이고 있습니다. 

웹,앱서비스에 관심이 많다면 Java,Visual C/C++ 혹은 웹서비스 3대장이라 불리는 HTML/CSS/JavaScript를.

임베디드같이 하드웨어에 관련된 프로그래밍을 하고자 한다면 C/C++을.

게임을 만들어보고 싶다면 C#을.

가장 최신 트렌드 언어인 코틀린,GO 등등.

 

본인이 추구하고자 하는 분야에 따라 얼마든지 여러갈래의 길이 있습니다.

그럼에도 불구하고 C언어를 먼저 포스팅하게 된 이유.

 

- 일단 제가 C언어를 다루는 현직이라 다른건 잘 모릅니다ㅋ. 그러나, C언어를 배우면 확실히 컴퓨터의 실행 프로세스라던가 메모리 구조, 그리고 다른 언어로 영역을 넓히고자할 때의 용이함. 이러한 부분에서 강점을 드러내고 있다 생각합니다.

 

아무튼 아직도 학교 수업에서 프로그래밍을 처음 접한다하면 C언어 혹은 Python으로 시작할만큼 가장 큰 입문용어로 꼽히기도 합니다. 그럼 지겹도록 보셨겠지만 기본적인 입출력 헤더파일과 이를 실행해볼 소스코드에 대해 알아보겠습니다.

여러분들의 생애 첫 프로그래밍 화면

 

반응형
#include <stdio.h>

int main()
{
	printf("Hello, Hell!");

	return 0;
}

우리가 가장 먼저 볼 소스코드는 #include <stdio.h>입니다.

#include <stdio.h>
1. # : #은 전처리구문에서 사용되는 특수 문자로 main함수를 실행하기 전에 #처리 된 부분을 먼저 인식하고 들어가라! 라는 의미라고 생각하시면 됩니다.
2. include : 어원 그대로 '포함'을 의미합니다. 이번 소스코드를 수행할 때 컴퓨터. 자네는 바로 나, include의 뒤에 이어 나올 헤더파일을 포함해서 인식해달라.  라고 보시면 됩니다.
3. stdio.h : Standard input/output의 약자입니다. 많은 분들이 말씀하시길  '스튜디오 에이치요!!' 라고 하는데, 솔직히 저도 처음에 이거 스튜디오인줄 앎 ㅎㅎㅎ;;  약간 소스코드를 실행시킬 스튜디오 공간을 의미하는건가? 이렇게 생각해도 얼추 비슷한거 같아서 한동안 스튜디오 스튜디오 거림 ㅎㅎ.  아무튼  printf, scanf와 같은 기본적인 입출력 함수를 담고 있는 라이브러리(=헤더파일)라고 생각하시면 됩니다.

* 나중에 배우겠지만 위 소스코드에서는 <stdio.h>로 괄호처리를 했는데요. 가끔가다 보면 헤더파일을 선언할 때, " "같이 큰따옴표로 처리하는 경우가 있습니다.
<>로 표기한 헤더파일은 기본 라이브러리를 의미하고 " "로 표기한 헤더파일은 사용자가 직접 커스텀한 라이브러리를 의미합니다.

처음부터 굉장히 자세하게 설명을 한거 같은데 요약하자면 여러분들이 프로그래밍을 할 때 사용할 함수들이 잘 선언될 수 있도록 해주는게 헤더파일을 정의한다! 이다. 라고 보시면 되겠습니다.

 

다음으로 볼 소스코드는 int main() 함수와 printf & return입니다.

int main()
1. int : int는 정수형 자료를 의미하고 바로 다음 포스팅에서 다룰 내용이긴 합니다. 통상적으로 우리는 C언어에서 main함수를 선언하고자 할 때, 자료형 타입을 int로 잡곤 합니다. 이게 뭐냐면 main이라는 이름의 함수는 정수형 타입으로 정의하였다. 라고 보시면 됩니다. 
2. main() : main은 함수명입니다. 그리고 함수 옆에는 매개변수를 적는데 지금 보시면 ()에 아무것도 들어있지 않습니다. 즉, 매개변수는 비어있음을 의미합니다. 
보통 이렇게 어떤 함수를 만들고자 할 때는   1. 자료형 타입 2. 함수의 이름 3. 매개변수 선언    이렇게 3가지 구조로 이루어집니다.  즉, int main()는   1. 자료형 타입 : 정수  / 2. 함수의 이름 : main   /  3. 매개변수 : 없음 (=void) 를 의미합니다.

자료형 타입이 int로 지정된 함수의 경우는 return값을 반드시 적어줘야 합니다. void main() 이런 식이라면 자료형 타입이 비어있다는 뜻으로 반환해줄 필요가 없으나, 그 이외의 자료형 타입이 적혔다면 모든 함수의 끝에는 항상 return을 표기해줘야 합니다. 우리가 C언어에서 각 구문마다 세미콜론 ; 를 달아줌으로써 그 구문의 '마침표' 기능을 하듯이.  return도 함수의 '마침표' 기능을 한다. 라고 보시면 될 것 같습니다.

 

근데, 소스코드에서 나온 return 0;에서 0은 무엇인가? 이는 코드가 정상적으로 실행을 마쳤다 라는 의미를 담기도 하지만 아스키코드 상에서 0은 NULL을 의미하기도 합니다. 즉, 매개변수가 ()로 비어있기 때문에 반환해줄 값이 없으므로 int main함수를 return 0;으로 마침표를 찍겠다. 라고 이해하시면 됩니다. 

 

printf("Hello, Hell!");
1. printf : 가장 자주 보게될 명령어. printf입니다. printf를 적어주면 옆에 (   ) 안에 담긴 내용을 화면에 출력해라! 라는 명령을 하게 됩니다. 

굉장히 간단한 소스코드를 하나 적었을 뿐인데, 벌써부터 필자가 TMI짓을 하고 있습니다. 그렇지만 각 명령어,구문이 무엇을 뜻하는지 처음부터 TMI로 이해하고 들어가야 개념이 빠르게 잡힙니다. 단순히 학교수업을 통해서 printf("Hello, World!"); 만 기계처럼 따라해서 적었다면, 이번엔 제 글을 통해서 이 printf에 담긴 많은 의미를 곱씹어보면서 이해해가도록 해봅시다.

 

 

복습

Q1. printf 함수를 통해서 본인의 이름을 출력해보세요.

Q2. 만약 main 함수의 자료형 타입이 void 라면 return을 표시할 필요가 있다? 없다?

반응형

+ Recent posts