현대 사회에서 프로그래머가 되기 위해 배워야할 것들은 아주 많다. 초창기의 프로그래머들은 주로 기계만 다루었고 개발 방법도 한정되어 있었기 때문에 약간의 학습과 연습만으로도 프로그램을 짤 수 있었다. 요즘은 컴퓨터가 각 분야에 활발하게 활용되고 있고 개발 방법이 다양해져서 상황에 맞는 적절한 개발 프로젝트를 진행하기 위해서는 프로그래머가 공부해야 할 것들이 훨씬 더 많아졌다.

상상을 초월할 정도로 넘쳐나는 많은 지식들 중 어떤 것들을 선정해서 어떤 순서로 학습하는 것이 효율적인지는 입문자들이 가장 먼저 관심을 가져야할 부분이다. 모든 것들을 두루 공부해 볼 수 있을만큼 시간이 넉넉하고 능력이 뛰어나다면 아무 문제가 없겠지만 우리들 대부분은 그렇지 못하기 때문이다. 자신이 개발하고자 하는 관심분야에 꼭 필요한 것들을 순서에 맞게 공부하는 것이 중요하다.

윈도우  환경에서 응용 프로그램을 개발하는 프로그래머가 되기 위해서는 다음 두 과정 중 하나를 선택하는 것이 가장 일반적이다. 물론 목표하는 바가 웹 개발자가 게임 아티스트라면 필요한 과목은 달라질 것이다. 또한 응용 프로그래머를 목표로 한다고 하더라도 이 순서가 항상 가장 효율적이란느 것은 아니며 여러 가지 가능한 방법중의 하나일 뿐이다.
사용자 삽입 이미지
이 간단한 순서도는 프로그래머 입문에 필요한 과목들에 대해 여러 가지 중요한 사실을 설명하고 있다. 그림에서 보다시피 C는 C++과 API의 선수 과목이며 두 과목을 배우기 전에 C를 반드시 먼저 배워야 한다. C/C++, API는 모두 MFC의 선수 과목이며 MFC를 제대로 배우고 사용하기 위해서는 앞 세 과목에 대한 기본적인 이해가 반드시 필요하다는 것을 알수 있다. MFC는 사용하기는 쉬운 툴이지만 익숙해지는데는 다른 과목보다 훨씬 더 많은 시간을 필요로 한다.

C++과 API는 상호 의존 관계가 없기 때문에 순서에 구애 받을 필요가 없다. API는 C수준의 라이브러리며 윈도우즈는 객체 지향과는 거리가 먼 운영체제이기 때문에 C++을 몰라도 API를 학습하는데는 아무런 지장이 없다. C++은 객체 지향 언어의 문법을 규정하고 있으며 곤솔상에서도 예제를 만들어 테스트해 볼 수 있기 때문에 역시 API를 몰라도 학습이 가능하다.

그러므로 C를 공부한 다음에 C+과 API는 취향에 따라 순서를 정해 한쪽을 먼저 공부하거나 또는 둘을 같이 병행 학습하는 것도 가능하다. 그러나 여러 가지 이유로 C++보다는 API를 먼저 공부하는 것이 더 효율적이다. 왜냐하면 C++이 다루고 있는 객체 개념은 무척 생소하고 어렵기 때문에 C수준에서 충분한 실습을 한 후 C++에 입문하는 것이 좋으며 API는 윈도우즈 환경에서 C언어를 실습해 볼 수 있는 좋은 기회이기 때문이다.

또한 C와 C++은 둘 다 언어의 문법이기 때문에 계속 문법만 공부하게 되면 학습 과정이 지루하다는 단점도 있다. API를 사용하면 칙칙한 콘솔 화면을 벗어나 윈도우, 대화상자, 컨트롤 등을 다루어 볼 수 있고 예쁜 그래픽도 출력해볼 수 있기 때문에 코드의 실행 결과를 좀 더 분명하게 살펴 볼 수 있어 실습의 재미를 더해 준다. 공부를 재미로 하는 것은 아니지만 흥미라는 요소는 지속적인 학습에 무시못할 요소이다.

