Chapter 2 변수

https://raw.githubusercontent.com/KuraiLuna/KuraiLuna.github.io/master/practical/C/%EC%94%B9%EC%96%B4%EB%A8%B9%EB%8A%94%20C %20%EC%96%B8%EC%96%B4/Chapter-02/Chapter-02-%EB%B3%80%EC%88%98.gif

변수란 무엇인가?

퓨터는 많은 내용을 기억해야 한다.

정확히 말하면,컴퓨터의 ‘메모리’ 라는

부분에 전기적인 신호를 써 놓은 것이다.

컴퓨터가 무엇을 기억해야 되냐고

생각할 수 있지만···。

그렇다면 컴퓨터는 이러한

데이터들을 어떻게 기억을 할까?

바로 컴퓨터의 메모리,

즉 램(RAM)이라는 특별한 기억공간에

이를 기억공간에 이를 기록한다.

보통 우리는 흔히 램을 설명한다면

아래 처럼 표시한다.

https://raw.githubusercontent.com/KuraiLuna/KuraiLuna.github.io/master/practical/C/%EC%94%B9%EC%96%B4%EB%A8%B9%EB%8A%94%20C%20%EC%96%B8%EC%96%B4/Chapter-02/%ED%91%9C.png

마치, 각 방에 데이터들이 저장된다.

이 떄,

컴퓨터는 각 방에 이름을

붙이는데 단순하게 숫자로

이름 을 붙인다.

0 번, 1 번, 2 번, ··· 와 같이,

우리 대부분이

사용하는 32 비트 CPU에서는

최대 2şš개(4GB) – 총, 42억개

달하는 방을 가질 수 있게 되겠지.

참고로 32비트 숫자를 매번 쓰는게

매우 힘들다,

대개 16진법으로 주소값을 나타낸다.

 
 

예를 들어서,

컴퓨터 0x12345678

부터 0x1234567B

부분에 내가 사용한 양에

관한 정보를 저장했다고 한다.

(이 한칸에는 1 바이트, 즉 -128 부터)

(127 까지의 수 데이터를 저장할 수 있다。)

C 언어에는 변수 라는 것이 있어서,

이 모든 작업을 쉽게 할 수 있다.

예를들어, 내가 mineral 이라는

변수에 저장했다고 한다. 그렇다면

 
 

컴퓨터는 ‘알아서’

메모리의 어딘가에

mineral 의 방을

주고 그 내용을 저장한다.

 

예를들어, 컴퓨터가 이

mineral 이라는 변수에게

4칸의 자리를 할당

해 주었다고 한다.

이는 아래 그림처럼 메모리상에 표시가된다.

https://raw.githubusercontent.com/KuraiLuna/KuraiLuna.github.io/master/practical/C/%EC%94%B9%EC%96%B4%EB%A8%B9%EB%8A%94%20C%20%EC%96%B8%EC%96%B4/Chapter-02/%EB%A9%94%EB%AA%A8%EB%A6%AC.png

이 때 나는 8을 더 추가해야한다고 본다.

만약 이전에 8을 추가한다면

2×12345678 부터 0x1234567B 까지

모든 내용을 불러와서 8을 더한 후,

다시 집어넣는 작업을 일일이

손으로 써 야 할 수 있었을 것이다.

하지만 이제는 단순히

mineral = mineral + 8

과 같이 써 주기만 한다면

mineral 에 8이 더해지는 것.

(만약 mineral = mineral +)

(8이라는 식이 이해가)

 
 

(안되지만 그양 넘어가도록 하자)

(이 처럼 간단해 진다는 것을 말하고 싶었을 뿐)

 
 

이와 같이 C 언어에서,

바뀔 수 있는 어떤 값을 보관하는 곳을

변수 라고 한다.

영어로는 Variable이라 하는데,

말 그대로 바뀔 수 있는 것들 이라는 뜻

 /* 변수 알아보기 */
#include <stdio.h>

