[이상선의 C언어 5분 코딩강의] 2.5 변수와 자료형

in kr •  6 years ago 

슬라이드1.PNG

슬라이드2.PNG

이상선의 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-language-unit1-prepared-by-m-v-brahmananda-reddy-36-638.jpg

위에 보이는 그림이 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, 안드로이드 등 많은 영역에 대하여 쉽게 풀어서 강의를 업로드 할 예정입니다.
많은 응원과 관심 부탁드립니다. 감사합니다.

슬라이드3.PNG

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  

jjm.jpeg
짱짱맨 호출에 응답하여 보팅하였습니다.

짱짱맨은 저자응원 프로그램입니다. 더 많은 저자 분들에게 더 큰 혜택을 드리고자 스파임대 스폰서를 받고 있습니다. 스폰서 참여방법과 짱짱맨 프로그램에 관해서는 이 글을 읽어 주세요. 기업형 예비증인 북이오(@bukio)가 짱짱맨 프로그램을 운영하고 있습니다. 여러분의 증인 보팅은 큰 힘이 됩니다. Vote for @bukio

잘보고 갑니다 공부가 필요하네요 ^^
꾸~욱하고 가요~~~

Posted using Partiko iOS