이 4 과목이 응용 프로그램 작성을 위한 기본 과목들인데 이 과목들을 공부하는데 필요한 학습 기간은 얼마나 될까? 소요 기간은 개인의 상황과 능력, 태도, 학습 깊이 등에 따라 많은 편차가 존재할 것이다. 절대적인 시간을 예측하기는 어렵지만 혼자서 자습을 하고 충분한 실습과 습작 과정까지 포함한다면 6-6-3-3 정도가 일바넞ㄱ으로 필요한 시간으로 추정된다. C언어는 가장 기본 과목이고 모든 과목의 선수과정이기 때문에 충분한 시간을 들여 숙달할 필요가 있고 API는 그 자체로 양이 많다.

만약 개인의 수학 능력과 이해도가 뛰어나고 시행 착오를 줄여줄 수 있는 친절한 조언자가 옆에 있다면 이 기간은 다소 단축될 수 있다. 그러나 학습에 절대적인 시간은 반드시 필요하므로 너무 짧은 기간에 많은 것들을 공부하려고 욕심을 내는 것은 오히려 좋지 않다. 별다른 고통없이 단기간에 얻을 수 있는 것들은 대체로 그만큼 가치가 낮은 것들이다.

MFC까지 기본 과정을 마친 후에는 보통 COM을 공부한다. COM은 마이크로소프트 사의 최신 기술들을의 기반 이론이기 때문에 Active X, DirectX, OLE DB, ATL, OLE 등의 고급 기술을 익히기 위해서 필요하다. 기반 이론으로 COM의 위치는 상당히 중요하지만 다소 어렵고 난해한데다 최신 개발툴들은 COM의 기능을 추상화해 주기 때문에 몰라도 일단 사용은 할 수 있다.

이후의 공부 과목은 자신의 관심과 진로에 따라 결정해야 한다. 상기 4과목은 어디까지나 기본 과목에 불과하며 실무 프로젝트에는 고수준의 실제 기술이 필요해질 것이다. 어떤 프로그램을 만들고 싶은지, 어떤 회사에 취직을 했는지 등에 따라 다음과 같은 과목들을 연구하고 관심을 가지게 된다.

■ DB : SQL, ODBC, OLE DB, DAO, ADO, 오라클, SQL 서버
■ 게임 제작 : DirectX, 3D 그래픽 라이브러리, 전산 수학
■ 시스템 프로그래밍 : DDK, 컴파일러, 운영체제
■ 네트워크 : 소켓, 각종 프로토콜(FTP, HTTP)
■ 웹 프로그래밍 : ASP, JSP, PHP, XML, 포토샵, 플래시, DB

이 외에도 교양적으로 꾸준히 연구해야 할 과목으로 자료 구조, 알고리즘, 컴퓨터 일반, 소프트웨어 공학 등이 있고 고급 기술로는 인공 지능, 화상 처리, 멀티미디어 등이 기술이 있다. 또한 시대의 흐름에 따라 새로 등장하는 기술이나 이슈들이 항상 존재하는데 최근에는 임베디드와 모바일 프로그래밍이 새로운 기술로 각광받고 있으므로 이런 분야에서 일을 하고 싶다면 최신 기술에도 관심을 가져야 할 것이다.

이상에서 보았다시피 프로그래머가 되기 위해 공부해야 할 것들은 무척 많으며 이 모든 기술에 정통하려면 아마도 평생 공부해야 할 것이다. 하지만 다행히도 실제 프로젝트에 모든 기술이 동시에 필요한 것은 아니며 여러 분야의 전문가가 모여 팀 프로젝트를 하는 경우가 많기 때문에 자신의 분야만 잘해도 훌륭한 프로그래머가 될 수 있다.

