이상선의 C언어 5분 강의
변수와 자료형 - 5
안녕하세요.
주말에 댓글을 남겨주시고 몇분은 문자를 주셨는데
하아 너무 바빠서 이제야 올린다는 점 대단히 죄송스럽게 생각합니다.
안드로이드도 올려야되고!
다른 개발도 올려야되고!
공부한 것도 올려야되고!
곧 바로 초급 이상의 프로젝트 소스도 올릴 계획입니다.
죄송해 할 시간에 열심히 달리겠습니다. 오늘도 고고싱!!
코드 작성만이 살길이다!
코드는 백번 이해하는 것보다 한 번 적어보는 것이 훌륭한 프로그래머가 되는 지름길이다.
만약 당신이 책을 이해만하고 덮어버리는 습관이 있다면, 그건은 상당히 잘못되었다. 고치는 것을 추천한다.
11월입니다. 곧 많이 추워지겠죠! 11월엔 코드작성으로 추위를 훠이훠이~
오버플로/언더플로
프로그래밍 언어에는 오버플로와 언더플로라는 개념이 있다.
음 필자의 생각으로는 대단히 중요한 개념이다.
정말 대단히 중요한 개념이다!
저는 보안을 중요하게 생각하기 때문에!
지난 시간에 우리는 각 자료형의 크기에 대해 배웠다.
오버플로/언더플로라는 것은 이 자료형의 범주에서 벗어난 값이 저장되었을 때 생긴다.
바로 소스를 살펴보자.
#include <stdio.h>
int main(void)
{
short a = 32767;
printf("%d\n", a);
return 0;
}
이번 소스도 크게 어렵지 않다!
우리는 short가 2바이트 정수 형태의 자료형이라고 배운 바 있다.
1바이트가 8비트이기 때문에 2바이트는 16비트다!
16비트는 2의 16승 -1이므로
즉, -32767 ~ 32767까지 약 65000개가 조금 넘는 자료표현이 가능하다는 뜻이다.
양수 부분을 살펴보자. 우리는 방금 32767까지 저장이 가능하다고 방금 알아냈다.
그렇다면 위의 소스는 32767을 저장하여 출력하므로 아무 문제가 없다는 것을 알 수 있다.
이번엔 밑의 소스를 살펴볼까?
#include <stdio.h>
int main(void)
{
short a = 32767 + 1;
printf("%d\n", a);
return 0;
}
자!
이번에는 위의 소스에서 a값에 1만 더해봤다.
즉, 32767 + 1 해서 32768을 만들었다.
결과를 출력해보자! 어떻게 나오는가?
-32768이 나오지 않는가?
어떻게 이런 현상이 발생하게 된 것일까?
정수형 자료형에서 최대로 담을 수 있는 자료형 +1은 오버플로로 인하여 최소값이 저장된다.
반대로 최소값에서 -1한 값은 최대값이 저장된다. 놀랍지 않은가?
이것이 바로 오버플로와 언더플로의 개념이다.
그렇다면 오버플로와 언더플로가 왜 위험할까??
= 이것은 메모리를 다루는 데 오류가 발생하여 잘못된 동작을 하게 되는데 여기서 프로그램 취약점이 발생하게 된다.
데이터를 버퍼에 저장할 때 프로그래머가 지정한 곳이 아니라 그 밖에다가 저장하는 것이다. 쉽게 말해서 공백이 생긴다.
이 데이터는 근처 메모를 덮어 쓰게 되는데 그러면 다른 데이터의 영향을 줄 수 있다.
그러므로 메모리 오류, 프로그램 종료, 결과의 부정확, 보안 누설 등이 발생할 수 있는 것이다.
자료형은 항상 신경쓰며 쓰자!
상수
상수(constant)는 변수와 반대되는 개념이라고 생각하면 편하다.
변수는 데이터를 담는 그릇이라고 설명한 바 있다. 변수는 데이터 변경이 가능했다.
상수 역시 데이터를 담는 그릇이다. 그러나 데이터 변경이 불가능하다는 것이 차이점이다.
상수도 마찬가지로 이름이 있으나 정해진 하나의 값만으로 사용된다.
그리고 상수는 크게 2가지로 나뉘는데
▶ 리터럴 상수
▶ 심볼릭 상수
이렇게 2가지가 있다.
일반적으로 사용되는 7, 77.7과 같은 숫자 데이터 및 "안녕하세요"이런 데이터는
소스에 그대로 표현해 의미가 전달되기 때문에 리터럴 상수라고 부른다.
이 상수는 이름이 없다! 그냥 그 값 그대로 상수다.
정수형, 실수형, 문자, 문자열이 여기에 포함된다.
반면 변수처럼 이름을 갖는 상수는 심볼릭 상수라고 표현한다.
심볼릭 상수는 const 로 표현하는 상수, 매크로 상수, 열거형 상수가 존재하는데
큰 개념은 아마 뒤에서 배우게 될 것이므로 아직은 안심해도 된다.
조금 머리가 복잡할 수 있지만, 중요한 개념이다!
잘 모르겠으면 일단 개념만 잡고가자! 뒤에서 다시 만나게 될 것이다.
이스케이프 문자(문자 리터럴)
C언어에서는 '이스케이프 문자'라는 것이 있다.
줄바꿈 문자 \n을 기억하는가? 이 친구도 이스케이프 문자 중 하나다.
이스케이프 문자는 제어, 특수, 확장문자 등 여러가지 의미가 있다.
필자는 제어문자라고 많이 부른다.
위에 보이는 그림이 C언어에서 사용하는 대표적인 이스케이프 문자다.
우리가 자주 사용하는 \n도 4번째에 있는 것이 보인다.
경고음, 개행문자, 널문자 등 재미있는 녀석들이 많이 있으니 시험해보길 바란다!
시험 소스는 아래 참고!
#include <stdio.h>
int main(void)
{
printf("나의 폰 번호 소리는 "" 7\a8\a7\a3\a9\a2\a3\a4\a0\a8\a");
printf("커서이동\b\b\b\bF");
printf("안녕\n");
printf("줄내리자!");
printf("안녕 \t 한칸 더!");
printf("안녕!");
printf("\v 수직으로!");
printf("커서를 \r 현재 줄 처음으로!");
printf("\' 문자!\n");
printf("\" 문자!");
return 0;
}
참고로 이 소스는 한줄씩 돌려보길 바라며 잘 모르는 부분이 있으면 댓글, 문자 환영이다.
자 연습하러 고고!
오늘 강의도 여기까지!!
다음 강의는 정수 리터럴에 대하여 알아보자!
이제 본격적으로 상수를 보는 것이다!
※ 강의를 몇일 주기로 올릴 수 있을지 모르겠지만,
C, JAVA, C#, DB, 안드로이드 등 많은 영역에 대하여 쉽게 풀어서 강의를 업로드 할 예정입니다.
많은 응원과 관심 부탁드립니다. 감사합니다.
짱짱맨 호출에 응답하여 보팅하였습니다.
짱짱맨은 저자응원 프로그램입니다. 더 많은 저자 분들에게 더 큰 혜택을 드리고자 스파임대 스폰서를 받고 있습니다. 스폰서 참여방법과 짱짱맨 프로그램에 관해서는 이 글을 읽어 주세요. 기업형 예비증인 북이오(@bukio)가 짱짱맨 프로그램을 운영하고 있습니다. 여러분의 증인 보팅은 큰 힘이 됩니다. Vote for @bukio
잘보고 갑니다 공부가 필요하네요 ^^
꾸~욱하고 가요~~~
Posted using Partiko iOS