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

변수

by 길냥이 2025. 4. 14.
728x90

목차

  1. 변수의 선언과 초기화
  2. 변수의 자료형과 크기
  3. 문자열의 저장
  4. 변수 선언의 규칙

 

1. 변수의 선언과 초기화

변수를 사용하는 이유

음, 일단 우리는 상수에 대해 배웠습니다.

하지만 상수를 여러번 쓰는건 꽤나 귀찮고.. 상수가 뭘 의미하는지도 보기 힘듭니다.

그리고 숫자의 변형이 필요하면? 어.. 답도 없습니다.

 

그럴 때 변수를 사용합니다. 필요할 때마다 꺼내서 쓰고, 원할 때 바꿀 수도 있는 변수 말이죠.

이때, 변수는 데이터의 종류에 따라 각각 다른 종류를 사용합니다.

정수는 int, 실수는 float, double, 문자와 문자열은 char을 사용합니다.

 

변수의 선언

일단, 변수를 선언해 볼까요..

일반적으로, 변수는 자료형과 변수명으로 이루어져 있습니다.

가령, 실수형 변수 a를 선언하려면..

int a; 라고 입력하면 되는 것이죠.

 

좋아요, 간단한 코드를 만들어보죠.

#include <stdio.h>

int main()
{
    int a;   //int형 변수 a 선언

    a = a + 10;  //a에 10 더하기

    printf("%d", a);

    return 0;
}

자! 이렇게 돌리면 아마 10이 나올겁니다.

 

어라,

음... 뭐 당연해요.

C에서는 변수 선언과 동시에 초기화를 해주지 않습니다. 그냥 컴퓨터가 쓰던 비트 몇개를 변수에 할당해주는거에요.

당연하게도, 컴퓨터가 쓰던 비트이므로 이 변수에는 쓰래기 값(garbage value)이 남아있습니다. 

 

이러한 쓰래기 값 때문에 프로그램에 오류가 생길 수 있으므로, 반드시 초기화의 과정이 필요합니다. 

초기화 방법은.. 간단합니다. a=10;같은 방법으로 변수에 값을 할당하는 것이죠.

초기화를 하고 다시 돌리면..

#include <stdio.h>

int main()
{
    int a = 0;   //int형 변수 a 선언, 0으로 초기화

    a = a + 10;  //a에 10 더하기

    printf("%d", a);

    return 0;
}

이제야 정상적인 결과가 나옵니다.

10

근데, 보면 좀 이상한 식이 있어요.

 

a = a + 10

으음.. 수학 좀 해 보신 분들이라면 이 식이 말도 안된다는 것을 알고 있을겁니다.

 

하지만 프로그래밍에서는 가능해요. = 은 프로그래밍에서 동치가 아니라 대입이기 때문에, 오른쪽의 식을 먼저 처리하고..

그리고 오른쪽의 식을 왼쪽에 대입합니다. 

a = 0 + 10 → a = 10

이렇게 되겠네요. 

 

여러 가지 변수의 선언

좋아요, 그럼 변수란 변수는 죄다 선언해 보도록 합시다.

#include <stdio.h>

int main()
{
    int a,b;      // int형 변수 a, b 동시선언
    int c;        // int형 변수 c 선언
    float fl;     // float형 변수 fl 선언
    double dou;   // double형 변수 dou 선언(do는 예약어로 변수로 사용할 수 없음)
    char ch;      // char형 변수 ch 선언

    a = 10;                         // int형 변수 a에 10 대입
    b = a;                          // int형 변수 b에 a를 대입
    c = a + b - 30;                 // int형 변수 c에  a+b-30을 대입
    fl = 3.1415;                    // float형 변수 fl에 실수 3.1415 대입
    dou = 0.12345678901234567890;   // double형 변수 dou에 실수 대입(유효숫자 확인목적)
    ch = 'a';                       // char형 변수 ch에 문자 a 대입

    printf("%d\n", a);
    printf("%d\n", b);
    printf("%d\n", c);
    printf("%f\n", fl);
    printf("%.20lf\n", dou);
    printf("%c\n", ch);

    return 0;
}

교수님 코드가 너무 길어요

 

자, 이걸 실행하면..

10
10
-10
3.141500
0.12345678901234567737
a

좋아요!

일반적으로 float와 double와 같은 실수형 변수는 본인들이 보여줄 수 있는 유효숫자범위까지만 보여줘요.

이전에 말했다시피, float형은 6자리고, double는 16자리까지죠.

실제로도 18자리부터 고장나있는걸 볼 수 있어요.

 

변수 선언과 대입 규칙

아무튼, 위에서 볼 수 있는 변수 선언과 대입에 규칙이 있는데..

 

1. 중괄호 { } 안에 변수를 선언하며 선언한 위치부터 블록 끝까지 사용 가능.

  -  변수는 전역변수와 지역변수로 나눌 수 있는데.. 그건 나중에 설명하고 변수는 선언한 위치부터 사용된다는 것을 알아주세요.

 

2. 컴파일러에 따라 변수의 선언 위치가 제한될 수 있음.

  -  요즘은 딱히 이런거 문제없이 잘 돌아가는데, 구식 컴파일러들은 맨 앞에 선언안하면 고장나는 경우가 있어요.

 