int main() {
    int a;
    a = 10;
    printf("a 의 값은 : %d \n", a);
    return 0;
}

프로젝트를 만들어 위의 내용을 적은 후,

컴파일 해보자 까먹었으며 1 장으로

되돌아 가보자. 만약 성곡적으로 하였다면


[실행 결과]
[Running] cd "d:\■■■■■_fFF■\■■■gr■■mi■■\■\" && gcc test.c -o test && "d:\■■■■■_fFF■\■■■gr■■mi■■\■\"test
a 의 값은 : 10 

[Done] exited with code=0 in 0.545 seconds

와 같이 나올 것이다.

일단, 이번에도 역시

생소한 것들이 나왔기 때문에

한 문장씩 차근차근 살펴 보도독 하자.

int a;

이것은 무엇일까? 이전에 intmain()

에서 보았던 int 가 다시 나타났다.

사실 이 문장에 뜻은 a 라는 변수를

우리가 쓰겠다고 컴파일러에게 알리는 것.

만약 이러한 문장이 없다면

우리가 x가 뭐고 y가

뭔지 알려주지도 않은 채,

친구에게 x + y가 얼마냐?

하고 물어보는 것과 똑같은 격이 되는것.

이 때, a 앞에 붙은 int 라는

것은 int 형의 데이터를

보관한다는 뜻으로,

a 에 -2147483648 에서부터

2147483647 까지의

정수를 보관 할 수 있게 된다.

따라서, 만약 중간의 문장을

 
a = 10000000000000;
 
 

와 같이 한다면 아마 a 의 값을

출력하였을 떄,

이상한 결과가 나오게 됩다.

 
 

왜냐하면 보관할 수 있는

범위를 초과하는 수를 보관했기 때문.

그럼 이제, 걱정이 생긴다.

a에 고작 10 밖에 안 넣을 거 면서, 굳이

2147483647 까지 표현할 수 있는

int 형의 변수를 왜

사용했냐고 물을 수 있습니다.

물론, int 형 보다 작은 범위의

숫자 데이터 만을 가지는

형식이 있기는 하지만 (char 등등),

일반적인 경우 정수 데이터를

보관할 때 int 형 변수를 사용한다.

 

또한, 2147483647 보다 큰 수를

사용하려면 어떻게 해야되냐는 의문점도

생긴다. 물론 이 보다도 훨씬 큰 숫자를

처리가능한 데이터 형식이 존재한다.

 
 
아래의 표를 참고 해보자.
 
Name Size* Range*
char 1byte  signed:-128 to 127
 unsigned:0 to 255

short int (short)

2byte

 signed:-32768 to 32767
 unsigned:0 to 65535
int 4byte  signed:-2147483648 to 2147483647
 unsigned:0 to 4294967295
long int (long) 4byte  signed:-2147483648 to 2147483647
 unsigned:0 to 4294967295
bool 1byte  true or false
float 4byte  +/- 3.4e +/- 38 (~7 digits)
doble 8byte  +/- 1.7e +/- 308(~15digits)
long doble 8byte  +/- 1.7e +/- 308(~15digits)

http://www.cplusplus.com/doc/tutorial/variables/ 에서 가져옴

세번째 열인 Range 를 보면,

unsigned 와 signed 라고

나뉜 것이 있는데, 보통

int 라 하면 signed int 를 뜻합니다.

 

이는 음수와 양수

모두 표시할 수 있는 대신에

양수로 표현할 수 있는

범위가 줄어든다.

 

반면에 unsigned int 는 양수만을

표현할 수 있는 대신에,

양수로 표현할

수 있는 범위가

두배로 늘어난다.

 

또 마지막에 보면

float, double, long double

이 있는데 이들은 실수형 자료형으로

소수(0.1, 1.4123 등)을 표현 할 수 있습니다.

 

뿐만 아니라 double의 경우,

±2.3 ×10308~ ±1.7 ×10308

수들을 표현 할 수 있습니다.

