티스토리 툴바

팀블로그를 주최한 주인장께서 군대 크리를 당해 입대하셔서 제가 강좌를 이어나갈까 합니다. 아마도 머리(넉넉한터)님보다 실력이 떨어지는 관계로 강좌의 질이 떨어지겠지만 그래도 알차게 이어 나가겠습니다.



3장에서 기본적인 C proramming의 소스코드를 알아보았습니다. 그럼 프로그래밍의 기초이며 무언가를 해볼 수 있는 출력에 대한 것과 첫 C프로그램을 만들어 보도록 하겠습니다.


. 출력


기본적으로 C 언어는 기본적인 입출력 함수는 stdio.h (Standard Input/Output Header File)안에 들어있습니다. 그 중 기본적으로 사용하는 출력 함수는 우리가 3장에서 봤던 printf()함수입니다.

Printf Print Formatting 의 약자이며 서식화된 출력을 하는 함수입니다.


서식화된 문자열이란 어떠한 서식이 있으면 이 서식과 대응되는 뒤쪽의 인수를 대입하여 서식 문자열을 출력하게 됩니다. 즉 출력하기 전 서식과 인수를 대응시켜 Formatting하는 과정을 먼저 거치게 되며 뒤쪽의 인수는 서식의 개수만큼 오되 서식이 없으면 인수를 생략할 수 있습니다. 서식 및 인수가 존재하지 않는 printf()의 예제는 <3장 – 다> printf()와 같은 형태를 취하게 됩니다.


Printf() 함수의 구성은 아래와 같이 표현되어집니다.

                    int printf(const char *format, arg1, arg2, arg3....);

                (format : 서식문자열 | arg1, arg2, arg3... : 인수들)

서식문자열은 기본적인 베이스가 되는 서식문자열이 뒤의 인수를 이용하여 서식화된 출력을 시켜주게 됩니다.


예를 들어

사용자 삽입 이미지

위의 코드를 보면 5란 숫자가 %d와 대응되며 “화”이란 글자는 %s가 대응되며, 결과는


오늘은 5일 화요일입니다.” 란 문장이 출력이 됩니다.


참고로 서식과 인수의 대응은 왼쪽부터 차례대로 대응됩니다.


그럼 여기서 %d %s 가 무엇인가 하는 의문이 생깁니다. 이 것들은 뒤의 인수에 대한 형식을 나타내는 문자입니다.

이 서식을 나타내는 문자는 여러가지 종류가 있는데 아래의 표에서 참조하시면 되겠습니다.


서식

의미

설명

%d or %i

Decimal, Integer

10진 정수 출력

%o

Octal

8진 정수로 출력

%x or %X

heXadecimal

16진수 정수로 출력(대문자 X를 쓰면 A~F까지의 숫자도 대문자로 출력된다.)

%u

Unsigned

부호없는 10진 정수로 출력

%c

Character

1개의 문자를 출력

%s

String

문자열을 출력

%f

Float

고정소수점 형식의 실수 출력

%e or %E


부동 소수점 형식의 실수 출력

%g or %G


%e, %f 중 더 짧은 형식으로 출력

%p

Pointer

포인터의 번지값 출력

%n


출력된 문자 개수를 포인터 변수에 대입

%%


%문자 자체를 출력한다


http://winapi.co.kr 인용


이제까지 기본적인 출력함수인 printf()함수에 대해 알아봤다습니다. 이 이외에도 폭을 지정할 수 있는 서식이 존재하며, 정밀도, 크기 등 가장 기본적인 함수이면서 많은 기능들을 가지고 있는 함수로 할 수 있습니다.

----------------------------------------------------------------

이번엔 문자(char)과 문자열(string)에 대한 출력함수를 알아보도록 하겠습니다.


C에선 Data type중에 character typestring type가 있습니다. 그러나 C에서 문자열은 엄밀히 말하면 string type이 아닌 character array type입니다. character type가 연속적으로 나열되어있는 array type입니다. (C++에서는 string란 문자열을 지원하며, 베이직, 파스칼, 자바같은 언어도 별도의 문자열을 지원합니다.)


  1. putc()

putc()함수는 문자 한개를 출력하는 함수입니다. putc()함수는 stdio.h 헤더안에 정의되어 있으며, 원형은

int putc(int c, FILE *stream);