3. 변수의 자료형이 같으면 동시에 둘 이상의 변수를 선언할 수 있음.

  -  int a, b, c;처럼 여러가지 변수를 선언할 수 있어요.

  -  물론 초기화도 한번에 여럿이 가능하지만, int a, b, c=0;하면 c만 0으로 초기화된답니다.

  -  int a =0, b=0, c=0; 처럼 해야 한번에 여러 변수 초기화가 가능해요.

 

4. 대입 연산자 (=)는 연산자 왼쪽의 변수에 오른쪽의 결과값을 저장함.

  -  a = 10;
  -  b = a
  -  c = a + b - 30;

  -  을 보면 아시겠지만, 무조건 오른쪽의 연산을 먼저 처리하고 왼쪽에 대입해요.

 

5. 변수는 사용된다고 바뀌지 않음.

  -  변수가 대입연산자의 왼쪽에 가면 바뀌지만, 오른쪽에 간다고 바뀌지는 않아요. 이때는 숫자로 사용됩니다.

 

+ 여담으로..

  -  지금같은 경우에는 변수에 대충 a, b, c같은걸 써넣었는데, 실제 프로그래밍에서는 변수를 저딴걸로 쓰지 않아요.

  -  실제 프로그래밍에서는 변수를 int_stats, double_avg, char_nickname 등으로 알아볼 수 있게 사용합니다.

 

변수 선언의 규칙