모든 것을 다 알고 있는 개발자는 없다. 그러나 일이 맡겨졌을 때 할 수 있는 준비가 된 사람과 그렇지 못한 사람이 있다. 프로그래머에게 가장 중효한 능력은 당장 무엇을 할 수 있는 지식이 아니라 필요할 떄 찾아서 공부할 수 있는 순발력과 기본기이다. 그 기본기 중에서도 가장 중요한 것은 바로 C언어와 C언어로 구현된 알고리즘, C++ 언어와 객체 지향의 개념이다. 그래서 C/C++은 다른 어떤 최신 기술보다도 시간과 정성을 아낌없이 투자할 가치가 있는 것이다.

개발자 이야기 : 준비된 개발자

개발자는 무엇이든 할 수 있는 사람은 아니며 너무 많은 분야가 있기 때문에 현실적으로 모든 것에 두루 능숙한 그런 개발자는 없다. 그러나 어떤 프로젝트가 떨어지더라도 수행할 수 있는 준비는 해두어야 한다. 어느날 갑자기 친구한테서 전화가 왔다고 하자.

"야, 핸드폰용 테트리스 게임을 급하게 만들어야 하는데 할 수 있어?"
"그거 모바일 프로그래밍이잖아, 나 해본 적 없어서 못해"
"이거 지금 급한데, 일주일동안 한 50만원에 아르바이트 해봐, 너 공부하면 되잖아"
"음.. 글쎄, 머 까짓거 하면 되곘지, 그래도 지금 하는 프로젝트가 바빠서 안돼"
"그럼 100만원 줄께."
"으음.. 지금 하는게 더 급한데, 곤란..."
"... 팀장님한테 말해서 200만원 예산 타볼께"
"그렇다면야..."

원하는 인력을 보유하지 못한 회사가 단기간의 프로젝트를 위한 적임자를 찾기가 쉽지 않기 때문에 이런 식으로 개발이 진행되는 경우가 많다. 누구나 일주일만에 모바일 프로그래밍을 공부해서 핸드폰용 테트리스를 만드는 것이 가능한 것은 아니다. 기본기가 없는 사람은 아무리 시간을 많이 주고 보수가 후해도, 그리고 열심히 노력한다 하더라도 프로젝트를 성공적으로 수행하지 못한다. 그러나 준비된 개발자는 당장 알지 못해도 일주일이라는 시간동안 모바일 개활 환경만 좀 익히면 가능해지기도 한다. 사실 일주일은 결코 짧은 시간이 아니다.

그렇다면 개발자에게 있어 준비라는 것은 과연 무엇을 의미하는 것일까? 언어에 대한 기본적 지식, 자료 구조에 대한 깊이있는 이해, 해박한 알고리즘 지식, 그리고 숙련된 디버깅 경험 등을 들 수 있을 것이다. 지금 여러분들이 배우는 C 언어에는 이 모든 것들은 완벽하게 포함되어 있어 C를 개발자의 기본 언어라고 하며 C/C++ 이야 말로 개발자의 기본기라고 할 수 있다. 당장 화려한 3D 게임이나 고성능 네트워크 메신저 등을 만들어 보고 싶겠지만 이런 꿈은 잠시 접어두고 지금은 준비된 개발자가 되기 위해 C 언어에 매진할 때이다.






Posted by 테티스
,
1.Borland C++ 3.1을 기준으로 한 도스용 C/C++ 함수 레퍼런스입니다.
2.밑줄 문자를 제외한 알파벳순으로 구성되어 있습니다.
3.레퍼런스의 모든 예제는 여기서 다운로드(Cpp3Ex.zip(116K)) 받으실 수 있습니다.

