본문 바로가기
Development/C

(C언어 기초) 3. 변수와 데이터 입력, prinf()

by eoieiie 2023. 8. 26.

프로그램에서 데이터를 메모리에 저장해 놓으면 필요할 때마다 꺼내 쓸 수 있습니다. 이때 변수 선언을 통해 메모리에 저장 공간을 확보합니다. 변수는 데이터의 종류에 따라 각각 다른 형태를 사용하는데, 정수는 int, 실수는 double,  문자는 char,  문자열을 char 배열을 사용합니다. 우선 변수를 선언하는 방법에 대해서 알아보도록 하겠습니다.

 

변수 선언 방법


변수를 선언하는 방법은 간단합니다. 데이터의 종류에 맞는 자료형과 변수명을 나란히 쓰면 됩니다. 예를 들어 정수를 저장할 변수는 다음과 같이 선언합니다. 

 

int a;

 

 

여기서 int는 자료형이고, a는 변수명입니다. 그냥 쉽게 말하면 " 정수 a; "라는 거죠. 

자 이렇게 변수를 선언하면 메모리에 저장 공간이 생기게 됩니다. 저장 공간 안에 어떤 값이 들어 있을까요? 알 수 없습니다. 있긴 한데, 우리가 알 수 없는 의미없는 값이 존재할겁니다. 이를 garbage value 라고 하며, 때문에 우리가 원하는 값을 변수에 지정해주지 않는 이상 우리는 변수가 어떤 값을 가지는 지 알 수 없습니다. 그렇기에 반드시 원하는 값으로 바꾸는  초기화 과정을 거쳐야 합니다. 방법은 다음과 같습니다. 

 

a = 10;

 

오른쪽 값을 대입 연산자 = 를 통해 왼쪽에 저장해주었습니다. 이제 우리는 변수명으로 값을 저장하고 연산하거나 출력에 사용할 수 있습니다. 예제를 통해 변수를 선언하고 사용해보겠습니다. 

 

#include <stdio.h>

int main(void)
{
    int a; //int 형 변수 a 선언
    int b, c; //int 형 변수 b,c를 동시에 선언 
    double da; //double 변수 da 선언 
    char ch; // char 형 변수 ch 선언

    a = 10; // 형 변수 a에 정수 10 대입
    b = a; // int 형 변수 a의 값 대입 
    c = a + 20; // int 형 변수 c에 변수 a의 값과 정수 20을 값 대입
    da = 3.5; //double형 변수 da에 실수 3.5 대입
    ch = 'A'; //char 형 변수 ch 에 문자 'A'대입

    printf("변수 a의 값 : %d\n", a);
    printf("변수 b의 값 : %d\n", b);
    printf("변수 c의 값 : %d\n", c);
    printf("변수 da의 값 : %.1lf\n", da);
    printf("변수 ch의 값 : %c\n", ch);




    return 0;
}


//실행결과

변수 a의 값 : 10
변수 b의 값 : 10
변수 c의 값 : 30
변수 da의 값 : 3.5
변수 ch의 값 : A

 

변수는 대입 연산자(=) 왼쪽에서는 저장 공간이 되고, 오른쪽에서는 값이 됩니다. 변수가 왼쪽에 있는 a는 저장 공간이므로 값이 10으로 변경되짐나, 오른쪽에 있는 a는 저장 공간의 값(10)을 복사해서 사용하므로 변수 a의 값은 바뀌지 않습니다. 또한 연산하거나 출력할 때도 값을 복사해서 사용하므로 변수의 값이 바뀌지 않습니다. 

 

a = 10;
b = a;

 

정수 자료형


변수는 데이터를 저장하는 메모리의 공간이며, 데이터 종류에 따라 다양한 형태를 사용합니다. 이와 같은 변수의 형태를 자료형 혹은 데이터형 이라고 하며, 크게 정수형과 실수형으로 구분합니다. 같은 정수형이라도 메모리 저장 공간의 크기에 따라 char(1바이트), short(2바이트), int(4바이트), long(4바이트), long long(8바이트) 으로 구분됩니다. 이 중 크기가 1 바이트로 가장 낮은 char형 변수를 사용하면 문자를 가장 효과적으로 저장할 수 있습니다. char형 변수의 용도를 예제를 통해 살펴보겠습니다. 

 

#include <stdio.h>

int main(void)
{
    char ch1 = 'A'; //문자로 초기화, 저장된 값은 문자의 아스키 코드 값
    char ch2 = 65; // 문자 'A'의 아스키 코드 값에 해당하는 정수(65)로 초기화 
    printf("문자 %c의 아스키 코드 값 : %d\n", ch1, ch1); 
    printf("아스키 코드 값이 %d인 문자 : %c", ch2, ch2); 

    return 0;
}

 

