1) 지식 창고는 본인이 작성한 콘텐츠(팁/노하우/리소스/강좌 등)을 무료 혹은 가상화폐인 납포인트를 통해 공유하는 공간입니다.
2) 본인이 작성한 콘텐츠에 대해서만 지식 창고에 등록할 수 있으며, 저작권에 위배되는 콘텐츠는 사전경고 없이 삭제될 수 있습니다.
3) 콘텐츠 구매 및 첨부파일 다운로드는 회원그룹 '연구원' 이상 가능하오니, 경험치를 쌓아 진급한 후에 이용 부탁드립니다.
4) 무료 콘텐츠의 본문은 구매절차 없이 즉시 이용할 수 있으며, 판매 납포인트가 있는 콘텐츠는 구매 후 이용할 수 있습니다.
5) 콘텐츠 판매에 따른 납포인트 수익은 지정한 비율(50%)에 따라 판매자에게 지급하며, 납포인트 수익을 통해 진급을 빨리할 수 있습니다.
6) 구매 후 평가를 하면 구매 납포인트의 20%를 돌려 드립니다.
판매자 | 프리미엄 | 판매 납포인트 | 무료 | 평점 | 0점 / 총 0명 참여 |
---|
***************************< 캠퍼스 C 강좌 >******************************
[제목] :
[코드] : campusc1-004 (초급)
[교재] : CAMPUS C (초급, Third edition) [출판사 : 책과스승]
[알림] :이 파일은 "캠퍼스 C"에서 모든 분께 공개한 "초급 강좌"입니다.
이 [알림]의 내용을 지우지 않는다면 누구에게나 임의로 복사해 줄 수
있습니다.그러나 이 강좌 내용에 대한 저작권은 "캠퍼스 C"에 있습니다.
[연락처] : 605-8662 (서울) ("캠퍼스 C", 도서출판 "책과 스승")
천리안 : go campusc
나우콤 : go lcampc
하이텔 ID : campusc
****************************<< 목 차 >>************************************
<1> 각 데이타 형의 메모리 구조
<2> 변수 에 대하여
1> 변수란 ?
2> 이름짓는법
3> 실제 사용 예
4> 변수의 초기화.
<3> 연산자 소개
1> 산술 연산자
2> 관계연산자
3> 논리연산자
4> 증가 감소 연산자
5> 비트 연산자
6> 대입 연산자
7> 다중 대입문
8> 조건 연산자
9> 포인터 연산자
******************************< 내용 시작 >********************************
<1> 각 데이타 형의 메모리 구조
이제 data type (데이타 형)에 대한 이해를 확실히 하기 위해서 아래 프
로그램을 보세요.
--------------------------
char ch;
int i;
long ll;
float ff;
double dd;
long double ld;
main()
{
ch = 'q';
i = 10;
ll = 123456;
ff = 3.141592 * 2;
dd = 3.1415;
ld = 2.2 * 3.3;
}
--------------------------
이 프로그램은 형태적으로 보아 "변수 선언" 부분과 "메인함수"만 남아
있고 나머지는 전부 생략된 형태 입니다. 이제는 이런 형태에 대한 설명은 더 이
상 안해도 되겠지요 ?
앞으로 우리는 프로그램을 점차로 짜나가야 할텐데 그중에서 가장 기초
가 되는것이 변수명을 선언 하는 것 입니다. 변수명을 선언 할때는 그 변수명의
"정체"를 분명히 알기 위해서 "데이타 타입"을 하나씩 달아 둡니다. 위에서
char,int, long, float, long double 이란 던어가 그것 들입니다.
이것들은 전부 [55쪽]의 예약어 중에서 "2. 변수의 데이타 타입" 그룹에
속하는 것들 이라는 것을 확인 하세요. 이것이 의미 하는것은 두가지라고 지난
시간에 얘기 한 바 있습니다. 즉
-----------------------------------------------------
1. 변수가 차지 하는 집이 얼마나 큰가
2. 변수 안에 들어 가야 할 값들의 속성(글자, 숫자 따위)
------------------------------------------------------
이중에서 "2 변수안에 들어갈 값들의 속성"은 기본적으로 알아야 하는
것이고, 더욱 중요한 것은 "1 변수가 차지하는 집의 크기"에 대한 것 입니다.
이 크기에 대한 문제는 이 강좌가 끝날 때 까지 계속 되는 중요한 것으로서 지금
부터 철저하게 이해 하고 연습해야 합니다.
<질문> 위 프로그램에서 main() 함수 위쪽에 변수를 선언 한 것을 보면 머리 속
에 어떤 그림이 그려 지나요 ?
저는 머리 속에 하나의 그림이 선명하게 나타납니다. 여러분들도 똑같은
그림을 머리속에 그려야 하는데, 그게 바로 [76쪽]의 "각 데이타 형의 메모리 구
조" 입니다. 이 내용을 이미 아시는 분도 있겠지만 확실한 연습이 필요 합니다.
지난 시간에 sizeof()를 사용한 숙제를 하신 분들은 더 이상의 설명없이
[76쪽]의 그림을 이해 하실 겁니다.
이 그림을 이해 하기 위해서 다음같은 몇가지를 기억해야 합니다.
1. 이 그림은 아파트를 바라 본것이다.
2. 주소는 100호 부터 시작하는데 이건 임의로 적은 주소다
3. 주소는 왼쪽 부터 적어 나가고 번지수는 1 씩 증가 한다.
4. 반드시 1 바이트를 "box 하나(아파트 한채)"로 그린다.
이 약속들은 내 맘대로 만든게 아니고 컴퓨터 세계에서는 메모리 맵을
그리는 일종의 관습 비슷한 겁니다.
---------------------------------------------------------------------------
<상식 > 메모리 맵(map)
나중에 여러분이 정식으로 프로그램을 만들게 되면, 특히 어셈블러를 사
용한 고급의 프로그램을 작성하게 되면 메모리 맵 이란걸 그려야 됩니다. 이 지
도(map)는 컴퓨터 내부의 메모리에 변수 들이 어떻게 들어 가는가를 일목요연하
게 보기 위한 것인데, 여기서 말하는 메모리란 여러분들이 지난 시간에 숙제로
컴퓨터를 뜯어 보면서 보았던 메인 메모리(DRAM)을 얘기 합니다.
그 메인 메모리 상에 변수가 어떻게 들어 있는지 눈으로는 안 보이지만
최소한 머리속에서는 그 배치를 확실히 알고 있어야 합니다. 물론 나중에 디버거
(debugger)를 쓰면 더욱 명확히 눈으로도 볼 수 있지만..
그 변수의 배치를 종이에 그려놓은것을 메모리 맵 이라고 부릅니다. [76
쪽]은 이런 메모리 맵을 그리기 위한 상식입니다.
통상은 옆으로 16 바이트씩(아파트 16채)을 붙이고 바둑판 모양으로 그
립니다.
--------------------------------------------------------------------------
여기서 한가지 주의 할것은 box가 작거나 크거나 간에 box하나는 무조건
1 바이트 크기를 갖는 아파트 한채란 사실 입니다.
<문제> 위 프로그램은 변수명으로 전부 아파트 몇채를 사용하나요 ?
***************************************************************************
<2> 변수 에 대하여
1. 변수란 ?
2.이름짓는법
3. 실제 사용 예
4. 변수의 초기화.
***************************************************************************
1> 변수란 ?
이제 변수에 대해서 정식으로 언급 합니다.변수 이름은 우리 맘대로 짓
는 이름입니다. 그래서 대수롭지 않게 여길 지도 모르겠는데 절대로 그래서는 안
됩니다.
우리가 지어줄 변수명은 아파트 앞에 붙여진 문패라고 생각하면 됩니다.
아파트의 주소 100호 따위 옆에 "홍길동" 을 쓰자는 겁니다. 이 문패를 달아 놓
으므로서 느끼는 편리성은 여러분도 이미 알겁니다. 예를 들어 문패가 하나도 없
고 번지수만 있는 아파트 에서, 100호에 문을 열고 숫자 20를 넣었다고 합시다.
이게 무슨 뜻 입니까 ? 아마 알 사람은 아무도 없을겁니다. 그럼 이번엔 이 100
번지에 문패를 "my_age" 라고 붙이고 20을 다시 넣어 줍시다. 이건 무슨 뜻 입니
까 ?
문패의 역할을 아시겠지요 ? 게다가 C 에서는 명확성을 더 하기 위해서 앞에다
"데이타 타입"도 달아 준다는거 아닙니까, 즉 " int my_age" 이렇게 말입니다.
나이는 소수점은 필요없는 숫자 이니 int형을 쓰는거 아시겠지요 ?
이와 같이 변수명을 쓰면, 그 아파트에 있는 값들이 어떤 뜻을 갖고 있
는지 "내용을 알아 보기 쉬우므로" 변수명을 씁니다. 또 이 아파트의 값들은 언
제든지 넣었다 뺏다 하면서 "변할 수 있기" 때문에 "변수"라고 부릅니다.
---------------------------------------------------------------------------
2> 이름짓는법
변수 이름 짓는 원칙이 [77쪽]에 정리되어 있습니다. 이 4가지를 기억하시
기 바랍니다.
사용 가능 글자 중에 "_"(underline)이 있는 것은 my_name 식으로 띄어
쓰기가 필요한 부분에 이용하라고 제공하는것 입니다.
그리고 변수의 최대길이가 32로 되있는건 터보 씨 메뉴에서 [options]
[compiler] [source] [identifier length]를 선택해 보세요. 여기서 숫자의 크기
가 32 까지 선택할 수 있다는 겁니다. 여기서 "identifier"란 용어가 나오는데,
이 의미는 쉽게 얘기해서 변수명, 함수명 따위의 "우리 맘대로 짓는 이름"을 총
칭해서 이르는 말 입니다. 사실상 우리가 변수명을 32자 까지 쓸 경우는 거의 없
지만 일단 32로 setting 해 놓으세요
<좋은 예> sss123 GoodMorning _this_is_right Aa123_
<틀린 예> %hi 24hours hurry! come*on
<요령 > 가능하면 그 변수의 의미를 명확히 알 수있도록 좋은이름을 지어준다.
<문제> [81쪽] <문2> 를 풀어보세요.
---------------------------------------------------------------------------
3. 실제 사용 예
일종의 관습으로 우리는 대문자 만으로 구성된 변수명을 짓지 않습니다.
다음의 3 가지 형태로 지으면 무난합니다. 최근에 C++ 등에서는 "my_name" 형식
보다는 " MyName " 으로 짓는 경향이 두드러지므로 가급적 따라서 하세요.
----------------------------------------------
(좋은 예) : value first_name FirstName
(나쁜 예) : VALUE FIRST_NAME FIRSTNAME
----------------------------------------------
대문자 만으로 된 이름을 짓는 경우는 아래와 같다.
#include <stdio.h>
#define PI 3.141592654
main()
{
int first,second;
first = PI * PI;
}
즉 #define 뒤에서 정의 할 때 씁니다. 이 기능은 말할것도 없이
3.141592 대신에 PI 라는 부르기 쉽고 쓰기 쉬운 단어로 바꿔쓰자는 것이지요.
나중에도 나오겠지만 가능하면 #define을 많이 쓰세요. 그것이 읽기 쉽
고 고치기 쉽고 일반적으로 잘 짠 프로그램입니다.
또 C 프로그램에 익숙한 사람들은 "대문자 단어"를 보면 항상 변수라고
생각을 하지 않습니다. 즉, "위에 #define이 되있거나, 특별한 다른 선언이 있다
" 고 생각을 하기 때문에 여러분도 이 관습에 따라야 합니다.
---------------------------------------------------------------------------
4. 변수의 초기화.
위에서 만든 변수명은 다음과 같이 쓰입니다. 변수의 선언 위치가
main() 위와 함수 내부에서 가장 위라는 것을 항상 확인 하세요.
int i,j;
int k = 123; <-- 초기화
main()
{
int aaa;
aaa += 2;
}
여기서 i,j 는 집은 확보 되있으나 그안에는 어떤 값이 있는지 모르는
상태 입니다. 그러나 k 는 집을 확보하면서 동시에 123을 넣으라고 명시되 있지
요. 이것을 초기화 라고 합니다.
이 초기화된 모습을 실제로 보는 방법이 교재 [79쪽] 아래에 나와 있습니
다. 이것은 디버거를 이용하는 방법인데, 초보자 들이 이런 작업을 할 필요가 있
지는 않겠지만, 근본을 이해 한다는 측면에서 아부 중요 합니다. 여러분의 머리
속에서 "추상적"으로 느껴 지는 문제를 "구체적"이고 "실제적"으로 확인해 볼 수
있는 좋은 방법 입니다. 이 절차를 직접 따라해 보세요
***************************************************************************
<3> 연산자 소개
1> 산술 연산자
2> 관계연산자
3> 논리연산자
4> 증가 감소 연산자
5> 비트 연산자
6> 대입 연산자
7> 다중 대입문
8> 조건 연산자
9> 포인터 연산자
***************************************************************************
지난 시간의 숙제 똑같은 연산자 가 두군데서 쓰이는걸 찾아 보셨나요 ?
답은 다음과 같습니다. 형광펜으로 연산자 표에 표시를 해 놓으세요.
----------------
1. * 연산자
2. & 연산자
3. () 연산자
4. - 연산자
---------------
C는 연산자가 많은 편 입니다. 이것은 무기 종류가 많은것 처럼 강력한
기능을 가졌다는 걸 의미하지요. 아래에서 연산자 들을 기능별로 크게 분류하여
소개 합니다. 설명이 별로 필요 없는건 대충 넘어 가고 지금 설명이 불가능 한건
나중에 천천히 하겠습니다. 이 연산자 중 일부는 또 설명할 기회가 있을 겁니다.
---------------------------------------------------------------------------
1> 산술 연산자
main()
{
int a,b,c;
c = a + b; /* 덧셈 */
c = a - b; /* 뺄셈 */
c = a * b; /* 곱셈 */
c = a / b; /* 나눗셈 */
c = a % b; /* 나머지 */
}
<참고> % 는 나머지를 취해야하므로 상식적으로 소수점을 가지는 숫자 연산에서
쓸수없다.즉 char,int,long에서만 사용가능하다.
---------------------------------------------------------------------------
2> 관계연산자
main()
{
int a,b;
if(a > b) /* 크면 */
if(a < b) /* 작으면 */
if(a >= b) /* 크거나같으면 */
if(a <= b) /* 작거나같으면 */
if(a == b) /* 같으면 */
if(a != b) /* 같지않으면 */
if(0) /* 거짓 */
if(1) /* 참 */
if(1023) /* 참 */
}
<참고>
C 에서 0 은 거짓, 0이 아닌 값은 참으로 간주됩니다(중요). 이 개념은
이 강좌 끝날때 까지 쓰이므로 지금 외워두세요. 저 개인적으로는 항상 0은 여자
1은 남자라는 개념으로 컴퓨터의 2진법을 생각합니다. 그리고 항상 "여자는 거짓
말장이다"라고 생각하며 구별하고 있습니다. 여자분들은 기분 나쁘실테니 꺼꾸로
생각하세요. 좌우간 혼동만 하지 마세요.
<문> if(a == b) 와 if(a = b) 일반적으로 어떤 표현이 맞는가 ?
---------------------------------------------------------------------------
3> 논리연산자
main()
{
int a,b;
a = 0;
if(a) /* 결과는 거짓 */
if(!a) /* 논리부정, a상태의 부정 결과는 참 */
if(a < b && c < d ) /* 논리 곱(and) */
if(a < b || c < d ) /* 논리 합(or) */
}
---------------------------------------------------------------------------
4> 증가 감소 연산자
main()
{
int a,b;
b = 3;
a = ++b; /* b를 하나 증가후 a 에 대입. a 는 4 */
b = 3;
a = b++; /* b를 a 에 대입후 하나 증가. a 는 3 */
b = 3;
a = --b; /* b를 하나 감소후 a 에 대입. a 는 2 */
b = 3;
a = b--; /* b를 a 에 대입후 하나 감소. a 는 3 */
}
---------------------------------------------------------------------------
5> 비트 연산자
main()
{
char ch1,ch2;
int a,b;
a = 0x01;
b = 0x02;
a = a & b; /비트단위 and a = 0x00*/
a = 0x01;
b = 0x03;
a = a | b; /비트단위 or a = 0x03*/
a = 0x01;
b = 0x03;
a = a ^ b; /비트단위 xor a = 0x02*/
a = 0x01;
a = a << 2; /* 2비트 좌로 이동 a = 0x04*/
a = 0x04;
a = a >> 2; /* 2비트 우로 이동 a = 0x01*/
a = 0x01;
a = ~a ; /* 뒤집음 a = 0xf7*/
}
<참고>
논리곱과 논리합은 참과 거짓을 따지지만, 비트곱,합은 실제로 연산을
한다. 다음 법칙에 따른다.(암기요)
1) <AND> <OR> <XOR>
0101 0101 0101
& 0011 | 0011 ^ 0011
------- ------ ------
0001 0111 0110
2) ~0 -> 1 ~1 -> 0 이다.
---------------------------------------------------------------------------
6> 대입 연산자
main()
{
char ch1,ch2;
int a,b;
a += b; /* a = a + b 와 같음 */
a -= b /* a = a -b 와 같음 */
a *= b;
a /= b;
a %= b;
a &= b;
a ^= b;
a |= b;
a <<= b;
a >>= b;
}
<참고> 이렇게 쓰는 이유는 단지 문장을 간단히 표기하기위함이다.
즉 very_long_name = very_long_name + 1; 은 간단히
very_long_name += 1; 이다.( 따라서 입력하기 쉽다)
---------------------------------------------------------------------------
7> 다중 대입문
main()
{
int a,b,c,d;
a = b = c= d = 1; ;
}
<참고> d 부터 a쪽으로 1이 채워진다.즉 방향이 <-- 이다.
아래 연산자 표 에서 "결합규칙"의 화살표는 이것을 의미한다.
---------------------------------------------------------------------------
<8> 조건 연산자
main()
{
int a,b,c,d;
c = (a > b) ? a : b;
}
<참고> 한마디로 지저분한 연산자인데 뜻은 (a> b) 이면 a를 그렇지
않으면 b를 c에 넣으라는 뜻.다음에 나올 if() 문에서 구현할 수 있다
---------------------------------------------------------------------------
9> 포인터 연산자
가장중요한 것 ( &, *) 이나 나중에 설명한다.
<참고> 위표에서 말하는 "우선순위"란 a = b + c * d 의 연산에서 더하기
보다 곱하기를 먼저하는 따위를 말한다. 이걸 무시하려면 산수 시간에 배운것
과 똑같이 a = (b + c) * d 처럼 ()를 쓴다. [88쪽]을 보면 () 가 제일 높다는
걸 알수 있다. 따라서 우선순위가 의심스러운 경우나 시각적 효과를 높이기 위해
()를 자주 쓴다.()은 만병통치다.
예) if( a > b || (c > d && a > d))
if (((a = getch()) == 'a') || a == 'g')
실제로 처음 프로그램을 짜거나 읽는 사람은 너무 겹겹이 나타나는 ()
때문에 어지러운데 자기의도를 컴파일러에게 명백히 전달하고자 할 때는 어쩔 수
없는 노릇이다. 컴파일 ERROR도 특히 여기서 자주나므로 프로그램 짤때(coding)
열은 '(' 만큼 세심하게 ')'로 닫아야 한다.
****************************< 끝 맺으며 >**********************************
수고 하셨습니다.
***************************************************************************