본문 바로가기
프로그래밍/C & C++

<C> 기본예제 Day02 - 변수(1)(feat.주석)

by 리나그(ReenAG) 2020. 12. 24.
728x90
반응형

이번 시간에 배워볼 것은 변수를 다루는 법이다. 다만, 이번 시간에 본격적으로 예제를 작성하기 전에, "주석"이라는 것을 하나 배우고 가자.

 

이런 소스코드를 작성해보자 :

/*
 * Day03.c : 주석을 어떻게 다는지 알려주는 예제 
 */ 
#include<stdio.h> //printf를 이용하기 위해 필요

int main(){
	printf("hello world!"); //hello world!를 프린트함.
	return 0;
}

 

실행해보면 이전의 Day01에 실행 시켰던 것과 별반 다르지 않은 내용이 나온다.

 

/* 과 */ 사이에 있는 것은 "주석"(Comment)이라고 한다. 이건 여러분들이 자유롭게 무언가를 적어 놓을 수 있는 부분이다. 왜냐하면 컴파일러에서 이 부분은 코드로 간주하지 않고 무시하기로 약속했기 때문이다. (컴파일러에 대한 내용은 차후 설명하겠다.) 물론 필요없는 것이 아니냐고 물을 수 있지만, 절 . 대 그렇지 않다. 주석을 달아서 이 코드가 무슨 역할을 하는지, 어떻게 동작하는지 등을 인간의 언어로 다른 사람에게 전달해주는 필수적인 역할을 하기 때문이다. 좀 어려워 보이는 코드도 주석을 달아 "이건 이렇게 동작하는 거에요!"라고 설명해주면 이해하기 쉬울 것이다.

 

주석을 다는 방법은 다음과 같다 :

 

문자

쓰기 좋은 곳

한 줄 짜리 주석

//

if, for 등의 제어문 뒤나 앞

여러 줄 짜리 주석

/*, */

소스파일의 서문, 어려운 코드

// 주석은 어떤 이해하기 어려운 명령문 뒤에 달아 무슨 역할을 하는지, 간략하게 표현할 때 이용하기 제일 좋다. 물론 그게 아니어도 좋다.

 

자 이제 변수라는 것이 무엇인지 배워보자. 변수는 영어로 "Variable"이라고 하며, 수학에서는 "바뀌는 수"를 의미한다. 프로그램에서는 이 변수를 일종의 "저장 공간"으로 취급한다.

 

다음의 예제를 작성해보자 :

#include<stdio.h> 

int main(){ //프로그램 시작!
      int a; 
      a = 5;
      printf("변수 a에 들어있는 값은 <%d>입니다.", a); //a에 들어있는 값을 print하는 코드
      return 0; //프로그램 끝!
}

 

이 예제를 실행하면, 다음과 같은 Output을 볼 수 있다.

코드가 확확 바뀌어 버린 것 같아서 좀 당황스러울 수도 있지만, 차근히 알아가보자.

우리는 코드의 4번째 줄을 보아보자.

int a;

intInteger의 줄임말이다. Integer는 "정수"를 의미하는 말이다. 컴퓨터 업계에서는 이런 동작을 선언(Declaration)이라고 한다.

 

나 : 야 컴퓨터~ 나 이거 기억하기 힘든데 기억해 줄래?

컴퓨터 : 그래. 뭘 기억해 줬음 좋겠는데?

나 : 어떤 정수형 숫자야.

컴퓨터 : 너 전에도 그런 숫자 기억해 달라고 그랬잖아. 어떻게 구별할 거야?

나 : 그럼 내가 a를 가르쳐 달라고 하면 내가 방금 말한 그 숫자를 이야기 해줄 수 있어?

컴퓨터 : 알았어. a라는 거지?

 

대강 이런 식의 의미를 지닌 코드이다. 컴퓨터에게 정수형 데이터를 기억할 저장공간을 하나 부탁하는 것이다.

a = 5;

 

그 후, a에 5라는 숫자를 대입한다. 수학에서는 등호가 "같다"는 의미로 사용되지만, 여기선 아예 다른 의미이다. 5라는 상수값을 a라는 변수에 대입하라는 소리이다. (이것은 차차 설명할 연산자의 일종이다.)

 

