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

in #kr6 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

Sort:  

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

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

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

Posted using Partiko iOS