Language/C

C_Char3.변수와 데이터 입력

Sumni Life 2021. 5. 9. 02:45

1.변수 선언하기

int a ;

int = 자료형 = 변수의 크기를 나타냄

a = 변수명 = 메모리에 붙이는 임시 주소

  • 쓰레기 값

변수를 선언하면 메모리 공간이 생기는데,

이 공간은 프로그램 종료 시 사용하던 메모리 공간을 반납하면서

새롭게 실행된 프로그램이 그 공간을 사용하며 공간이 재활용된다.

이때, 이전에 사용했던 프로그램이 남긴 값 = 쓰레기 값 이라고 하며, 초기화 없이 그냥 실행하면 이것이 오류를 발생시킨다!

이 오류를 없애 주기위해서 우리는 원하는 값으로 바꾸는 초기화를 진행해야한다.

그럼 이 초기화 과정은 어떻게 진행할까?

a = 10; <= 초기화 과정

여기서, 대입연산자 ( = ) 는 오른쪽 (10)값을 왼쪽 (변수a)에 저장(할당)한다.

#include <stdio.h>

int main(void)
{
    /*데이터의 종류별로 변수를 선언*/
    int a;            //int형 변수 a 선언
    int b, c;        // 2개의 int형 변수 b,c를 동시에 선언
    double da;        // double형 변수 da선언
    char ch;        // Char형 변수 ch 선언

    a = 10;            // int형 변수 a에 정수 10대입
    b = a;            // int형 변수 b에 변수 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;
}
  • 변수 선언과 대입 규칙2) 컴파일러에 따라 변수의 선언 위치가 제한될 수 있다.4) 대입 연산자(=)는 연산자 왼쪽의 변수에 오른쪽의 값을 저장한다.( 반대로는 불가능 )
  • 5) 대입 연산자 왼쪽에서는 저장 공간이 되고, 오른쪽에서는 값이 된다.( 변경 불가능 )
  • 3) 변수형의 자료형이 같으며 동시에 둘 이상의 변수를 선언 할 수 있다.
  • 1) 중괄호의 블록{} 안에 변수를 선언하며, 선언한 위치부터 블록 끝까지 사용할 수 있다.



2. 정수 자료형

앞에서 변수 = 데이터를 저장한는 메모리 공간 이라고 하였다.

이 변수의 형태를 자료형 or 데이터형 이라고도 하며,

크게는 정수형실수형 으로 구분한다.

여기서 먼저 정수형 에 대해서 알아보자.

정수형 은 메모리 저장 공간의 크기에 따라 나눌 수 있다.

■char ← 1byte

■■short ← 2byte

■■■■int ← 4byte

■■■■long ← 4byte

■■■■■long long ← 8byte

여기서, char 형은 가장 작은 범위를 저장할 수 있지만, 주로 문자를 저장하는 용도로 쓰인다.

  • char 형 변수의 사용
#include <stdio.h>

int main()
{
    char ch1 = 'A';        //문자로 초기화. 저장된 값은 문자의 아스키 코드 값
    char ch2 = 65;        // 문자 'A'의 아스키 코드 값에 해당하는 정수로 초기화

    printf("문자 %c의 아스키 코드 값 : %d\n", ch1, ch1);
    printf("아스키 코드 값이 %d인 문자 : %c\n", ch2, ch2);

    return 0;
}

컴파일러는 모든 문자를 0 ~ 127 사이의 정수(아스키 코드 값)으로 변경하여 처리하기때문에

char형 변수를 사용하면 문자를 가장 효과적으로 저장할 수 있다.

물론, char 형 변수만 사용하는 것은 아니다.

이외에도 많은 자료형이 있으며, 처리할 데이터의 크기에 따라 적절한 자료형을 선택하면 된다.

  • 여러 가지 정수형 변수
#include <stdio.h>

int main()
{
    short sh = 32767;            // short 형의 최댓값 초기화
    int in = 2147483647;            //  int 형의 최댓값 초기화
    long ln = 2147483647;            //  long 형의 최댓값 초기화
    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);
    // long long 형은 lld로 출력


    return 0;
}

각 자료형은 저장 값의 범위가 다르지만, 출력할 때는 모두 %d를 사용한다.

단, long형은 %ld , longlong 형은 %lld 로 출력한다.

그럼, 언제 어떤 자료형을 사용하면 될까?

  1. 특별한 경우가 아니면 정수형 int를 사용한다. (연산이 가장 빠르다)
  2. long형은 큰 값을 저장할 때만 사용한다.
  3. 자료형의 크기를 모른다면 sizeof 연산자를 사용해서 크기를 알아본다.
printf("longlong형의 크기 : %d바이트\n", sizeof(longlong));



3. unsigned 정수 자료형

방금 앞에서 배운 자료형은 양수와 음수 모드 저장가능하였다.

하지만, 양수만 저장한다면 두 배 더 넓은 범위의 값을 저장할 수 있다.