<2021 - 03 - 02 수정>

혹시 대입을 한다는게 무슨 뜻인지 모르겠다면, 이런 코드를 한 번 봐보자.

a = a + 5

이 코드를 보면서 "이건 말도 안되는데?"라는 생각이 든다면 잘 된 것이다. 코드에서의 '=' 기호와 수학에서의 '=' 기호가 수행하는 기능이 다르다는 것을 알아챈 셈이니까. 이 코드는 기존의 a에 5를 더한 값을 다시 a에 넣으라는 기능을 가지고 있다. 보통이라면 말도 안되는 글이지만 컴퓨터 언어의 세계에서는 a에 5를 더해달라는 부탁인 것이다.

 

printf("변수 a에 들어있는 값은 <%d>입니다.", a);

이젠 a에 무슨 값이 들어있는지 알아내는 일만이 남았으니, printf함수를 이용해서 a에 뭔 값이 있는지를 알아낸다. 그렇다면, 우리가 썼던 printf문에 변수를 출력해 본 적이 없으니, 쓰임새에 관해서 설명하겠다.

 

이 코드가 실행되었을 때, "변수 a에 들어있는 값은 <5>입니다."라는 출력이 나온 것을 미루어 보아, "%d"라는 문자가 "5"라는 출력으로 치환 되었음을 알 수 있다. 실제로, %d는 "추가로 입력받을 정수형 데이터를 이곳에 대신 출력하라"는 뜻을 가지고 있다.

 

따라서 이렇게 써도 똑같은 결과가 나온다 :

printf("변수 a에 들어있는 값은 <%d>입니다.", 5);

 

물론 이렇게 코드를 쓰면 a의 값을 읽어들이지 않고 무조건적으로 5라는 숫자만을 내보낼 것이다. 그리고, 5라는 숫자 말고도 다양한 숫자를 넣어서 확인해 보자. 절댓값이 너무 큰 정수나 실수(소수점이 있는 숫자)등을 쓰지 않는 이상은 제대로 출력될 것이다.

 

코드 분석을 끝냈으니 "자료형"에 대한 설명을 하겠다. 변수가 가질 수 있는 데이터의 형식을 가르켜 "자료형"이라고 하는데, python, ruby등 고급 프로그램 언어에서는 그런 것 없이 그냥 바로 "변수"만을 선언하는 경우도 있다. 그렇지만 여전히 C/C++, Java등에서 자수 쓰이고 이용되는 개념이기에 잘 숙지 해야한다.

 

자료형에는 우리가 살펴본 "int" 정수형 데이터를 제외하고도, "float, double"등의 실수형 데이터, "char"등의 문자 데이터, "short, long"등의 정수형이지만 메모리를 제어하기 위해 쓰이는 자료형등 다양한 자료형이 있다.

 

새로운 데이터를 이용해보는 예제를 짜보자.

#include<stdio.h> 

int main(){
      char a = 'm'; //a라는 이름의 char형 변수를 선언한다.
      printf("a에 들어있는 값: %c\n",a); //이전 처럼 %d가 아니라 %c라는 것에 유의! 
      printf("a의 크기 : %d",sizeof(a)); 
      return 0; 
}

 

Output :

변수 a 안에 문자를 담을 수 있다.

char는 character의 줄임말인데, 1개의 문자를 담을 수 있는 데이터 형이다. 작은따옴표는 C언어 문법에서 하나의 문자로 취급되고, 그 안에 어떤 문자를 집어 넣을 수 있다. 다만, 영문자나 몇몇 특수기호들만 넣을 수 있다.

printf("a의 크기 : %d",sizeof(a));

 

그 이유가 궁금할 것 같아서, 기묘한 코드를 하나 더 집어 넣었다. 이 코드는 변수 a의 byte크기를 돌려준다. 즉, 변수 a는 1byte의 저장공간을 차지한다는 뜻이다.

 

