#include <stdio.h> int main(void) { int num; printf( Please enter an integer: "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num %d\n", num); return 0; } 1 학습목표 의 개념에 대해 알아본다. 리터럴 상수, 매크로 상수, const 변수에 대해 알아본다. C 언어의 데이터 형에 대해 알아본다. 2
목차 변수 상수 데이터형 문자형 정수형 실수형 sizeof 연산자 3 변수는 값이 변경될 수 있는 데이터이고, 상수는 값이 변경될 수 없는 데이터이다. 4
변수 데이터를 보관해둘 필요가 있을 때, 변수를 사용한다. 변경될 수 있는 데이터는 메모리(memory)에 보관한다. 메모리는 연속된 데이터 바이트의 모임을 말하며, 메모리의 각 바이트는 주소를 갖는다. 5 변수 메모리에 저장할 데이터 값의 형식(type)에 따라 메모리가 얼마 만큼 필요한지가 결정된다. 6
변수 변수의 선언 변수를 사용하기 위해서 특정 크기의 메모리를 준비하는 것을 변수를 메모리에 할당한다 고 한다. 저장될 값의 데이터 형에 따라 필요한 만큼 메모리를 할당 7 변수 변수의 사용 변수를 선언하고 나면 변수의 이름을 이용해서 메모리에 접근할 수 있다. 특정 값을 변수에 저장하거나 메모리에 보관된 변수의 값을 읽어올 수 있다. 8
변수 변수 선언의 기본적인 형식 기본 데이터형 문자형 : char 정수형 : short, int, long 실수형 : float, double 9 10 변수 C의 데이터형
변수 식별자(identifier) : 변수를 구분하기 위해서 사용되는 이름 식별자 규칙 식별자는 반드시 영문자, 숫자, 밑줄 기호(_)만을 사용해야 한다. 식별자의 첫 글자는 반드시 영문자 또는 밑줄 기호(_)로 시작해야 한다. 식별자는 숫자로 시작해서는 안 된다. 식별자에는 밑줄 기호(_)를 제외한 다른 기호를 사용할 수 없다. 식별자는 대소문자를 구분해서 만들어야 한다. name, Name, NAME은 모두 다른 이름으로 간주된다. C 언어의 키워드(keyword)는 식별자로 사용할 수 없다. C의 키워드 11 12 변수 변수의 선언 예 올바른 변수 선언의 예 잘못된 변수 선언의 예
변수 변수 선언 시 주의 사항 변수의 선언문은 다른 모든 문장보다 앞쪽에 위치해야 한다. 13 변수 변수의 사용(1/2) 변수의 값을 읽어오거나 저장하려면 변수명을 이용한다. 14
변수 변수의 사용(2/2) 변수에 값을 저장하려면 대입연산자()를 사용한다. 15 변수 변수의 초기화(1/2) 변수를 선언할 때 따로 초기화를 하지 않으면 쓰레기 값을 갖는다. 초기화되지 않은 변수를 사용하는 것은 위험하다. 16
변수의 초기화 변수의 초기화(2/2) 변수가 처음 메모리에 할당될 때 값을 지정하는 것 17 변수 변수의 초기화 및 변수의 사용 방법 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 14: 15: /* Ex03_01.c */ #include <stdio.h> int main(void) { int amount; int price 1000; } 초기화 되지 않은 정수형 변수 초기화된 정수형 변수 printf("수량 : %d, 가격 : %d\n", amount, price); amount 100; 변수에 값 대입 price 2000; printf("수량 : %d, 가격 : %d\n", amount, price);13: return 0; 18
상수 리터럴(literal) 상수 값 자체 19 상수(Constant) 여러 가지 리터럴 상수 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: /* Ex03_02.c */ #include <stdio.h> int main(void) { char grade '\x41'; int data 0x7b; unsigned int age 75U; long filesize 1234567L; double area 123.25; double taxrate 25e-2; float temperature 17.5F; 리터널 상수로 초기화된 변수 printf("grade %c\n", grade); printf("data %d, %o, %x\n", data, data, data); printf("age %u\n", age); printf("filesize %d\n", filesize); printf("area %f, %e, %g\n", area, area, area); printf("taxrate %f\n", taxrate); printf("temperature %f\n", temperature); } return 0; 20
상수(Constant) printf 함수의 형식 문자열 21 상수 매크로 상수 #define문으로 정의되는 상수 22
상수 전처리기(preprocessor) #define문은 전처리기(또는 선행처리기)에 의해서 처리된다. 23 상수 #define문의 처리 #define문은 #define으로 정의된 매크로 상수를 특정 값으로 대치(replace)한 다. 24
상수 매크로 상수의 정의 및 사용 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: /* Ex03_03.c */ #include <stdio.h> #define MAX 100 int main(void) { int num1 MAX; int num2 MAX - 1; int num3 -MAX; 매크로 상수 정의 MAX를 100으로 바꿔서 처리 printf("num1 %d\n", num1); printf("num2 %d\n", num2); printf( num3 %d\n, num3); printf("max %d\n", MAX); } 안의 MAX는 100으로 바뀌지 않음 return 0; 25 상수 매크로 상수 정의 시 주의 사항 #define문은 C의 문장이 아니므로 #define문의 끝에는 세미콜론(;)이 필요 없 다. 매크로 상수의 값은 변경할 수 없다. 26
상수 const 변수 변수 선언 시 데이터형 앞에 const를 지정하면 값을 변경할 수 없는 변수가 된다 const 변수는 선언 시 초기화해야 한다. const 변수의 값을 변경하려고 하면 컴파일 에러가 발생한다. 27 상수(Constant) const 변수의 선언 및 사용 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: /* Ex03_04.c */ #include <stdio.h> int main(void) { const double pi 3.14; const int max; const 변수 선언 초기화 되지 않았음으로 쓰레기 값을 가짐 printf("pi %f\n", pi); printf("max %d\n", max); pi 3.1415; max 100; } const 변수는 변경할 수 없다. return 0; 28
상수 이름이 있는 상수를 기호 상수라고 한다. 기호 상수의 장점 이름이 있는 상수를 사용하면 프로그램이 수정하기 쉬워진다. 이름이 있는 상수를 사용하면 프로그램의 가독성(readability)이 향상된다. 프로그램을 수정하기 쉽다. 프로그램을 이해하기 쉽다. 29 데이터 형 C 프로그램에서 사용되는 모든 변수나 상수 값은 정해진 데이터 형을 갖는다. 데이터 형에 의해서 주어진 값의 이진 표현이 결정된다. 30
기본 데이터형(primitive data type) 문자형 : char 정수형 : short, int, long 실수형 : float, double 파생 데이터형(derived data type) 배열, 포인터 사용자 정의형(user-defined data type) 구조체, 공용체, 열거체 31 문자형 문자형 C 언어는 문자형으로 char 형을 제공한다. char 형은 1바이트 크기의 데이터 형으로 문자 코드를 저장한다. 대표적인 문자 코드로는 ASCII 코드나 한글 완성형 코드 등이 있다. 특수 문자 ASCII 코드 중 특별한 용도로 사용되는 특수 문자는 \ 와 함께 나타낸다. 32
문자형 문자의 ASCII 코드 확인 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: /* Ex03_05.c */ #include <stdio.h> int main(void) { char ch; Char 형 변수 선언 scanf("%c", &ch); printf("%c 문자의 ASCII 코드 : %d (%x)\n", ch, ch, ch); } ASCII 코드 출력 return 0; 33 문자형 특수문자 34
문자형 문자 코드 멀티바이트 문자집합(MBCS) 한 문자를 여러 바이트로 표현하는 방식 영문자는 한 바이트, 한글은 두 바이 트로 표현 유니코드 문자집합 한글과 영문 모두 한 글자를 2바이트 로 표현 char형 대신 wchar_t 형을 사용 typedef unsigned short wchar_t; 35 정수형 정수형 C 언어는 정수형으로 short, int, long을 제공한다. short형의 크기 int형의 크기 long형의 크기 정수형은 signed형과 unsigned형으로 나누어지며, signed는 생략할 수 있다. 36
정수형 정수의 표현(1/2) 부호 있는 정수형은 최상위 비트(msb)를 부호 비트로 사용한다. 부호 있는 정수형은 음수를 표현하는 데 2의 보수를 사용한다. 2의 보수를 이용한 음수 표현 37 정수형 정수의 표현(2/2) 부호 없는 정수형은 최상위 비트를 값을 저장하는 용도로 사용한다. 38
정수형의 표현 signed와 unsigned 비교 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: /* Ex03_06.c */ #include <stdio.h> int main(void) { short num1-10; unsigned short num2 num1; printf("부호 있는 정수 : %d\n", num1); printf("부호 없는 정수 : %d\n", num2); } short 형 변수에 음수 -10 저장 음수이므로 최상위 비트가 1로 설정 unsigned short 형 변수에 -10 저장 최상위 비트가 1이지만 음수가 아닌 65526임 return 0; 39 정수형 데이터 형의 유효범위 40
정수형 short 형과 unsigned short 형의 오버플로우 확인 1 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: /* Ex03_07.c */ #include <stdio.h> int main(void) { short num1 32767; short num2-32768; unsigned short num3 65535; unsigned short num4 0; num1 num2 num3 num4 num1 num2 num3 num4 printf("num1 printf("num2 printf("num3 printf("num4 } short 형 변수가 담을 수 있는 최대값으로 초기화 short 형 변수가 담을 수 있는 최소값으로 초기화 unsigned short형 변수가 담을 수 있는 최대값으로 초기화 unsigned short형 변수가 담을 수 있는 최소값으로 초기화 + 1; - 1; + 1; - 1; %d\n", %d\n", %d\n", %d\n", 오버플로우 발생 num1); num2); num3); num4); return 0; 41 정수형 정수형의 오버플로우(overflow) 데이터 형의 유효 범위를 넘어서는 것 오버플로우가 발생하면 해당 데이터형의 유효범위 내의 값으로 설정되어 버린다. 42
정수형 정수형의 언더플로우(underflow) 43 정수형 short형과 unsigned short형의 유효 범위 44
오버플로우 short형의 이진 표현 45 정수형 데이터 형의 유효 범위 limits.h에 정의된 매크로 상수 이용 46
limits.h short 형과 unsigned short 형의 오버플로우 확인 2 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 22: 23: 24: /* Ex03_08.c */ #include <stdio.h> #include <limits.h> SHRT_MAX 등의 매트로 상수가 정의된 헤더 포함 int main(void) { short num1 SHRT_MAX; short num2 -SHRT_MIN; unsigned short num3 USHRT_MAX; unsigned short num4 0; num1 num2 num3 num4 num1 num2 num3 num4 printf("num1 printf("num2 printf("num3 printf("num4 } SHRT_MAX는 short형의 최대값 SHRT_MIN은 short형의 최소값 USHRT_MAX는 unsigned short형의 최대값 + 1; - 1; + 1; - 1; %d\n", %d\n", %d\n", %d\n", num1); num2); num3); num4); return 0; 47 실수형 실수의 표현 방식 고정소수점(fixed point) 방식과 부동소수점 (floating point) 방식이 있다. 부동소수점 방식을 주로 사용 실수의 정밀도 단정도(float형)와 배정도(double형) 48
실수형 float 형과 double 형의 정밀도 비교 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: /* Ex03_09.c */ #include <stdio.h> int main(void) { float pi1 3.141592653589793; double pi2 3.141592653589793; printf("float 형의 pi 값 : %f\n", pi1); printf("double 형의 pi 값 : %f\n", pi2); %f 는 소수점 이하 6자리까지 출력 printf("float 형의 pi 값 : %30.25f\n", pi1); printf("double 형의 pi 값 : %30.25f\n", pi2); } %30.25f 는 소수점 이하 25자리 출력 return 0; 49 실수형 float 형의 오버플로우와 언더플로우 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: /* Ex03_10.c */ #include <stdio.h> int main(void) { float num1 3.5e39; float num2 1.8e-39; float형으로 표현할 수 없는 값 printf("num1 %30.25f\n", num1); printf("num2 %30.25f\n", num2); } return 0; 50
sizeof 연산자 sizeof 연산자 주어진 값이나 데이터 형의 바이트 크기를 구한다. 51 sizeof 연산자 sizeof 연산자의 사용(1/2) 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: /* Ex03_11.c */ #include <stdio.h> int main(void) { char ch; int num; double fnum; printf("ch 의 바이트 크기 : %d\n", sizeof ch); printf("num 의 바이트 크기 : %d\n", sizeof num); printf("fnum의 바이트 크기 : %d\n", sizeof fnum); 변수나 상수의 크기를 구하려면 sizeof 연산자 이용 printf("3.14f의 바이트 크기 : %d\n", sizeof 3.14f); 52
sizeof 연산자 sizeof 연산자의 사용(2/2) 16: 17: 18: 19: 20: 21: 22: 23: 24: } printf("char 형의 바이트 크기 : %d\n", sizeof(char)); printf("short 형의 바이트 크기 : %d\n", sizeof(short)); printf("int 형의 바이트 크기 : %d\n", sizeof(int)); printf("long 형의 바이트 크기 : %d\n", sizeof(long)); printf("float 형의 바이트 크기 : %d\n", sizeof(float)); printf("double 형의 바이트 크기 : %d\n", sizeof(double)); 데이터형의 크기를 구하려면 sizeof 이용 return 0; 53 학습정리 변수 : 값이 변경될 수 있는 데이터, 값을 보관하기 위해서 메모리 사용 변수의 선언 : 데이터형과 변수명이 필요 int grade; 변수의 사용 : 변수의 이름을 이용 변수의 초기화 : 변수를 초기화하지 않으면 쓰레기 값을 가지므로, 초기화하는 것 이 좋다. int grade 100; 상수 : 프로그램에서 값이 변경되지 않는 요소, 리터럴 상수와 매크로 상수, const 변수가 있다. A, 10, 3.14 Æ 리터럴 상수 #define MAX 100 Æ 매크로 상수 const int max 100; Æ const 변수 54
학습정리 데이터 형 문자형 : char형이 있으며, 문자 코드를 저장한다. 정수형 : short, int, long형이 있으며, 부호 있는 정수(signed)와 부호 없는 정수 (unsigned)로 나누어진다. 실수형 : float형과 double형이 있다. sizeof 연산자 : 데이터 형이나 변수의 바이트 크기를 구한다. 55 수고하셨습니다. 질문 있습니까? NEXT Chapter 4장. 연산자 56