char 형 변수를 출력할 때 %c를 사용하면 변수에 지정된 값을 아스키 코드 값으로 해석하여 그 값에 해당하는 문자를 출력하고 %d를 사용하면 정수로 출력됩니다. 그러니까 사실 ch1이랑 ch2의 출력되는 형태는 변환 문자들이 결정하는 것이죠. 

정수형에는 char 외에도 많은 자료형이 있습니다. 처리할 데이터의 크기에 따라 적절한 자료형을 선택하면 됩니다. 간단한 사용 예를 보겠습니다. 

 

#include <stdio.h>

int main(void)
{

    short sh = 32767;
    int in = 2147483647;
    long ln = 2147483647;
    long long lln = 123451234512345;

    printf("short 형 변수 출력: %d\n", sh);
    printf("int 형 변수 출력: %d\n", in);
    printf("long 형 변수 출력: %ld\n", ln);
    printf("long long 형 변수 출력: %lld\n", lln);

    return 0;
}


//실행결과

short 형 변수 출력 : 32767
int 형 변수 출력 : 2147483647
long 형 변수 출력 : 2147483647
long long형 변수 출력 :123451234512345

 

각각의 데이터 타입에 맞는 형식 지정자를 사용하는 것은 굉장히 중요합니다.  shot 와 int 형은 %d로, long 과 long long 형은 %ld, %lld 로 출력해야 합니다. 

사실 특별한 경우가 아니면 정수형은 int 를 사용합니다. 기본 단위이며, 가장 빠르게 연산되기 때문입니다. 큰 값을 저장할 때는 long 형을 사용합니다. 자료형의 크기를 비교하자면 아래와 같습니다.

 

char  <=  short  <= int  <=  long  <=  long long 

 

실수 자료형


실수는 데이터를 구분하는 방법이 정수와 다르므로 별도의 자료형을 사용합니다. 크기에 따라서 float(7바이트), double(15바이트), long double(15바이트 이상)로 구별하며, 값을 저장할 수 있는 범위가 다릅니다. 가장 작은 float도 4바이트이므로 저장 범위가 큰 편입니다. 실수 자료형은 값의 범위보다 유효 숫자의 개수에 주목할 필요가 있습니다. 

 

#include <stdio.h>

int main(void)
{
    float ft = 1.234567890123456789;
    double db = 1.234567890123456789;


    printf("float형 변수의 값: %.20f\n", ft); // %f는 float에, 
    printf("double형 변수의 값: %.20lf\n", db); // %lf 는 doubble에. 

    return 0;
}


//실행 결과

float형 변수의 값: 1.23456788063049316406
double형 변수의 값: 1.23456789012345669043

 

 

출력한 값이 초깃값과 다릅니다. float형 변수의 값은 9번째부터, double형 변수는 17번째부터 달라졌습니다. 컴퓨터에서 실수를 표현하는 방법에는 오차가 존재하기 때문에, float형은 유효 숫자 7자리, double 형은 15자리의 범위 내의 값을 사용하는 것이 좋습니다. 헷갈린다면 다음 두 가지 경우만 기억하면 됩니다. 

 

  • 정수형을 기본으로 하고, 실수형은 꼭 필요한 경우에만 사용
  • 실수형은 유효 숫자가 많은 double 형을 기본으로 사용. 

 

문자열 저장


문자형은 char형을 배열 형태로 만들어 저장합니다. 

 

char 배열명[문자열길이+1] = 문자열;

 

char fruit[6] = "apple"

 

왜 문자열의 길이보다 배열의 크기를 크게 잡아야 할까요? 왜냐햐면 컴파일러가 문자열의 끝에 \0이라는 null 문자를 자동으로 추가하기 때문입니다. null은 추후 설명하도록 하겠습니다. 

char 배열은 문자열을 저장하는 변수의 역할을 하며 %s로 출력합니다. 

 

#include <stdio.h>

int main(void)

{
    char fruit[20] = "strawberry";

    printf("딸기 : %s\n",fruit);
    printf("딸기잼 : %s %s\n", fruit, "jam");
    
    return 0;
}


//실행 결과

딸기 : strawberry
딸기잼 : strawberry jam

 

확인 문제


다음 프로그램의 실행결과를 예상해보세요.

 

#include <stdio.h>

int main(void)

{
    int a = 0;

    a = a + 1;
    a = a + 4;
    printf("a = %d", a);

    return 0;

}

 

 

답:

더보기
a = 5

 

국어, 영어 , 수학 점수를 저장할 변수(kor, eng, mat)를 선언하고 각각 70, 80, 90점으로 초기화합니다. 총점을 저장할 변수(tot)를 선언하여 세 과목의 합을 구하고 세 과목의 점수와 총점을 출력하는 프로그램을 작성하세요. 

 

답:

더보기
#include <stdio.h>

int main(void)

{
    int kor = 70, eng = 80, mat = 90;
    int tot;

    tot = kor + eng + mat;
    printf("국어 : %d, 영어 : %d, 수학 : %d\n", kor, eng, mat);
    printf("총점 : %d", tot);

    return 0;
}

 

댓글