byte란, 컴퓨터에서 이용하는, 일반적인 수준의 최소 저장 공간 단위이다. 10진수로 0~255, 16진수로 0x00~0xFF까지의 범위를 가진, 총 8bit의 저장 단위를 이야기한다. 일반적으로 우리가 파일 용량을 이야기 할 때, 몇 킬로"바이트", 몇 메가"바이트"할 때의 그 바이트가 맞다.

여기서 byte에 대한 이야기를 자세히 하는 것도 좋겠지만 그것은 나중에 하고, 이것은 본인이 위키백과 등을 찾아보아 무슨 개념인지 대강 습득해오기를 바란다. 차후 이것을 자세히 한 강좌가 있으면 링크를 걸도록 하겠다.

 

아무튼, char의 용량이 1byte가 전부라는 뜻은 달랑 256가지의 경우의 수 밖에 표현하지 못한다는 뜻이기도 하다. 여기에 세상의 모든 문자를 표현할 수는 없었고, 그래서 영문자(대소문자)와 몇몇 컴퓨터 특수기호와 신호등을 char안에 어떻게 표현할지 미국인들이 멋대로 정해놓았다. 어떻게 표현할지 정해놓은 것을 우린 ASCII코드 라고 부른다.

 

char도 사실은 그냥 "이 숫자는 이 문자를 표현해"라고 정의내렸을 뿐이지 0~255사이의 숫자를 이용하기 때문에 직접 숫자로 이 값들을 할당할 수도 있다. 다만, 권장되지는 않는다.

 

그럼 그 다음은 float와 double을 다루어 보도록 하겠다 :

#include<stdio.h> 

int main(){
      float a = 3.141592f;//float 변수를 선언할 때, f를 끝에 붙인다!
      printf("a에 들어있는 값: %f\n",a); //여기도 %c대신 %f!
      printf("a의 크기 : %d\n",sizeof(a));
      
      double b = 3.141592; //double 변수를 선언할 때는 f를 붙이지 않는다. 
      printf("b에 들어있는 값: %f\n",b);
      printf("b의 크기 : %d\n",sizeof(b));
      return 0;
}

 

Output :

float, double은 어디까지 얼마만큼 정확하게 표현하느냐의 차이를 갖는다.

float는 정수말고도 실수를 저장할 수 있게끔 디자인된 자료형이다. 실수형 자료들을 출력할 때, 계산할 때, 깔끔하게 떨어지지 않고 끝에 아주 작은, 10^-16정도의 오차가 생기기도 하는데, 그건 이 실수를 저장하는 방식에서 기인한다. 다만, 이 이야기는 필자도 잘 모르므로 다른 자료를 찾아보는 것을 추천한다.

 

하여간,C에는 다양한 자료형들이 있다는 것을 알아보았다. 앞으로 자주 쓰고 자주 볼 자료형들을 따로 표로 정리해보았다.

 

표현

자료형

크기

표현 문자

기본형

형 없음

void

해당사항 없음

 해당사항 없음

문자

char

1byte

 %c

정수

short

2byte

 %d

int

4byte

 %d

long

4byte

 %ld

long long

8byte

 %ld

실수

float

4byte

 %f

double

8byte

 %f

포인터

*

4byte(시스템 사양)

 %p

사용자 정의 자료형

열거형

enum

-

해당사항 없음

구조체형

struct

구조체 변수의 크기를 전부더한 것

해당사항 없음

공용체형

union

공용체 변수 중 제일 큰 메모리를 차지하는 것

해당사항 없음

표현 문자는 printf에 원하는 자료형을 표시할 때 쓰인다. 저렇게만 쓰이는 것은 아니고 여러가지 옵션이 있는데, 그것도 설명할 것이다. 또, 사용자 정의 자료형은 기본적인 자료형을 이용하거나 자료형을 직접 만들어 관리하는 것이다.

 

이것으로 변수에 대한 실질적인 설명을 마치도록 하겠다. float정수부와 실수부의 저장방식, printf에 대한 자세한 설명등 이미 변수에 대해서 이론적으로도 실질적으로도 설명해야할 것이 너무 많은데 비해 처음이라 그런지 다 적을 수 없을 듯하다. 세부적인 사실에 대해서는 다양한 포스팅을 한 후에 링크를 거는 식으로 보강하도록 해야겠다.

728x90
반응형