이때, unsigned를 사용한다.

unsigned는 정수형을 양수 전용으로 쓰고 싶을 때 사용하며,

일반적인 int a; 에는 자동으로 signed로 선언되기 때문에 우리 눈에는 보이지 않는 것이다.

#include <stdio.h>

int main(void)
{
    unsigned int a;

    a = 4294967295;        //    큰 양수 저장
    prtinf("%d\n", a);    // %d로 출력
    a = -1;                // 음수 저장
    printf("%u\n", a);    // %u로 출력

    return 0;
}

// 결과
-1
4294967295

출력한 값을 보면 저장한 값과 반대로 출력이 되었다.

이유는, 저장되는 형태는 같으나, 해석해서 보여주는 방법이 다르기 때문이다.

%d = 부호까지 생각해서 10진수로 출력하는 변환문자

%u = 부호 없는 10진수로 출력하는 변환문자

 

4.실수 자료형

데이터를 구현하는 방법이 정수와 다르기 때문에, 별도의 자료형을 사용한다.

■ ← 1byte (유효숫자)
■■■■ float(7)
■■■■■■■■ double (15)-
■■■■■■■■ long double (15 이상)

정수랑 다르게 실수에서는 값의 범위보다 유효숫자의 개수에 주목할 필요가 있다.

유효숫자 는 많을수록 더 정확한 값을 표현 할 수있다.

#include <stdio.h>

int main(void)
{

    float ft = 1.234567890123456789;        // 유효 숫자가 많은 값으로 초기화
    double db = 1.234567890123456789;

    printf("float형 변수의 값 : %.20f\n", ft);    // 소수점 이하 20자리까지 출력
    printf("double형 변수의 값: %.20lf\n", db);

    return 0;
}

컴퓨터에서 실수 표현은 오차가 있기 때문에

자료형에 따라 유효 숫자 범위 내에서 사용해야 한다.

*특징 *

  1. 정수형이 기본이며, 실수형은 꼭 필요한 경우 사용한다.
  2. 실수형은 유효숫자가 많은 double형을 기본으로 사용한다.
  3. 컴파일러 마다 구현방식이 다르다면, 코드 호환성을 보장하지 못하기 때문에, 주의해서 사용해야한다.



5.문자열 저장

#include <stdio.h>

int main(void)
{
    char fruit[20] = "strawberry";    //char 배열 선언과 문자열 초기화

    printf("딸기 : %s\n", fruit);                //배열명으로 저장된 문자열 출력
    printf("딸기쨈 : %s %s\n", fruit, "jam"); // 문자열 상수를 직접 %s로 출력 

    return 0;    
}

char fruit[6] = "apple";

fruit = 배열명
[ 6 ] = 문자열의 길이 +1 이상 (null 문자때문에 +1 을 해준다.)

  • 배열에는 대입 연산자를 사용할 수 없다. ( 단, 선언할 때에는 제외)대입연산자 왼쪽에는 상수가 올 수 없기 때문에, 사용할 수 없다.
  • 배열이름은 = 주소 = 상수
  • char 배열에 문자열 복사이때에는 strcpy 함수를 사용한다.
  • 앞에서 배열에는 대입 연산자를 사용할 수 없다고 하였다, 그럼 새로운 문자열을 저장하려면 어떻게 해야할까?
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>        // 문자열을 다룰 수 있는 string.h 헤더 파일 포함

int main(void)
{

    char fruit[20] = "strawberry";    // strawberry로 초기화

    printf("%s\n", fruit);            // strawberry 출력
    strcpy(fruit, "banana");        // fruit에 banana 복사
    printf("%s\n", fruit);            // banana 출력

    return 0;
}

⁜ 컴파일 오류가 발생했을 때 , 소스 코드 첫 줄에 #define _CRT_SECURE_NO_WARNINGS 을 사용한다.



6. const를 사용한 변수

#include <stdio.h>

int main()
{
    int income = 0;                            // 소득액 초기화
    double tax;                                // 세금
    const double tax_rate = 0.12;            // 세율 초기화

    income = 546;                            // 소득액 저장
    tax = income * tax_rate;                // 세금 계산
    printf("세금은 : %.1lf입니다.\n", tax);

    return 0;
}
  • const를 사용한 변수는 초깃값이 수정이 불가능하다.
  • => 상수처럼 사용가능



7. 예약어와 식별자

  • 예약어는 컴파일러와 사용 방법이 약속된 단어 ex) 자료형 이름
  • 식별자는 필요에 따라 사용자가 만들어 사용하는 단어 ex) 변수
  • 식별자 만드는 규칙
  1. 알파벳 대소문자, 숫자, 밑줄(_) 로 만든다.
  2. ex) make_money / Be-apple ~ (x)
  3. 숫자로 시작할 수 없다.
  4. ex) 1num (x) / num1 (O)
  5. 대문자와 소문자는 서로 다른 식별자로 인식한다.( 대소문자 구별 )\
  6. ex) apple != APPLE
  7. 예약어는 식별자로 사용할 수 없다.
  8. ex) short (x)