으로 정의되어 있습니다. 이 함수의 기능은 Integer 를 입력받아 ASCII 코드에 대응하는 문자를 stream으로 출력하는 함수입니다. Stream 이란 흐름을 의미합니다. 우리가 어떠한 출력값을 출력장치, 즉 대표적으로 모니터나 프린터로 보낼때 순서대로 보내는데, 보내는 행위를 stream이라고 생각하시면 됩니다. 보통 표준 출력 장치로 보낼때에는 stdout를 써주시면 되며, 이 스트림은 모니터로 보내어져 화면에 출력되어집니다.

사용자 삽입 이미지

(<예제>


위의 예제는 putc()함수를 이용하여 정수값 65를 표준출력장치로 보내어 65에 대응하는 아스키 코드값 ‘A’를 출력하게 됩니다.

사용자 삽입 이미지

<출력화면>


  1. putchar()

putch()함수는 화면에 한개의 문자를 출력하는 함수입니다. putc()stream 을 지정하여 모니터 혹은 프린터나 그 이외의 장치에 stream을 보내 출력하는 함수이나 putch()함수는 단지 stdout, 즉 화면에만 출력을 해주는 함수입니다. Console을 기준으로 현재 커서가 위치해 있는 곳에 출력을 해주며 개행은 해주지 않습니다.


putch()함수의 사용법은 위의 putc()함수와 동일하나 stream을 화면으로만 보내주기에 stream을 지정할 필요가 없이 표현할 문자만 지정해 주시면 됩니다.

int putchar(int c);

원형은 위와 같으며 stdio.h 에 정의되어 있는 매크로 함수입니다.(매크로함수에 대한 설명은 다음에..)

#define putchar(c) putc((c), stdout)


putc(c, stdout)putchar(c)로 바꿔서 쓰시는 거라고 생각하시면 되며 위의 putc()함수와 같은 결과물이 출력됩니다.


  1. puts()

puts()함수는 문자열을 화면에 출력해주는 함수입니다.. putchar()함수와 마찬가지로 streamstdout만으로 지정되어 있으며, 특징은 문자열을 출력후 자동으로 개행(줄바꿈)을 해주는 함수입니다. 문자열끝에 개행문자가 들어가 있다면 개행을 두번하게 됩니다.


원형은

int puts(const char *s);

이며 stdio.h 파일안에 정의되어 있습니다.

사용자 삽입 이미지

이며 실행결과는

사용자 삽입 이미지

입니다. 첫번째 puts()함수에서 자동개행이 되어 “Hello World”를 출력후 줄바꿈이 되었습니다. 그리고 두번째 puts()함수의 문자열 끝에 개행문자를 추가했으므로 개행이 두번 일어났습니다. 세번째 puts()함수는 중간에 개행문자를 넣어 “Hello” 문자열을 출력후에 개행을 하고 “World” 문자열이 출력되었습니다.




. 출력을 이용한 첫 C 프로그램


원래 printf()함수를 자세히 설명할 목차였으나, 위에서 기본적인 것들은 설명을 언급했으니, 책에서 좀 보기 힘든 소스를 사용하여 C 언어 출력 프로그램을 사용하겠습니다.


이 소스는 자기자신의 소스를 화면에 출력하는 소스로 어떤 고수분들은 이러한.. 출력을 이용해 여러가지 문자로 이루어진 이모티콘을 출력하시는 분들도 계십니다(믿거나말거나)


자 그럼 소스를 우선 보겠습니다.


#include<stdio.h>


int main(void)

{

char src[256] = "#include<stdio.h>%cint main(void)%c{%c%cchar src[256]=%c%s%c;%c%cprintf(src, 10, 10, 10, 9, 34, src, 34, 10, 9, 10, 9, 10, 10);%c%creturn 0;%c}%c";

printf(src, 10, 10, 10, 9, 34, src, 34, 10, 9, 10, 9, 10, 10);

return 0;

}



우선 위의 코드를 분석해 보도록 하겠습니다. main()함수안에 보시면 char *src 변수가 있습니다. src의 특징은 메모리가 부족하지 않는한 공간에 대한 제약이 없으며, 문자를 입력할 경우 맨 뒤에 자동으로 끝을 표시해주는 ‘\0’문자를 대입해줍니다.


src의 문자열 안에 보시면 그대로 코드가 들어가있습니다. 틀린점은 서식문자 차이일뿐

입니다.

printf() 의 안을 보시면


printf(src, 10, 10, 10, 9, 34, src, 34, 10, 9, 10, 9, 10, 10);


와 같이 표시되어 있습니다.

printf()함수의 첫번째 인자는 기본 베이스가 되는 서식 문자열입니다. 그러면 화면에

문자열 src의 내용인


#include<stdio.h>%cint main(void)%c{%c%cchar src[256]=%c%s%c;%c%cprintf(src, 10, 10, 10, 9, 34, src, 34, 10, 9, 10, 9, 10, 10);%c%creturn 0;%c}%c


이 출력이 되게 됩니다. 그러면 그 뒤의 인수를 살펴 보도록 합시다.


printf(src, 10, 10, 10, 9, 34, src, 34, 10, 9, 10, 9, 10, 10);


밑줄이 쳐진 부분을 보시면 숫자와 중간에 src문자열이 들어가 있고 그다음에 계속 10이 들어가 있습니다.


ASCII Code 표를 찾아보시면 ‘10’이 의미하는 것은 줄바꿈 밑 바뀐 출의 첫번째로 커서를 이동하는 LF 로 나와있습니다. LFLine Feed 즉 그 줄의 다음줄로 이동하는 것을 의미합니다. ‘9’가 의미하는 것은 Tab를 의미합니다. 그리고 34는 쌍따옴표 ‘”’ 를 의미합니다.

printf()에서는 쌍따옴표는 안의 내용의 시작과 끝을 정하는 표식이기 때문에 그대로 써준다면


char src[256] = “#include<stdio.h>%cint main(void)%c{%c%cchar src[256]=”%s”;%c%cprintf(src, 10, 10, 10, 9, 34, src, 34, 10, 9, 10, 9, 10, 10);%c%creturn 0;%c}%c


char src[256] 변수안에 저장되는 문자열이 밑줄친 부분 전에서 끝나게 되는 거죠. 물론 컴파일러는 오류라고 문구를 띄웁니다.


그것을 방지하기 위해 %c ASCII코드표의 쌍따옴표에 해당하는 값인 34를 넣어 출력할때 치완을 해주는 것이죠.


중간에 보시면 src가 다시 들어가 있습니다. 이것은 src자체를 직접 출력하여 char src[256]안에 내용을 넣어주는 코드를 만드는 것이지요.


이후는 위의 ASCII Code 와 서식문자열을 대응시키면 쉽게 알 수 있을꺼라 생각하고 작동하는 그림을 보도록 하겠습니다.


사용자 삽입 이미지

위와 같이 코드를 작성후 컴파일을 해보고 출력을 하도록 해보겠습니다.


사용자 삽입 이미지

위와 같이 소스가 출력되며 이 소스를 가지고 출력 stream을 파일로 돌려서


사용자 삽입 이미지

C:\>printf.exe > printf(1).c


이 의미는 printf.exe 파일이 출력하는 내용들을 printf(1).c로 저장하라는 의미입니다.


즉 ‘>’ 의미는 뾰족한 부분쪽으로 출력하는 내용을 보내라는 의미이며, ‘<’ 는 입력을 받는 의미라 할수 있겠습니다.


이상으로 좀 복잡하지만 printf()함수의 여러 기능과 종류들을 알아 보았으며, 이해하기 어려우실 겁니다. 물론 저도 이해하기 어려워서 많은 고생을 했으며, 아직까지 말로 표현할만한 실력은 안되지만 어떻게는 설명을 할려고 노력을 했습니다.


저정도의 소스를 이해하신다면 이미 C Programing 의 초급은 무난히 이해하실 꺼라 생긱이 되며 이만 강좌를 마치도록 하겠습니다.



Posted by LaLuna
same : 다른 것이 아닌 바로 그것(identical) 이라는 뜻고 다른 것이지만 내용은 같은(equals, equivalent)란 뜻으로 쓰인다.

equal : 양 , 크기 , 가치, 내용이 동등한. 비교의 개념이 있다.

equivalent : equal과 같이 동등한 이다.

identical : 동일한, 다른 것이 아닌 바로 그것.


자바를 하다보면 equal라는걸 쉽게 접하게 된다.

그리고 비교의 대상과 개념들이 각기 다르다.

어떤건 객체를 비교하고 어떤건 값을 비교한다.

앞으로 포스팅할 자바에 대한 글은 불가피하게 비교라는걸 많이 하게

될꺼같아서 기본적인 같다는 것에 대한 개념정리를 간단히 해보았다.

"equal"라는 단어 유의 깊게 보길 바란다!..

다음편에선
equal에 대해 자세히 알아 보도록 하자.


- 출처 및 인용 : Effective Java -

Posted by 비회원
우리가 알고 있다시피 Invariable(상수) Variable(변수)에는 Data Type이 있습니다. Data Value에 따라서 Data Type를 지정해주어야 하는데, Invariable는 그 자신의 Value에 대한 표기로 Data Type를 나타낼 수 있기 때문에 Data Type를 선언해줄 필요는 없습니다. 그러나 Variable의 경우 Value가 언제든지 바뀔 수 있기 때문에 Data type를 선언해 주어야 합니다. 그런데 모든 Variable에는 Data Type 이외에 Storage Class라는 존재합니다.

 

Storage Class란 어떠한 Variable의 기억장소에 대한 지정과 지정한 Variable의 유효범위를 결정하는 것이 Storage Class입니다. 여기서 유효범위란 어떠한 Variable Program Code의 활용범위에 따른 분류와 기억 장소를 점유하는 시간에 따른 분류를 말하는 것입니다.

Variables의 성격은 변수를 선언하는 Storage Class Specifiers(기억부류 지정자)와 선언장소(함수의 내부이냐 외부이냐)에 의하여 결정됩니다.

 

하나의 함수는 ‘{‘ 으로 시작해서 ‘}’ 으로 끝이 나며, 이 내부에서 선언된 Variables는 이 함수 안에서만 사용이 가능하며, 이것을 Local Variables라 부릅니다. 또한 모든 함수의 외부에서 선언되어 파일 안의 모든 함수에서 사용이 가능한 Variables Global Variables 이라 부릅니다.

Global Variables는 초기화를 시키지 않아도 자동적으로 0으로 정해지며, Local Variables는 초기화가 되지 않고 임의의 값(Memory가 원래 가지고 있던 쓰레기 값)을 가지게 됩니다.

 

Storage Class Speciriers에 의한 분류는 아래의 표와 같습니다.

 

Storage Class

External Variables

Automatic Variables

Static Variables

Register Variables

지 정 자

extern

auto

static

Register


저장장소

정적

데이터영역


스택

정적

데이터영역

CPU

레지스터

선언위치

함수의 외부

함수의 내부

함수의 내부

함수의 내부


통용범위

프로그램

전체


함수의 내부


함수의 내부


함수의 내부


파괴시기

프로그램

종료시


함수 종료시


프로그램 종료


함수 종료시


초 기 값


0

초기화

되지 않음


0

초기화

되지 않음

 

1. External Variables(외부 변수)

하나의 프로그램을 짜기 위해 여러 사람이 각기 다른 파일에서 작업을 하거나, 혹은 Source를 분산 시킬 필요성이 있을 경우 사용하는 지정자입니다. 전역변수는 하나의 파일 안에서 모든 함수들이 사용할 수 있지만 다른 파일은 접근이 불가능 합니다. 이런 경우 External Variables으로 선언하여 다른 파일에서 접근이 가능하도록 알려주는 역할을 합니다.

 

2. Automatic Variables(자동 변수)

우리들이 흔히 사용하는 변수는 대부분 Automatic Varibles입니다. 기본적으로 함수의 내부에서 사용되며 임시적으로 사용하는 Variable입니다. 저장장소는 스택에 위치하며, 함수의 종류시 자동적으로 없어지며, 전역으로 사용 혹은 다른 함수에서 접근이 불가능 한 변수입니다.

 

3. Static Variables(정적 변수)

기본적으로 Automatic Variables와 비슷하게 함수안에서 쓰이며, 함수가 종료되어도 없어지지 않는 특징을 가지고 있습니다. 생성은 스택이 아닌 메모리의 정적구간에 생성이 되고 프로그램 자체가 끝날 때까지 보존되어지는 정적인 의미를 지닌 Variables입니다. Static Variables의 사용은 프로그램이 끝날 때까지 존재는 하되 소속된 함수가 실행될때만 접근이 가능하다는 특징을 지니고 있습니다.

 

4. Register Variables(레지스터 변수)

Register Variables는 위의 Variables와 다르게 RAM에 생성되지 않고 CPU Register에 생성되어지는 특징을 가지고 있습니다. CPU Rigister RAM보다 입출력이 빠르기 때문에 프로그램중에 자주 사용하는 값을 Register에 위치해 놓음으로써 수행 속도를 높일 수 있게 하는 Variables입니다. 주의할 점은 Variable Register Variables로 지정할 때 Register에 충분한 공간이 존재한다면 Register에 생성이 되지만, 공간이 충분하지 않는다면 Automatic Variable로 취급하여 메모리의 스택에 위치하게 됩니다.

Posted by LaLuna