(이에 대한 정확한 설명은 후에)

 
a = 10;
 

위 문장은 무엇을 의미할까?

언뜻 보기에도 감이 오시겠지만,

변수 a 에 10을 집어넣는 다는 것.

따라서 나중에 a의 값을

출력한다면 10이 나올 것이다.

이와 같은 형태의 문장은 뒤에서

 
연산자에 대해 두룰 때 다시 알아보도록 하자.
 
printf("a의 값은 : %d \n", a);
 

마지막으로,

지난번에도 보았던 printf 이다.

약간 다른것이 있다. %d가 출력

되는 부분에 써져 있다. 그런데,

프로그램을 실행시켜 보았을 때

%d 는 컴퓨터에서

출력되지 않았습니다.

 

그 대신, %d가 출력될 자리에 무언가

다른 것이 출력되었는데,

바로 a 의 값 입니다.

 

따라서, %d는 a의 값(정확히는 처음 “”

다음에 오는 첫 번째 변수)을 10진수 로

출력하라 라는 뜻이 된다.

 
또다른 예제를 보자.
#include <stdio.h>

int main() {

    int a;
    a = 127;

    printf("a 의 값은 %d 진수로 %o 입니다. \n", 8, a);
    printf("a 의 값은 %d 진수로 %d 입니다. \n", 10, a);
    printf("a 의 값은 %d 진수로 %x 입니다. \n",  16, a);
    return 0;

}

프로그램을 제대로 작성했다면 아래와

같은 결과를 볼 수 있을 것이다.


[실행 결과]
[Running] cd "d:\■■■■■_fFF■\■■■gr■■mi■■\■\" && gcc test.c -o test && "d:\■■■■■_fFF■\■■■gr■■mi■■\■\"test
a 의 값은 8 진수로 177 입니다. 
a 의 값은 10 진수로 127 입니다. 
a 의 값은 16 진수로 7f 입니다. 

[Done] exited with code=0 in 0.331 seconds

일단, 위 코드를 보고 생기는 의문점은 2가지.

% 달린게 2 개나 있는데, 이를 어떻게 해야되나와,

%d 말고도 %o 와 %x 는 무엇인가 이다.

먼저. printf의 작동원리에 대해 보도록 하자.

https://raw.githubusercontent.com/KuraiLuna/KuraiLuna.github.io/master/practical/C/%EC%94%B9%EC%96%B4%EB%A8%B9%EB%8A%94%20C%20%EC%96%B8%EC%96%B4/Chapter-02/%ED%95%A8%EC%88%982.png
 

printf 출력시에,

큰 따옴표로 묶인 부분 뒤에 나열된 인자들(8, a)

가 순서대로 큰 따옴표 안의

% 부분으로 들어감을 알 수 있다.

따라서, 예를들면

printf(“%d %d %d %d”, a,b,c,d);와 같은

 
문자은 a, b, c, d의 값이 순서대로 출력이 된다.
 
 

이제, %o 와 %x 는 무엇일까?

이는 인자(a)의 값을 출력하는

형식 이다, 즉 %o은

a의 값을 8진수로 출력하라는 뜻이고,

%x는 16진수로 출력하는 뜻 이다.

 
 

실수형 변수

실수형은 float 와 double이 있다.

double의 경우 int 형에 비해

덩치가 2 배나 크지만 그 만큼

엄청난 크기의 숫자를 다룰 수 있다.

그 대신, 처음 15개의 숫자들만

정확하고 나머지는 10의 지수 형태로

표현이 된다.

 

또한 float과 double의 장점은

소수를 표시할 수 있다는 점인데,

정수형 변수에소 소수를 넣는다면

(예를들어 int a; a = 1.234;),

소수 부분은 다 절단 된채,

나중에 a의 값을 표시해 보면 1이 나온다.

#include<stdio.h>

int main() {

    float a = 3.141592f;
    double b = 3.141592;

    printf("a : %f \n", a);
    printf("b : %f \n", b);
    return 0;

}