abort
abs
absread
abswrite
access
acos
allocmem
arc
arg
asctime
asin
assert
atan
atan2
atexit
atof
atoi
atol
bar
bar3d
bdos
bdosptr
bioscom
biosdisk
biosequip
bioskey
biosmemory
biosprint
biostime
brk
bsearch
cabs
calloc
ceil
cgets
chdir
_chmod
chmod
chsize
circle
_clear87
cleardevice
clearerr
clearviewport
clock
_close
close
closegraph
clreol
clreol
clrscr
complex
conj
_control87
coreleft
cos
cosh
country
cprintf
cputs
_creat
creat
creatnew
creattemp
cscanf
ctime
ctrlbrk
delay
delline
detectgraph
difftime
disable
div
dosexterr
dostounix
drawpoly
dup
dup2
ecvt
ellipse
__emit__
enable
eof
exec
_exit
exp
fabs
farcalloc
farcoreleft
farfree
farmalloc
farrealloc
fclose
fcloseall
fcvt
fdopen
feof
ferror
fflush
fgetc
fgetchar
fgetpos
fgets
filelength
fileno
fillellipse
fillpoly
findfirst
findnext
floodfill
floor
flushall
fmod
fnmerge
fnsplit
fopen
FP_OFF
_fpreset
fprintf
FP_SEG
fputc
fputchar
fputs
fread
free
freemem
freopen
frexp
fscanf
fseek
fsetpos
fstat
ftell
ftime
fwrite
gcvt
geninterrupt
getarccoords
getaspectratio
getbkcolor
getc
getcbrk
getch
getchar
getche
getcolor
getcurdir
getcwd
getdate
getdefaultpalette
getdfree
getdisk
getdrivername
getdta
getenv
getfat
getfatd
getfillpattern
getfillsettings
getftime
getgraphmode
getimage
getlinesettings
getmaxcolor
getmaxmode
getmaxx
getmaxy
getmodename
getmoderange
getpalette
getpalettesize
getpass
getpid
getpixel
getpsp
gets
gettext
gettextinfo
gettextsettings
gettime
getvect
getverify
getviewsettings
getw
getx
gety
gmtime
gotoxy
graphdefaults
grapherrormsg
_graphfreemem
_graphgetmem
graphresult
harderr
hardresume
hardretn
heapcheck
heapcheckfree
heapchecknode
heapfillfree
heapchecknode
heapfillfree
heapwalk
highvideo
hypot
imag
imagesize
initgraph
inport
inportb
insline
installuserdriver
installuserfont
int86
int86x
intdos
intdosx
intr
ioctl
isalnum
isalpha
isascii
isatty
iscntrl
isdigit
isgraph
islower
isprint
ispunct
isspace
isupper
isxdigit
itoa
kbhit
keep
labs
ldexp
ldiv
lfind
line
linerel
lineto
localeconv
localtime
lock
log
log10
longjmp
lowvideo
_lrotl
_lrotr
lsearch
lseek
ltoa
malloc
_matherrl
matherr
max
memccpy
memchr
memcmp
memcpy
memicmp
memmove
memset
min
mkdir
MK_FP
mktemp
modf
movedata
moverel
movetext
moveto
movmem
norm
normvideo
nosound
_open
open
outport
outportb
outtext
outtextxy
_OvrInitEms
_OvrInitExt
parsfnm
peek
peekb
perror
pieslice
poke
pokeb
polar
poly
pow
pow10
printf
putc
putch
putchar
putenv
putimage
putpixel
puts
puttext
putw
qsort
raise
rand
randbrd
randbwr
random
randomize
_read
real
realloc
rectangle
registerbgidriver
registerbgifont
remove
rename
restorecrtmode
rewind
rmdir
_rotl
_rotr
sbrk
scanf
searchpath
sector
segread
setactivepage
setallpalette
setaspectratio
setbkcolor
setblock
setbuf
setcbrk
setcolor
_setcursortype
setdate
setdisk
setdta
setfillpattern
setfillstyle
setftime
setgraphbufsize
setgraphmode
setjmp
setlinestyle
setlocale
setmem
setmode
setpalette
setrgbpalette
settextjustify
settextstyle
settime
setusercharsize
setvbuf
setvect
setverify
setviewport
setvisualpage
setwritemode
signal
sin
sinh
sleep
sopen
sound
spawn
sprintf
sqrt
srand
sscanf
stat
_status87
stime
stpcpy
strcat
strchr
strcmp
strcmpi
strcoll
strcpy
strcspn
strdup
_strerror
strerror
stricmp
strlen
strlwr
strncat
strncmp
strncmpi
strncpy
strnicmp
strset
strpbrk
strrchr
strrev
strset
strspn
strstr
strtod
strtok
strtol
strtoul
strupr
swab
system
tan
tanh
tell
textattr
textbackground
textcolor
textheight
textmode
textwidth
time
tmpfile
tmpnam
toascii
_tolower
tolower
_toupper
toupper
tzset
ultoa
ungetc
ungetch
unixtodos
unlink
unlock
Va_
V
wherex
wherey
window
_write
write