8. scanf 함수의 사용법

scanf("%d", &a);

        %d     =    int형 변환 문자

        &     =     변수명 앞에 붙인다.

        a     =    변수명

 

  • scanf 함수를 사용한 입력
#include <stdio.h>

int main(void)
{
    int a;
    
    scanf("%d", &a);			// 여기서 변수 a에 값 입력
    printf("입력된 값 : %d\n", a);	 // 입력한 값 출력
    
    return 0;
}

scanf 함수를 사용한 입력scanf 함수는 입력 값을 받는 함수로, 실행 시 원하는 값을 입력 할 수 있다.

하지만 문자열 입력 은 char배열(%s) 을 이용하며, &기호를 사용하지 않는다.

이렇게 입력을 받으려면 자료형에 따른 입력 변환 문자와 변수 앞에 &를 사용한다.

 

만약, 여러가지 값을 한번에 받아서 입력하고 싶을 때는 어떻게 하면 될까?

다음과 같이 연속 입력이 가능하다.

  • scanf 함수를 사용한 연속 입력
#include <stdio.h>

int main(void)
{
    int age;				// 나이는 정수형
    double height;			// 키는 실수형
    
    printf("나이와 키를 입력하세요 : ");	// 입력 안내 메시지 출력
    scanf("%d%lf", &age, &height);	   // 나이와 키를 함께 입력
    printf("나이는 %d살, 키는 %.1lfcm입니다\n", age, height);	// 입력값 출력
    
    return 0;
}

이렇게 연속 값을 입력 받을 수 있으며,

둘 이상의 값을 입력 시 에는 [ Space Bar ], [ Tab ], [ Enter ] 로 구분하여 준다.

 

[ Space Bar ] 

나이와 키를 입력하세요 : 23 168.7

 

[ Tab ]

나이와 키를 입력하세요 : 23	168.7

 

[ Enter ]

나이와 키를 입력하세요 : 23
168.7 

 

9. 문자 & 문자열의 입력

#include <stdio.h>

int main(void)
{
    char grade;            // 학점을 입력할 변수
    char name[20];        // 이름을 입력할 배열

    printf("학점 입력 : ");
    scanf("%c", &grade);    // grade 변수에 학점 문자 입력

    printf("이름 입력 : ");
    scanf("%s", name);    // name 배열에 이름 문자열 입력, &를 사용하지 않는다.

    printf("%s의 학점은 %c입니다.\n", name, grade);

    return 0;
}



[ 마지막 정리 ]

  1. 변수 선언으로 메모리에 저장 공간을 확보하여,
    대입 연산자( = )로 변숫값을 초기화하거나 값을 저장한다.
    초기화하지 않은 변수에는 쓰레기 값 이 들어 있다.
  2. 변수의 형태를 자료형이라 하며, 정수형과 실수형으로 나눈다.
  3. 변수에 const를 사용하면 상수처럼 사용할 수 있다.
  4. 예약어는 컴파일러와 약속된 단어이고,
  5. 식별자는 사용자가 만들어낸 단어이다.
  6. scanf 함수 로 입력할 때 변수 앞에 &를 사용한다.
  7. 둘 이상의 값을 입력 할 때는 [ Space Bar ], [ Tab ], [ Enter ] 로 구분한다.
  8. 문자열 입력 은 char 배열을 이용하며, &기호를 사용하지 않는다.


[ 표로 정리하기 ]

  • 정수형 종류
자료형 크기(Byte) 값의 저장 범위 출력 변환 문자
char 1 -128 ~ 127 %c 또는 %d
short 2 - 32768 ~ 32767 %d
int 4 - 2147483648 ~ 2147483647 %d
long 4 - 2147483648 ~ 2147483647 %ld



  • unsigned 정수 자료형
자료형 크기(Byte) 값의 저장 범위 출력 변환 문자
unsigned char 1 0~ 255 %u
unsigned short 2 0 ~ 65535 %u
unsigned int 4 0 ~ 4294967295 %u
unsigned long 4 0 ~ 4294967295 %lu



  • 실수형 종류
자료형 크기(Byte) *유효 숫자 출력 변환 문자
float 4 7 %f
double 8 15 %lf
long double 8 이상 15 이상 %Lf



  • 자료형에 따른 입력 변환 문자
데이터 종류 자료형 크기(Byte) 입력 변환 문자
정수 (unsigned) short 2 %hd (%hu)
(unsigned) int 4 %d (%u)
(unsigned) long 4 %ld (%lu)
(unsigned) long long 8 %lld (%llu)
실수 float 4 %f
double 8 %lf
long double 8, 10, 12, 16 %Lf
문자 char 1 %c
문자열 char 배열 가변적 %s