실행해 본다면 아래와 같이 나오게 된다.


[Running] cd "d:\■■■■■_fFF■\■■■gr■■mi■■\■\" && gcc test.c -o test && "d:\■■■■■_fFF■\■■■gr■■mi■■\■\"test
a : 3.141592 
b : 3.141592 

[Done] exited with code=0 in 0.434 seconds

일단, 위 코드를 보면서 의문점이 생겼다.

float a = 3.141592f;
double b = 3.141592;

왜, float 형 변수 a를 선언할

때 에는 숫자 뒤에 f를 붙였는데

double 형 에서는 f를 안 붙였다.

왜냐하면, 그양 f를 안 붙이고

float a = 3.141592로

하면 이를 double 형으로

인식하여 문제가 생길 수있다.

따라서, float 형이라는 것을

확실히 표시해 주기 위해 f를 끝에

붙이는 것입니다.

printf("a : %f \n", a);
printf("b : %f \n", b);

이게, 마지막으로 %d, %o, %x도

아닌 %f가 등장하였습니다.

만약, 여기서 a 를 %d형식

으로 출력하면 어떻게 될까?

한 번 시도를 해보자.

아마 이상한 숫자가 나오게 될 것이다.

왜냐하면, a 는 지금 정수형

변수가 아니기 때문이다. 설령,

우리가 a = 3f; b = 3; 라고 해도,

이미 a 와 b를 실수형 변수로 선언

했기 때문에 컴퓨터는

a, b를 절대 정수로 보지 않는다고한다.

따라서, 우리는 실수형 변수를

출력하는 형식인 %f를 사용해야 한다.

참로로 주의할 사항은 printf에서 %f를

이용해 수를 출력 할 때 다음

과 같이 언제나 소수점을 뒤에

붙여 주어야 한다는 점이다. 예를 들어서

printf("%f", 1);

을 하면 화면에 이상한 값

(아마도 0이 출력될 것 입니다.)

이 나오지만

printf("%f", 1.0);

을 하면 화면에 제대로 1.0 이 출력이 된다.

printf의 또 다른 형식

#include <stdio.h>

int main()
{
    float a = 3.141592f;
    double b = 3.141592;
    int c = 123;

    printf("a : %.2f \n", a);
    printf("c : %5d \n", c);
    printf("b : %6.3f \n", b);
    return 0;
}

만약 위 소스를 성공적으로 작성했다면 아래와 같이 나오게 된다.

[Running] cd "d:\■■■■■_fFF■\■■■gr■■mi■■\■\" && gcc test.c -o test && "d:\■■■■■_fFF■\■■■gr■■mi■■\■\"test
a : 3.14 
c :   123 
b :  3.142 

[Done] exited with code=0 in 0.345 seconds
printf("a : %.2f \n", a);

이번에는 %f가 아니라 %.2f 롤 약간 다르다.

그렇다면 .2 가 뜻 하는 것은

무엇일까? 대충 짐작했듯이,

무조건 소수점 이하 둘째 자리 까지만 표시하라 란

뜻이다, 위의 경우 3.141592 중 3.14

까지만 출력되고 나머지는 절단되게 된다.

여기서 ‘무조건’ 이라는 것은 %.100f 로 할 경우에도,

3.141592000000····00을 표시해서 무조건 100개를 출력하게 된다.

printf("c : %5d \n", c);

이번에는 %d가 아닌 %5d 입니다.

여기서 .5가 아님을 주의하자. 이 말은,

숫자의 자리수를 되도록 5 자리로 맞추라는 것이다.

따라서, 123을 표시할 때,

5 자리로 맞추라는 것이다.

따라서, 123을 표시할 떄, 5 자리를 맞추어야 하므로

앞에 공백을 남기고 그 뒤에 123을 표시하였다.

그런데, 123456 을 표시할 떄, %5d

조건을 준다면 어떻게 될까?