이 레퍼런스의 저작권은 WinApi가 가지고 있습니다.

Posted by 테티스
,

C/C++ 언어는 다른 고급 언어들에 비해 다음과 같은 장점이 있다. 물론 다른 언어들도 나름대로의 장점을 가지고 있기 때문에 C/C++ 언어가 모든 면에서 다른 언어보다 우월하다고 할 수는 없다. 장점이라기 보다는 언어의 특징이라고 생각하면 된다. C/C++언어의 특징을 한마디로 요약하면 "성능 지향의 범용 언어"라고 할 수 있는데 좋으니까 많은 사람들이 쓰겠거니 생각하면 되고 공부를 하다보면 자연스럽게 알게 되므로 일부러 외울 필요까지는 없다.

① 문법이 간결하다. 예약어가 적고 제공하는 연산자가 다양하기 때문에 짧은 명령으로 많은 일을 할  수 있다.

② 효율성이 좋아 대규모의 고기능 프로그램을 만들 수 있다. 제작된 프로그램의 크기가 작고 속도도 빠르다.

③ 운영체제 개발을 목적으로 만든 언어이므로 저수준 프로그래밍이 가능하며 어셈블리 수준의 하드웨어 제어를 할 수 있다.

④ 모든 분야에 두루 활용할 수 있을 정도로 범용적이다. 사무 처리, 과학 기술, 상업용 등 거의 대부분의 응용 프로그램을 개발할 수 있다.

⑤ 성능을 위해 불필요한 에러 처리를 하지 않는다. 타입의 불일치나 배열 경계 점검 등은 프로그래머가 직접 해야 하므로 개발자는 항상 이 점을 주의해야 한다.

⑥ 이식성이 좋다. 대부분의 플랫폼에서 C/C++ 언어를 사용할 수 있으므로 재컴파일만 하면 타 운영체제에서 실행되는 프로그램을 쉽게 만들 수 있다.

물론 모든 것이 다 좋지는 않아서 단점도 있다. 베이직이나 최근의 그래픽 기반의 개발툴에 비해서는 배우기 어렵다는 것이 가장 큰 단점인데 특히 포인터는 초보자들에게 두려움의 대상으로까지 여겨지기도 한다. 최신 언어에 비해 부족한 기능도 많다. 예를 들어 최신 언어인 자바는 쓰레기 수집 기능을 제공하는데 C/C++은 이런 기능을 제공하지 않는다. 이것은 단점이라기 보다는 다른 언어와의 차이점이라고 보는 것이 옳다.

C/C++은 실제 개발을 할 때는 아주 좋은 언어임이 분명하며 가장 인기있는 실무 프로젝트용 언어이다. 그러나 프로그래밍에 처음 입문하는 사람들이 프로그래밍의 논리를 익히기에는 분명히 최적의 언어가 아니다. 기능은 좋지만 저수준 언어에 가깝기 때문에 처음 배우기에 너무 어렵다. 또한 주 실습 환경이 도스나 또는 윈도우즈의 콘솔과 같은 칙칙한 환경이기 때문에 실습의 재미도 없는 편이다.