변수에는 예약어(printf, do, int.. 같은 것을 사용할 수 없어요.

변수는 알파벳 대소문자, 숫자 0~9, 언더바(_) 로 만들 수 있어요.

숫자로 시작할 수 없어요.

대문자와 소문자를 구별해요

 

2. 변수의 자료형과 크기

이전에도 말했지만, 변수에는 여러가지 자료형이 있어요.

정수 자료형에 속하는 int, int long, long long...

실수 자료형에 속하는 float, double 등도 말이죠.

 

이러한 자료형들은 다들 크기가 달라요, char은 1바이트고, short는 2바이트고, long는 4바이트고...

당연하게도 C는 구식 프로그래밍 언어이기 때문에, 최적화를 매우 중시했어요.

적절한 곳에 적절한 자료형을 쓰는 것은 최적화에 상당한 도움이 되죠. 

 

short의 최대 크기는 32767(양수 범위, 음수로는 -32768까지)이고, 

long의 최대 크기는 2147483647(양수 범위, 음수로는 -2147483648까지)이죠.

long long는.. 몰라요. 2의 64승입니다.

 

아무튼, 이러한 변수들의 크기를 알아보려 있는 예약어가 sizeof()입니다. 사이즈오브로 읽죠.

예전에 저걸 시즈노프로 읽었지..

 

아무튼 이걸 활용해 각 변수들의 크기를 알아보자면..

#include <stdio.h>

int main()
{
    char char_n = '0';           // char형 변수 char_n 선언
    short short_n = 0;           // short형 변수 short_n 선언
    int int_n = 0;               // int형 변수 int_n 선언
    long long_n = 0;             // long형 변수 long_n 선언
    long long long_long_n = 0;   // long long형 변수 long long_n 선언

    int char_size = sizeof(char_n);            //char_size에 char형 변수의 크기 저장
    int short_size = sizeof(short_n);          //short_size에 short형 변수의 크기 저장
    int int_size = sizeof(int_n);              //int_size에 int형 변수의 크기 저장
    int long_size = sizeof(long_n);            //long_size에 long형 변수의 크기 저장
    int long_long_size = sizeof(long_long_n);  //long long_size에 long long형 변수의 크기 저장

    printf("char 자료형의 크기 : %d\n", char_size);
    printf("short 자료형의 크기 : %d\n", short_size);
    printf("int 자료형의 크기 : %d\n", int_size);
    printf("long 자료형의 크기 : %d\n", long_size);
    printf("long long 자료형의 크기 : %d\n", long_long_size);

    return 0;
}

짜잔

 

핫하, 앞으로 코드는 계속 길어질 거에요. 

이건 어려워보이기는 하지만 실제로는 반복이라 쉬운 코드라고요?

아무튼 실행하면...

char 자료형의 크기 : 1
short 자료형의 크기 : 2
int 자료형의 크기 : 4
long 자료형의 크기 : 4
long long 자료형의 크기 : 8

가 나온답니다.

 

특별할 경우가 없으면 정수형은 int를 사용해주세요. 제일 만만하고 무난하고.. 

 

가끔씩 필요한 경우에 unsigned형을 사용하는데, 이건 부호 없는 정수형이에요. 즉 2147483647×2+1만큼의 범위를 얻을 수 있지만, 그 대가로 음수를 표현할 수 없죠.

 

이전에 말했던 실수 자료형인 float와 double가 있는데, 쉬운 문제에서는 float를 사용할 거지만..

전문성이 있는 문제들은 보통 유효숫자 8자리, 10자리 이상을 요구하기 때문에 이럴 경우에는 double를 사용해 주세요.

요즘 컴퓨터들 빨라져서 double도 쓸 수 있으니까요.

 

3. 문자열의 저장

프로그램을 만들다 보면 숫자나 문자 말고 문자열도 변수에 담아야 할 때가 있어요.

근데 C에는 문자열 자료형은 없네요?

이럴 때는 어떻게 해야 하나..

음.. 이전에 C의 문자열은 사실 문자의 배열과 동등하다고 한 적이 있어요.

실제로 C에서 문자열은 char형을 배열 형태로 만들어서 저장합니다.

 

구조는 다음과 같아요.

char 배열명[공백 혹은 문자열길이+1 이상] = 문자열;

 

당연하게도 문자열도 배열로 쓸 수 있어요. 2차원 배열의 응용인데.. 

가볍게만 짚고 넘어가자면, 구조는 다음과 같아요.

char 배열명[문자열 개수][공백 혹은 문자열길이+1 이상] = 문자열,문자열,문자열...문자열;

이건 다음에 배우고.. 일단 프로그래밍을 해봅시다.

 

#include <stdio.h>

int main()
{
    char nickname1[] = "RoadMew";   //char 배열 선언과 문자열 초기화
    char nickname2[7] = "Roadmew";
    char nickname3[] = { 'r','o','a','d','m','e','w','\0'};   //일반적인 배열처럼 입력

    printf("%s\n", nickname1);    //문자열 출력, 변환 문자는 %s
    printf("%s\n", nickname2);
    printf("%s\n", nickname3);

    return 0;
}

흠, 저는 제 영어 이름으로 써놓았지만 원한다면 다른 문자열을 써보세요.

 

아무튼 실행결과를 보면.

RoadMew
Roadmew儆儆儆儆儆儆儆儆儆儆儆儆儆儆?oadmew
roadmew

짜잔, 이렇게 나옵니다.

 

일반적으로 문자열 배열의 [ ] 안을 공백으로 채워두면 알아서 문자열+1칸만큼 추가해서 넣어 줘요.

하지만 직접 선언해서 문자열만큼의 칸만 주면, 저렇게 이상한 문자열이 붙죠.

이유는 다음줄에서 알 수 있는데, 문자열의 맨 끝에는 널 문자 \0이 들어가기 때문이에요.

 

어.. 맨 밑처럼 문자열에 집어넣는 것도 가능하지만 웬만하면 하지 말도록 합시다.

여기서는 어떻게 저장되는지 이해하라고 입력한 거고..

 

아무튼, 이렇게 문자열을 쓸 수 있답니다. 

필요하다면 printf문 안에 문자열 상수를 넣어서 쓸 수도 있어요.

 

 여담으로 儆는 cp949인코딩으로 0xcccc값에 해당하는데, 비쥬얼스튜디오같은 MS개발환경에서 초기화되지 않은 변수에 자동으로 저런 값을 넣어서 저게 나온답니다.

 

그리고 배열에는 대입연산자를 쓸 수 없기 때문에, 배열에 새 문자열을 저장하려면 strcpy(string copy)를 써야 합니다.

한번 실습해보죠.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>

int main()
{
    char nickname[20] = "RoadMew"; //RoadMew로 초기화

    printf("%s\n", nickname);
    strcpy(nickname, "Apple");     //Apple로 초기화
    printf("%s\n", nickname);

    return 0;
}

뭔가 이상한게 늘었어요!

#include <string.h>은 그냥 문자열(string) 에 도움이 되는 여러가지를 지원해주는 라이브러리에요.

 

그리고 #define _CRT_SECURE_NO_WARNINGS은 strcpy를 쓰기 위한 건데, 비쥬얼 스튜디오에서는 저런 구식 C 명령어들이 보안에 안좋기 때문에 사용하려 하면 에러가 나요. strcoy_s같은걸 써도 되기는 한데, 그러면 다른곳에서 못 쓰기 때문에..

 

출력은 다음과 같습니다.

RoadMew
Apple

 

4. 변수 고정

흠, 그런데 말이죠...

 

변수를 바꾸지 않을 방법은 없을까요?

 

맨 위에 #을 이용하는 방법도 있지만, const 명령어를 사용할 수도 있어요.

#include <stdio.h>

int main()
{
    int time = 0;                       // 시간 초기화
    const int min_sec = 60;             // 1시간=60분, 1분=60초
    int sec = 0;                        // 초 초기화

    time = 24;                          //24시간(1일)대입
    sec = time * min_sec * min_sec;     //24시간을 초로 변환

    printf("%d시간은 %d초입니다.", time, sec);


    return 0;
}

다음과 같이 코드를 만들면 min_sec는 고정 변수가 된답니다.

그리고 const를 사용하면 값을 다시 바꿀 수 없기에, 선언과 동시에 할당을 해줘야 한답니다.

 

결과 : 24시간은 86400초입니다.

728x90

'프로그래밍 > C' 카테고리의 다른 글

기본 연산자  (0) 2025.04.15
데이터 입력  (0) 2025.04.15
상수와 데이터 표현  (1) 2025.04.14
C의 기본 구조와 데이터 출력  (0) 2025.04.07
C언어 개관  (0) 2025.03.08