C언어 프로그래밍의 이해 Ch03. 기본 자료형, 변수와 상수
목차 3.1 다섯 가지 기본 자료형 3.2 기본형의 수정 3.3 식별자의 이름 3.4 변수 3.5 기억장소 지정자 Ch03. 기본 자료형, 변수와 상수 목차 3.1 다섯 가지 기본 자료형 3.2 기본형의 수정 3.3 식별자의 이름 3.4 변수 3.5 기억장소 지정자 3.6 변수 초기화 3.7 상수 2
3.1 다섯 가지 기본 자료형 기본 자료형 C언어의 기본 자료형 Ch03. 기본 자료형, 변수와 상수 3.1 다섯 가지 기본 자료형 기본 자료형 자료형의 크기와 범위는 각 프로세서 종류와 C 구현 제품에 따라 다를 수 있음 문자형 크기는 1byte (=8bit) 정수는 2byte (1 단어[Word]의 크기에 대응) ANSI C표준에서는 각 자료형의 최소 범위만 규정, 크기는 규정하지 않음 이식성 C언어의 기본 자료형 자료형 의미 키워드 character 문자 데이터 char integer 부호 있는 정수 int float 부동 소수점 double 배정도 실수 void 값이 없음 3
Ch03. 기본 자료형, 변수와 상수 3.2 기본형의 수정 수정자(modifier) void형을 제외하고, 기본 자료형들 앞에 다양한 수정자(modifier)를 사용할 수 있음 수정자는 다양한 상황에 대처하기 위해서 기본형들의 의미를 수정하는데 사용 정수 기본형에는 signed, short, long, unsigned 등 모든 수정자 적용 가능 문자형에는 unsigned와 signed를 적용할 수 있으며, 배정도형에는 long을 적용할 수 있음 4
3.2 기본형의 수정 ANSI C 표준에 정의된 모든 자료형 Ch03. 기본 자료형, 변수와 상수 -128~127 -32,768~32,767 -2,147,483,648~2,147,483,647 5
3.2 기본형의 수정 [따라하기1] 각 자료형의 크기를 바이트 단위로 출력 Ch03. 기본 자료형, 변수와 상수 #include <stdio.h> int main(void) { printf("자료형의 크기(Byte 단위)\n"); printf("char : %d \n", sizeof(char)); printf("unsigned char : %d \n", sizeof(unsigned char)); printf("signed char : %d \n", sizeof(signed char)); printf("int : %d \n", sizeof(int)); printf("unsingned int : %d \n", sizeof(unsigned int)); printf("signed int : %d \n", sizeof(signed int)); printf("short int : %d \n", sizeof(short int)); printf("unsigned short int : %d \n", sizeof(unsigned short int)); printf("signed short int : %d \n", sizeof(signed short int)); printf("long int : %d \n", sizeof(long int)); printf("signed long int : %d \n", sizeof(signed long int)); printf("unsigned long int : %d \n", sizeof(unsigned long int)); printf("float : %d \n", sizeof(float)); 6
3.2 기본형의 수정 [따라하기1] 각 자료형의 크기를 바이트 단위로 출력 Ch03. 기본 자료형, 변수와 상수 printf("double : %d \n", sizeof(double)); printf("long double : %d \n", sizeof(long double)); return 0; } 7
3.3 식별자의 이름 식별자 명명 규칙 식별자의 첫 문자는 반드시 문자(letter)나 또는 밑줄(_)로 시작 Ch03. 기본 자료형, 변수와 상수 3.3 식별자의 이름 식별자 명명 규칙 식별자의 첫 문자는 반드시 문자(letter)나 또는 밑줄(_)로 시작 식별자는 문자, 숫자, 밑줄로 구성 식별자에 공백을 포함하거나 밑줄을 제외한 특수 문자를 포함할 수 없음 예약어는 사용 할 수 없음 / 대소문자 구분 의미있는 식별자 사용(권장) 적합 부적합 count 1count /* 숫자로 시작할 수 없다. */ test23 hi!there /* 밑줄을 제외한 특수문자 사용 */ high_balance high balance /* 공백을 포함할 수 없다. */ forMan for /* 키워드를 사용할 수 없다. */ 8
3.3 식별자의 이름 식별자 명명 규칙 외부 이름(external names) 내부 이름(internal names) Ch03. 기본 자료형, 변수와 상수 3.3 식별자의 이름 식별자 명명 규칙 외부 이름(external names) 파일간에 공유된 함수 이름, 전역 변수 6개까지의 문자로 구분 내부 이름(internal names) 지역 변수 31개 문자까지 사용 가능 대소문자 구분 count ≠ Count ≠ COUNT 단순한 문자보다는 구체적인 단어의 조합 의미 없는 식별자 의미 있는 식별자 a, b, c, d height, length, width, volume 9
3.4 변수 변수(variable)는 변하는 값을 저장하기 위한 것 변수 선언 예 선언된 위치 함수의 내부 지역변수 Ch03. 기본 자료형, 변수와 상수 3.4 변수 변수(variable)는 변하는 값을 저장하기 위한 것 프로그램에서 수정될 수 있는 값을 저장하기 위해 사용된 기억 장소의 위치 이름 변수 선언 예 선언된 위치 함수의 내부 지역변수 함수의 매개변수 정의 형식 매개변수 함수의 외부 전역변수 type variable_list; int I, h, l; short int si; unsigned int ui; double balance, profit, loss; 10
3.4 변수 지역변수 함수 내부에 선언된 변수 C언어에서는 이 변수들을 자동 변수라고 하기도 함 Ch03. 기본 자료형, 변수와 상수 3.4 변수 지역변수 함수 내부에 선언된 변수 C언어에서는 이 변수들을 자동 변수라고 하기도 함 변수가 선언된 블록내의 명령어들에 의해서만 사용 지역변수는 자신의 블록이 실행될 때 생성되며 이것이 끝날 때 소멸 void func1(void) { int x; /* 함수 func1()내의 지역변수 */ x = 10; } void func2(void) int x; /* 함수 func2()내의 지역변수 */ x = -199; 11
3.4 변수 [따라하기2] 지역변수의 사용 예 Ch03. 기본 자료형, 변수와 상수 #include <stdio.h> void func1(void); /* func1() 함수의 원형 */ void func2(void); /* func2() 함수의 원형 */ int main(void) { func1(); func2(); return 0; } void func1(void) int x; /* func1() 함수 내의 지역 변수 x */ x = 10; printf("func1()의 지역변수 x의 값은 %d입니다.\n", x); /* 10 출력 */ 12
3.4 변수 [따라하기2] 지역변수의 사용 예 Ch03. 기본 자료형, 변수와 상수 void func2(void) { int x; /* func2() 함수내의 지역 변수 x */ x = 20; printf("func2()의 지역변수 x의 값은 %d입니다.\n", x); /* 20 출력 */ int x; x = 30; /* 블록 내의 지역 변수 x */ printf("블록내의 지역변수 x의 값은 %d입니다.\n", x); /* 30 출력 */ } 13
3.4 변수 지역 변수 지역변수는 자신의 블록이 실행될 때 생성되며 이것이 끝날 때 소멸 Ch03. 기본 자료형, 변수와 상수 3.4 변수 지역 변수 지역변수는 자신의 블록이 실행될 때 생성되며 이것이 끝날 때 소멸 특정 함수가 호출될 때, 지역변수가 생성되며, 함수가 리턴될 때 소멸 지역변수들이 함수 함수 호출간에 그 값을 유지할 수 없음 (값의 유지는 static 수정자를 사용하면 가능) 지역 변수는 메모리 스택에 저장 스택(stack)은 메모리에서 동적으로 변하는 지역 함수 호출 시 지역변수들의 값을 유지 할 수 없음 14
Ch03. 기본 자료형, 변수와 상수 3.4 변수 형식 매개변수 특정 함수 정의 내에서 정의된 함수의 인자를 함수의 형식 매개변수(formal parameter)라고 한다 함수 내의 또 다른 지역변수처럼 행동 매개변수들은 지역변수이기 때문에, 해당 함수가 실행될 때 생성되며 함수가 끝나면 소멸 형식 매개변수 선언 시 그것의 형(Type)을 함께 지정 /* 형식 매개변수 a, b 값을 더하여 지역 변수 x에 할당하여 리턴*/ int sum(int a, int b) { int x; x = a + b; return x; } 15
3.4 변수 [따라하기3] 매개변수의 사용 예 Ch03. 기본 자료형, 변수와 상수 #include <stdio.h> void sum(int, int); /* sum() 함수의 원형 */ int main(void) { sum(7, 8); /* sum() 함수를 매개변수 7, 8로 하여 호출. */ return 0; } void sum(int a, int b) int x; /* 지역변수 x값 선언 */ x = a + b; /* 매개변수 a와 b의 값을 더하여 변수 x에 할당 */ printf("7 + 8 = %d\n", x); /* 지역변수 x값 출력 */ 16
Ch03. 기본 자료형, 변수와 상수 3.4 변수 전역 변수 전역변수(global variable)는 프로그램 전체적으로 알려지며 프로그램의 어떤 부분에서도 사용 가능 프로그램의 실행이 끝날 때까지 값이 보존 전역변수의 저장소는 컴파일러에 의해서 별도로 메모리의 고정된 지역에 할당 전체 프로그램의 실행 동안 메모리를 차지 프로그램의 많은 함수들이 같은 자료를 공유할 때 사용 불필요한 전역변수의 사용은 자제 메모리 점유 변수 값 수정이 가능하기 때문에, 큰 프로그램 개발 시 프로그램 오류 발생 가능성 높음 17
3.4 변수 [따라하기4] 전역 변수와 지역변수의 차이점 예 Ch03. 기본 자료형, 변수와 상수 #include <stdio.h> int count; /* count는 전역변수 */ void func1(void); void func2(void); void main(void) { count = 100; /* 전역 변수 count에 100할당 */ func1(); } void func1(void) ++count; /* 전역 변수 count를 1 증가 */ func2(); 18
3.4 변수 [따라하기4] 전역 변수와 지역변수의 차이점 예 Ch03. 기본 자료형, 변수와 상수 printf("전역변수 count의 값은 %d이다.\n", count); /* 101 출력 */ } void func2(void) { int count; /* count는 지역 변수 */ count = 1; /* 지역 변수 count에 1 할당 */ ++count; /* 지역 변수 count를 1 증가 */ printf("func2()의 지역변수 count의 값은 %d이다. \n", count); /* 2 출력 */ 19
Ch03. 기본 자료형, 변수와 상수 실습 과제 제3장 따라하기1~ 따라하기4번까지 실습 20
Ch03. 기본 자료형, 변수와 상수 3.5 기억장소 지정자 기억장소 지정자(storage class specifier)들은 컴파일러에게 해당 변수의 자료 저장하는 방법을 알려줌 auto 해당 변수가 프로그램 내에서 자동으로 생성 extern 외부 프로그램에서 사용될 수 있는 방법을 제공 static 프로그램 전체적으로 그 범위를 지정할 수 있도록 함 register 일시적인 저장 장소(register)를 제공 일반 형식 storage_specifier type var_name 21
3.5 기억장소 지정자 auto 지역 변수는 기본적으로 auto(자동) 속성을 가지게 됨 Ch03. 기본 자료형, 변수와 상수 3.5 기억장소 지정자 auto 지역 변수는 기본적으로 auto(자동) 속성을 가지게 됨 auto는 명시적으로 사용해도 무방하지만, 일반적으로 생략 auto 지역 변수가 함수 내에서 선언되면, 함수가 호출될 때 선언된 지역 변수를 위해 기억장소를 할당 함수가 종료되면 사용된 기억장소 영역은 다시 시스템으로 복귀 다시 함수가 호출되면, 새로운 영역의 기억장소가 할당되며, 이전의 값은 유지되지 않음 (auto) int a, b, c; 22
3.5 기억장소 지정자 [따라하기5] 전역변수와 기억장소 지정자 auto Ch03. 기본 자료형, 변수와 상수 #include <stdio.h> int a = 1, b = 2, c = 3; /* 함수 블록 밖에 선언되었으므로 전역 변수 */ int f(void); int main(void) { printf("%3d\n", f( )); /* f( )의 호출에 의해서 a=4로 변했지만 b, c는 변하지 않음 */ printf("%3d%3d%3d\n", a, b, c); /* a, b, c : 전역 변수 */ return 0; } int f(void) int b, c; /* function의 블록 안에서 선언 되었으므로 전역 변수 b,c와는 다른 메모리에 저장 */ a= b= c= 4; /* a : 전역 변수 b, c : f()내에서 선언된 auto 변수 */ return (a+b+c); 23
파일 1에서 선언된 전역변수의 사용을 위해 extern 사용 Ch03. 기본 자료형, 변수와 상수 3.5 기억장소 지정자 extern C언어의 큰 프로그램을 여러 모듈들로 분류하여 컴파일하고 링크할 수 있음 extern은 특정 파일의 프로그램에서 사용된 전역 변수들이 모든 분리된 파일들에 알려 질 수 있도록 하는 방법을 제공 extern var_list; 파일 1에서 선언된 전역변수의 사용을 위해 extern 사용 24
3.5 기억장소 지정자 [따라하기6] extern 지정자 사용 예 Ch03. 기본 자료형, 변수와 상수 /* file1.c */ #include <stdio.h> int a = 1, b = 2, c = 3; /* extern 변수 */ int f(void); int main(void) { printf("%d\n", f( )); printf("%d %d %d\n", a, b, c); return 0; } /* file2.c */ int f(void) { extern int a; /* 다른 file에서 선언된 전역 변수 a의 메모리에 접근 */ int b, c; a= b= c= 4; /* a : extern 변수 b, c : f()내에서 선언된 auto 변수 */ return (a+b+c); } 25
3.5 기억장소 지정자 정적(static) 변수 정적 지역변수 그 자신의 함수 또는 파일 내에서 영구적인 변수 Ch03. 기본 자료형, 변수와 상수 3.5 기억장소 지정자 정적(static) 변수 그 자신의 함수 또는 파일 내에서 영구적인 변수 static 키워드를 사용 전역/지역 변수는 변수의 범위를 지정, 정적 변수는 해당 변수의 생명 주기를 지정 지역 변수와 전역 변수에 적용함에 따라 그 효과가 다름 정적 지역변수 컴파일러는 영구적인 기억 장소를 생성 이것을 선언한 블록 내에서만 알려지지만 이것의 생명 주기는 전체 프로그램이 끝날 때까지 유지 함수 실행 이후에도 자신의 값을 유지하는 지역변수 series(void){ static int series_num = 100; /* 정적 지역변수 초기화*/ series_num = series_num+23; return series_num; } 26
3.5 기억장소 지정자 [따라하기7] 정적 지역변수 사용 예 Ch03. 기본 자료형, 변수와 상수 #include <stdio.h> int f1(void); int f2(void); int main(void) { int i; for(i=0; i<5; i++) { printf("지역변수 a: %d, 정적 지역변수 a: %d\n", f1( ), f2( )); } return 0; int f1(void) int a = 0; /* 함수가 호출될 때 마다 다시 메모리가 할당되어 0으로 초기화 */ 27
3.5 기억장소 지정자 [따라하기7] 정적지역변수 사용 예 Ch03. 기본 자료형, 변수와 상수 a++; return a; } int f2(void) { static int a = 0; /* 처음 호출 시만 메모리에 할당하여 0으로 초기화, 종료 후에도 초기화된 값을 유지 */ 28
3.5 기억장소 지정자 정적 전역변수 컴파일러는 선언된 파일에만 알려지는 전역 변수를 생성 Ch03. 기본 자료형, 변수와 상수 3.5 기억장소 지정자 정적 전역변수 컴파일러는 선언된 파일에만 알려지는 전역 변수를 생성 다른 파일에서는 내용을 직접 수정하거나 접근 할 수 없음 정적 전역변수는 사용자가 작성한 프로그램 부분들을 다른 곳으로부터 숨길 수 있도록 함 매우 크고 복잡한 프로그램을 관리하려고 할 때 매우 유용 29
Ch03. 기본 자료형, 변수와 상수 3.5 기억장소 지정자 register 변수의 값이 CPU의 레지스터리에 저장되며 이것의 값을 결정하거나 수정하기 위한 메모리 접근이 필요하지 않기 때문에, 보통의 변수들을 사용하는 것보다 빠름 지역 변수이고 빠른 계산이 필요한 경우 사용 (예: 루프) register변수는 주소값(&)을 가지지 않음 CPU의 레지스터리에 저장 최적의 register변수의 개수는 C 환경과 구현 제품에 따라 다름 개수에 대한 허용치에 도달하면 자동으로 register변수를 메모리 변수로 변환 for(register i = 0; i < 10; i++) 30
3.6 변수 초기화 초기화 초기화의 일반 형식과 예 전역 변수와 정적 지역변수는 프로그램의 실행 시작 시에만 한 번 초기화 Ch03. 기본 자료형, 변수와 상수 3.6 변수 초기화 초기화 초기화의 일반 형식과 예 전역 변수와 정적 지역변수는 프로그램의 실행 시작 시에만 한 번 초기화 (정적 지역변수를 제외) 지역변수들은 이들이 선언된 블록이 실행될 때마다 초기화 해줘야 함. 초기화되지 않은 전역변수와 정적 지역변수들은 자동적으로 0이 설정 type variable_name = constant; char ch = 'a'; int first = 0; float balance = 123.23; 31
Ch03. 기본 자료형, 변수와 상수 3.6 변수 초기화 변수 선언과 초기화의 습관화 몇몇의 시스템에서는 초기화되지 않은 변수를 사용하면 컴파일러가 오류 메시지를 출력할 수 있음 기존의 메모리에 혹시라도 남아 있을 수 있는 garbage 값이 사용될 수 있으므로, 변수를 대입문의 right side에 처음 사용시 반드시 초기화 필요 변수 초기화는 프로그래머의 좋은 습관 32
3.6 변수 초기화 [따라하기8] 초기화 예 Ch03. 기본 자료형, 변수와 상수 전역변수와 정적 지역변수는 초기화 하지 않아도 자동으로 컴파일러가 0값으로 초기화 auto변수는 초기화 하지 않았기 때문에, 메모리의 알 수 없는 값이 출력 (garbage) #include <stdio.h> int extern_a; /* 전역변수: 컴파일러가 0으로 초기화 */ int main(void) { static int static_a; /* 정적 지역변수: 컴파일러가 0으로 초기화 */ int auto_a; /* auto 변수: 초기화되지 못함, 알 수 없는 값 */ printf("%d\n%d\n%d\n", extern_a, static_a, auto_a); return 0; } 33
3.7 상수 상수(constant) 프로그램에서 수정될 수 없는 고정된 값 어떤 기본 자료형들도 사용 가능 Ch03. 기본 자료형, 변수와 상수 3.7 상수 상수(constant) 프로그램에서 수정될 수 없는 고정된 값 어떤 기본 자료형들도 사용 가능 상수가 표현되는 방법은 형에 따라 다름 34
'A'라는 문자는 아스키(ASCII) 코드 65에 해당하므로 ch에는 결과적으로 65가 들어감 3.7 상수 8진수: 0~7 16진수: 0~9, A, B, C, D, E ,F 16진수(hexadecimal)와 8진수(octal) 상수 문자열 상수 문자열(string)은 “”에 포함되는 문자들의 집합 문자상수는 단일 인용부호를 사용 문자 상수라는 말이 의미하듯이 내부적으로는 문자 상수도 숫자로 취급 int hex = 0x80; /* 10진수: 8X161 + 0X160 = 128+0= 128 */ int oct = 012; /* 10진수: 1X81+ 2X80 = 8+2 =10 */ “this is a test” ‘a’ 'A'라는 문자는 아스키(ASCII) 코드 65에 해당하므로 ch에는 결과적으로 65가 들어감 char ch = 'A'; char ch = 65; 35
3.7 상수 아스키코드 표 컴퓨터는 0,1만 인식 문자는 인식 못함 문자와 숫자 매핑 아스키코드 Ch03. 기본 자료형, 변수와 상수 3.7 상수 아스키코드 표 컴퓨터는 0,1만 인식 문자는 인식 못함 문자와 숫자 매핑 아스키코드 36
3.7 상수 [따라하기9] 문자 상수와 아스키 코드 Ch03. 기본 자료형, 변수와 상수 #include <stdio.h> int main(void) { char ch = 'A'; printf("char to ASCII : %d\n", ch); /* A의 ASCII 값 65 출력 */ ch = 65; printf("ASCII to char : %c\n", ch); /* ASCII 값 65에 해당하는 A 출력 */ return 0; } 37
3.7 상수 백슬래쉬 문자상수 캐리지 리턴 등과 같은 몇몇 개의 문자들은 키보드에서 문자열로 입력하기 불가능 Ch03. 기본 자료형, 변수와 상수 3.7 상수 백슬래쉬 문자상수 캐리지 리턴 등과 같은 몇몇 개의 문자들은 키보드에서 문자열로 입력하기 불가능 C는 특수한 백슬래쉬 문자상수(backslash character constant)를 포함하고, 이러한 특수한 문자들을 상수로 쉽게 입력할 수 있도록 하는 여러 가지의 백슬래쉬 코드들을 제공 38
3.7 상수 [따라하기10] 백슬래시 문자 상수 사용 예 Ch03. 기본 자료형, 변수와 상수 #include <stdio.h> int main(void) { printf("알람~!!\a\n"); printf("\n\t\"This is a test\"\n"); return 0; } 39
실습 과제 기본 숫자를 먼저 입력하고, 이에 대한 사칙 연산을 차례대로 수행하는 프로그램을 작성 (Page 97) Ch03. 기본 자료형, 변수와 상수 실습 과제 기본 숫자를 먼저 입력하고, 이에 대한 사칙 연산을 차례대로 수행하는 프로그램을 작성 (Page 97) 40
Q&A 41