프로그래밍 입문용 언어로는 비주얼 베이직이나 파스칼 언어에 기반한 델파이 정도가 아주 적합하다. 이 두 언어는 만들어질 때부터 교육용을 표방했기 때문에 아주 쉽다. 언어의 구조가 간단하고 엄격하기 때문에 문법에 금방 익숙해질 수 있으며 포인터같은 어려운 기능은 제공하지 않거나 축소하여 부담없이 공부할 수 있다. 또한 그래픽 환경에서 실습을 진행하기 때문에 작성한 코드의 결과를 눈으로 바로 바로 확인할 수 있어서 학습 진도도 빠른 편이다.

그러나 비주얼 베이직은 툴 자체의 근본적인 한계가 있어 고기능의 프로그램을 만들기에는 다소 역부족인 면이 있다. 델파이는 배우기도 쉽고 실무에 바로 사용할 수 있을만큼 강력한 기능을 제공한다. 이 외에도 최신 언어인 자바나 C#도 입문용 언어로서 권장할만한데 이 두 언어의 뿌리도 역시 C/C++이라고 할 수 있으므로 C/C++을 먼저 공부하면 쉽게 익숙해질 수 있다. 그러나 입문용 언어를 선택할 때 언어 자체의 기능만으로 선택할 수는 없으며 여러 가지 주변 여건도 같이 고려하지 않을 수 없다. 입문용 언어로서 C/C++이 유리한 이유는 다음과 같다.

첫 번째로 C/C++의 대중성을 들 수 있는데 현재 가장 널리 사용되는 언어가 바로 C/C++이다. 사용자가 많다는 것은 그만큼 자료가 많고 도움을 받을 수 있는 경로가 많다는 뜻이다. 이미 출판된 책도 수천종을 헤아리며 인터넷상에서도 많은 강좌와 공개된 소스를 구할 수 있다. 알고리즘이나 이론에 대한 설명 문서와 소스도 C/C++ 형태로 되어 있는 것이 가장 많으므로 최신 기술을 습득하기에도 유리하다. 또한 각종 동호회나 뉴스 그룹을 통해 의문나는 사항에 대해 질문을 올리고 바로 답을 구할 수도 있다.

두 번째로 C/C++은 실무에서 바로 쓸 수 있는 언어이며 대부분의 개발사들이 기본 개발 언어로 채택하고 있다. 거대한 운영체제에서부터 초소용 임베디드까지 C/C++ 개발 환경이 없는 곳이 거의 없다. 따라서 C/C++로 프로그래밍을 배우면 실무 환경에 적응하는데 따른 혼란이 거의 없으며 배운 지식을 실무에 곧바로 활용할 수 있다. 비주얼 베이직이나 델파이는 배우기는 쉽지만 사용 빈도가 C/C++보다 낮기 때문에 실제 개발을 할 때는 다시 C/C++을 배워야 하는 부담이 있다. 현실적으로 얘기하자면 C/C++은 취업에 가장 유리한 언어, 쉽게 말해 돈이 되는 언어라고 할 수 있다.

C/C++은 자바나 C#에 비해 완전한 객체 지향 언어가 아닌 혼합형 언어이다. 그래서 처음부터 객체를 몰라도 코딩을 할 수 있다는 것이 또 다른 장점이다. 객체를 쓰지 않을 때 무엇이 불편하며 왜 객체 지향이 좋은지 순서대로 경험해 볼 수 있다. C#이나 자바는 완전한 객체 지향 언어이므로 일단 익숙해지면 사용하기 편리하지만 처음부터 객체를 알아야 한다는 것은 입문자에게 다소 부담이 될 수도 있다.

Posted by 테티스
,