이 떄는 그양 123456 을 다시 표시한다.

앞서 .?f는 ?의 수 만큼 무조건

소수점 자리수를 맞추어야 하지만

이 경우에는 반드시 지켜야 되는 것은 아니다.

printf("b : %6.3f \n", b);

마지막으로, 위에서 썻던 두 가지

형식을 모두 한꺼번에 적용한 모습이다.

전체 자리수는 6자리로 맞추되

반드시 소수점 이하 3 째 자리 까지만 표시

한다는 뜻이다.

변수 작성하기

앞서, 보았듯이 변수를 선언하는 것은 그다지 어려운 일이 아니다.

단지, 아래의 형태로 맞추어 주기면 하면 된다.

https://raw.githubusercontent.com/KuraiLuna/KuraiLuna.github.io/master/practical/C/%EC%94%B9%EC%96%B4%EB%A8%B9%EB%8A%94%20C%20%EC%96%B8%EC%96%B4/Chapter-02/%EB%B3%80%EC%88%98%EB%B3%80%EC%88%98.png

이 때, 변수 선언시 주의해야 할 점이 있다.

만약에 여러분이 오래된

C 언어 (C89)를 사용한다면,

변수 선언시 반드시 최상단에 위치해야 한다.

하지만, 여러분이 지금 사용하고 있는

최신 버전의 C의 변수 사용하기 전

아무데나 변수를 선언해도 상관 없다.

/* 변수 선언시 주의해야 할 점 */
#include <stdio.h>

int main(){

    int a;

    a = 1;

    printf("a는 : %d", a);

    int b; // 괜찮음

    return 0;

}

두 번째로, 사람의 이름을 지을 때, 여러가지를 고려하듯이 변수의

이름에서도 여러가지 조건들이 있다. 아래 예를 보도록 하자.https://raw.githubusercontent.com/KuraiLuna/KuraiLuna.github.io/master/practical/C/%EC%94%B9%EC%96%B4%EB%A8%B9%EB%8A%94%20C%20%EC%96%B8%EC%96%B4/Chapter-02/%EB%B3%80%EC%88%98%EB%B3%80%EC%88%98%EB%B3%80%EC%88%98.png

이 안에 모든 내용이 들어 있습니다.
변수의 이름은 반드시
 

   • 숫자가 앞에 위치하면 안된다. 그러나 중간이나 뒤는 괜찮다.

   • 변수명은 오직 영어, 숫자,_로 만 구성되어 있어야 한다.

   • 변수의 이름에 띄어쓰기가 있으면 안된다.

   • 변수의 이름이 C 언어 예약어 이면 안된다. 보통 예약어를

      쓰면 에디터에서 다른 색깔로 표시되어 예약어을 썼는지 안썼는지 알 수 있다.

 

자, 이제 우리는 C언어에서 중요한

부분인 변수에 대해서 알아보았다.

현재 우리는 수를 다루는 변수들만 다루었지만,

다음 은 변수에 대한 산술과

연산과, 문자를다루는 변수에 대해

공부한것을 기록 해볼려고 한다.

정 리

  • 변수는 데이터를 임시로 저장하는 곳이며 자유롭게 쓰고 지울 수 있습니다.

  • 각 변수에는 형(type)이 있어서 해당 형에 맞는 데이터를 보관할 수 있습니다.

  • 변수의 형으로는 정수값을 보관하는 char, int 등이 있고, 실수값을 보관하는

    float과 double이 있습니다. 각각의 형들은

    지정하는 데이터의 크기가 다릅니다.

  • int a = 10;의 문장의 의미는 a 라는 정수형 변수를 정의한 뒤에, 해당 변수에 10

    의 값을 대입한다 라는 뜻입니다.

  • 변수의 이름을 정하기 위해서는 여러가지 규칙이 있습니다. 이 규칙에 알맞게

    변수의 이름을 정해야 되며 그렇지 않을 경우 컴파일 오류가 발생합니다.