Developfordummies: 두 판 사이의 차이
imported>Wiki |
imported>Wiki |
||
| 49번째 줄: | 49번째 줄: | ||
* Hello World 어플리케이션은 대부분의 언어에서 샘플로 제공할 것이다. 그걸 쓰면 된다. | * Hello World 어플리케이션은 대부분의 언어에서 샘플로 제공할 것이다. 그걸 쓰면 된다. | ||
* 가장 많이 이야기되는 C언어를 보자. | * 가장 많이 이야기되는 C언어를 보자. | ||
<syntaxhighlight lang="c"> | |||
#include <stdio.h> | #include <stdio.h> | ||
int main(int argc, char* argv[]) | int main(int argc, char* argv[]) | ||
| 56번째 줄: | 56번째 줄: | ||
return 0; | return 0; | ||
} | } | ||
</syntaxhighlight> | |||
* 잘 보면 printf가 핵심이라는걸 알 수 있을 것이다. | * 잘 보면 printf가 핵심이라는걸 알 수 있을 것이다. | ||
* 하지만 요즘 세상에 누가 Console 화면을 볼 것인가? | * 하지만 요즘 세상에 누가 Console 화면을 볼 것인가? | ||
| 62번째 줄: | 62번째 줄: | ||
* 그러므로 뭐 Window라도 하나 띄워보는 것이 좋겠다. | * 그러므로 뭐 Window라도 하나 띄워보는 것이 좋겠다. | ||
* Window를 띄우는 함수는 Windows의 MFC를 사용하도록 하겠다. | * Window를 띄우는 함수는 Windows의 MFC를 사용하도록 하겠다. | ||
<syntaxhighlight lang="c"> | |||
#include <Windows.h> | #include <Windows.h> | ||
</syntaxhighlight> | |||
자, 그냥 하나 띄우는데에도 코드가 엄청 커졌다는걸 느낄거다. | 자, 그냥 하나 띄우는데에도 코드가 엄청 커졌다는걸 느낄거다. | ||
예전에는 저걸 전부 외우거나 책을 보고 타이핑을 했어야 하지만, 요즘은 그렇게 프로그래밍하면 효율적이지 않다는 이야기를 듣게 될 것이다. | 예전에는 저걸 전부 외우거나 책을 보고 타이핑을 했어야 하지만, 요즘은 그렇게 프로그래밍하면 효율적이지 않다는 이야기를 듣게 될 것이다. | ||
| 72번째 줄: | 72번째 줄: | ||
이제, Hello World는 찍어봤으니, 이걸 다른걸로 바꿔서 한 번 해보자. | 이제, Hello World는 찍어봤으니, 이걸 다른걸로 바꿔서 한 번 해보자. | ||
그냥 몇줄 정도 찍어보도록 한다. | 그냥 몇줄 정도 찍어보도록 한다. | ||
<syntaxhighlight lang="c"> | |||
#include <stdio.h> | #include <stdio.h> | ||
int main(int argc, char* argv[]) | int main(int argc, char* argv[]) | ||
| 84번째 줄: | 84번째 줄: | ||
return 0; | return 0; | ||
} | } | ||
</syntaxhighlight> | |||
이렇게, 플로챠트도 필요없을 정도로 단순한 프로그래밍은 이제 다들 할 수 있을거라 생각한다. | 이렇게, 플로챠트도 필요없을 정도로 단순한 프로그래밍은 이제 다들 할 수 있을거라 생각한다. | ||
네모를 봤으면 세모도 찍어봐야지. | 네모를 봤으면 세모도 찍어봐야지. | ||
2014년 4월 28일 (월) 05:19 판
이 문서를 쓰게 된 동기
- 지금까지 나온 기술서적은 일반적으로 효율적인 프로그래밍 방법에 대해 이야기하고 있다.
- 물론 효율적인 프로그래밍이 중요하지 않다는 것은 아니다.
- 하지만 많은 학생들이 원하는 것 중의 하나는, ‘어떻게 나의 목적을 이룰 것인가?’에 대한 답변이라고 필자는 생각한다.
- 네트워크 관리 등 관리 분야의 기술서적에서는 방법론에 대한 이야기가 많은데, 프로그래밍 개발 관련 서적에서는 잘 보이지 않았다.
- 그나마 프로그래밍 기술서적중에 Head First Series가 있는데, 이런 방식의 서적이 필자에게 많이 도움이 되었다.
- 선배가 이야기해주듯 프로그래밍을 이야기하는 것이 필자의 목적이다.
이야기의 구성
문제 발생 -> 문제점 분석 -> 각각의 해결방안 모색 -> 각각의 프로토타입 작성 -> 연습문제
- 먼저, 릴리즈 타입의 프로그램 작성은 하지 않는다.
- 리눅스와 같은 프로젝트는 처음부터 지금까지도 베타버전이다.
- ‘정식버전 리눅스’같은 이야기를 들어본 적이 있는가?
- 만약 니가 회사에 다닌다면, 회사에서는 릴리즈 버전을 발매할 것이다.
- 하지만 그 릴리즈 버전에 대한 기준이 전부 다르며, 필자는 지금까지 작성한 프로그램이 모두 프로토타입이었고, 회사에서 차용했다(이 방법은 너 개인이든, 회사든 전혀 좋지 않다. 확실한 기준이 있는 회사에 입사해라).
- 또한, 변수가 어떻고, 반복문이 어떻고 하는 문법에 관한 이야기는 하지 않는다.
- 그런게 나와있는 책은 너무나도 많고, 니들은 그런 정보를 얻고 싶어서 이 책을 보는게 아니잖아. 좋은 책들 존나 많은데.
프로그래밍 환경
- 기본적으로 Linux / g++ / vi 환경을 기본으로 하지만,
- 뜬금없이 Microsoft C#.net과 같은 언어를 사용하거나 Java를 사용할 수도 있다.
- 심지어 Delphi를 사용하기도 한다.
- 즉, 문제 해결에 있어서 가장 좋은 언어를 고르면 되는 것이다.
- 오픈소스 라이브러리 중 괜찮은 게 있다면 갖다 쓰는 방향으로 진행한다.
- 어떤 라이브러리가 필요할 때 검색하는 능력까지 기대될 수 있다.
기대 효과
‘언어의 사용법’보다는 ‘어떻게 프로그래밍을 할 것인가?’에 대한 고찰 어떤 과제가 주어졌을 때 해결하는 능력 향상 각 언어에 대한 Skill보다 전체적인 문제 해결 능력 향상
Chapter 1. Hello World와 별찍기.
- 문제 발생 : 이거 프로그램을 짜서 돌리면 제대로 돌아가기나 할까?
- 문제점 분석 : 아주 기본적인 프로그램을 작성하여 돌려보도록 하자.
- 해결 방안
- 그냥 단순한 텍스트가 출력되는지 보자.
- 그냥 단순한 창 같은 거 하나 띄워보자.
- 그냥 단순한 텍스트 나열을 보자.
- 사실 Hello World라는건 동작 확인에 쓰이는 것이다.
- 내가 프로그래밍을 해서 Hello World가 화면에 찍히기까지 많은 일이 준비되어 있다는 거다.
- 프로그래머야 그냥 쉽게 확인한다고 생각하지만, 여러 가지가 전제되어 있는 환경이 이미 구축되어 있는 것이다.
- 하지만 프로토타입 설계할 때 그런 건 신경쓰지 말자. 괜시리 설계만 쓸데없이 커진다.
- 사실 Hello World의 경우 굳이 프로그래밍할 때 순서도를 작성하지 않아도 되는 유일한 프로그램일 것이다.
- 일반적인 경우 무조건 플로챠트를 그리길 권한다.
- 물론 이 문서에서 다음 챕터부터는 플로챠트가 꼭 등장한다.
- 먼저, 인터넷에서(검색엔진이 무엇이 되었든) Hello World를 검색한다.
- Hello World 어플리케이션은 대부분의 언어에서 샘플로 제공할 것이다. 그걸 쓰면 된다.
- 가장 많이 이야기되는 C언어를 보자.
<syntaxhighlight lang="c">
- include <stdio.h>
int main(int argc, char* argv[]) {
printf("Hello World!\n");
return 0;
} </syntaxhighlight>
- 잘 보면 printf가 핵심이라는걸 알 수 있을 것이다.
- 하지만 요즘 세상에 누가 Console 화면을 볼 것인가?
- (물론 필자나, 리눅스 유저들은 Console 화면을 좋아하지만, 대부분의 유저들은 좋아하지 않는다)
- 그러므로 뭐 Window라도 하나 띄워보는 것이 좋겠다.
- Window를 띄우는 함수는 Windows의 MFC를 사용하도록 하겠다.
<syntaxhighlight lang="c">
- include <Windows.h>
</syntaxhighlight> 자, 그냥 하나 띄우는데에도 코드가 엄청 커졌다는걸 느낄거다. 예전에는 저걸 전부 외우거나 책을 보고 타이핑을 했어야 하지만, 요즘은 그렇게 프로그래밍하면 효율적이지 않다는 이야기를 듣게 될 것이다. 각 컴파일러에서 제공하는 예제를 보고, 어느 부분이 핵심인지 파악하는게 중요하다. 즉, 여기서는 CreateWM 부분이 중요하며, MFC는 먼저 윈도우를 띄우고 나서 내용을 채워넣는 방식이라는걸 알 수 있다. 의외로, 많은 책들이 코드를 보는 방법에 대해서는 잘 가르쳐주지 않는 것 같다. 이제, Hello World는 찍어봤으니, 이걸 다른걸로 바꿔서 한 번 해보자. 그냥 몇줄 정도 찍어보도록 한다. <syntaxhighlight lang="c">
- include <stdio.h>
int main(int argc, char* argv[]) {
for(int loop1 = 0; loop1 < 5; loop1++)
{
for(int loop2 = 0; loop2 < 5; loop2++)
printf("*");
printf("\n");
}
return 0;
} </syntaxhighlight> 이렇게, 플로챠트도 필요없을 정도로 단순한 프로그래밍은 이제 다들 할 수 있을거라 생각한다. 네모를 봤으면 세모도 찍어봐야지. 연습문제 : 세모 별찍기를 해보자.
Chapter 2. 성적 관리 프로그램.
- 문제 발생
- 중고등학생이라면 성적 같은 거 관리해야지. 프로그래밍 하지 말고 성적 관리 좀 해 이놈들아. 그리고 뭐, 당신네들 성적 올리는걸 이 책에서 해줄 수는 없는 거야. 성적을 올리고 싶으면 프로그래밍을 좀 쉬었다 해도 돼.
- 그리고 이 성적을 말하는 게 아니라, 이건 쌤들용 프로그램이지. 우리 반 애들 성적을 입력하면 누가 몇 등 했는지 볼 수 있는 프로그램.
- 문제점 분석
- 먼저 아이들 성적 입력을 받아야겠지.
- 또, 저장을 해야 돼. 프로그램을 구동할 때마다 계속 입력 해야 되면 짜증나잖아.
- 그리고, 성적순으로 뽑아 보려면 정렬을 해야 되지.
- 각각의 해결방안 모색
- 각각 다른 프로그램을 만드는 거야.
- 이것도 텍스트 버전으로 만들 거야. 그래픽 버전은 니가 만들어 보라구.
- 저장은 먼저 파일 저장이랑 RDBMS 이용하는 거랑 해보자.
- 정렬하는 건, 출력할 때 정렬하는 걸로 하자.
- 근데 사실 솔직히.. 이런 종류의 프로그램들을 ERP라고 하거든.
- 이건 단순한 거고, 커지고 요구사항이 많으면 되게 어려워.
- 그래서 결국 하고자 하는 얘기는, 다음 그림처럼 하자는 얘기지.
[ 성적관리 프로그램의 입력부, 출력부에 대한 플로챠트 ]
- 플로챠트 보니까 어떠냐? 어떤 프로그램을 쓰건 니 머릿속에 있는걸 그려보는게 중요해 보이긴 하지?
- 니가 말을 존나 잘 하면 말로 설명하는 것도 한가지 방법일 수 있겠는데, 그 말을 들어야 할 사람이 존나 많으면 어떻게 하냐?
- 지금 니들이 글을 읽고는 있지만 제대로 읽긴 하냐?
- 근데 그림은 바로 보이지?
- 영어나 일본어나 중국어로 써있어도 이해할걸? 어차피 함수 이름은 영어고.
- 즉, 외국인이랑도 일 할 수 있다는 얘기야. 영어도 중요하긴 한데, 미술은 더더욱 중요한거임.
- 도형은 뭐 니들이 알아서 해. 아무거나 써도 되는거야 그거.
- 스탠다드는 있긴 한데, 옛날 사람이 만든거라 별 도움이 안 돼.
- 20세기에는 막 플로챠트를 위한 도형자 같은것도 팔았다?
[ 플로챠트용 도형자 사진 ]
- 근데 이딴거 필요없어. 그냥 동그라미나 네모나 니가 원하는 걸로 작성하면 돼.
- 니가 일주일 전 점심때 뭘 먹었는지 기억 못하면 니가 일주일 전 작성한 프로그램인데 코드 보면 뭐하는 코드인지 생각 안 날걸?
- 근데 그림이라도 끄적여 놓으면 기억 나거든.
- 봐봐. 필자도 지금 보면 뭐 할지 정하고 다 그리고 시작하지?
- 회사에서 다 정해줬다고 해서 그거 따라가면 되긴 하는데, 뭐 좀 부실할걸? 니 작업은 니가 다시 설계 해야 돼. 너한테 맞게 구체화시켜야지.
- 어쨌든 간에 자, 그럼 C#으로 간단하게 만들어 볼까?
[ 성적 관리 입력 프로그램, define을 이용해서 파일과 SQL을 결정 ]
- 입력해서 파일에 넘겼어. Define 좀 수정하면 SQL에 대응도 하지..
- 이런 식으로 프로그램을 짜도 좋고, 파일로 나눠도 좋고, 방법은 니가 정하는 거긴 한데, 어쨌거나 핵심은 여러 상황에 대응할 수 있는 코드를 작성해 두면 다음에 이 코드를 다시 쓸 수 있다는 거야.
- 그런데, 너무 여러 개라면 그냥 대응 하지 않는 게 좋아.
- 모든 상황에 범용적인 코드란 건 있을 수 없는 거니까.
- 컴퓨터가 만능이라고는 하지만, 보통 컴퓨터 자체로 밥을 해먹지는 않지(일부 미친놈들은 예외).
- 니가 코드를 짤 때는 나중에 또 쓸 것 같아도 실은 코드 재사용을 잘 안해. 내가 짠 코드도 내가 까먹거든.
- 그러니까 쓸데없이 너무 일 크게 만들지 말고, 해봤자 두어개 정도만 대응하면 훌륭한거야.
- 다음은 출력을 해보자.
[ 입력 프로그램과 마찬가지로 #define을 이용해서 파일과 SQL을 결정, C# ]
- 어라? 정렬하는건 그냥 함수 하나로 해결해 버렸네?
- 뭐, 지금 정렬하는 방법에 대한 이야기를 하긴 좀 그렇잖아?
- Quick Sort라던지, Bubble Sort라던지, 이런 건 설명해주는 책들 많아.
- 그리고, 이 책에서 언어 여러 개 쓴다고 여러 가지 언어에 대한 책들 살 필요는 없어. 니가 가장 하고 싶거나 가장 잘 하는 언어의 책만 가지고 있으면 돼.
- 어차피 이런저런 소개만 하는 거니까. 정 뭐하면 내가 짠 언어를 니가 잘하는 언어로 구현하는 것도 엄청난 연습이 될 거야.
- 연습문제 : 여기에 그래픽을 입혀 보자. 본인이 가장 잘 하는 언어로 구현하는 방법이 가장 좋다.
Chapter 3. 실시간 채팅 프로그램
- 문제 발생 – 내가 만든 프로그램으로 채팅을 해보고 싶어.
- 문제점 분석
1. 서버와 내 컴퓨터가 연결되어 있어야 해. 2. 그리고 그 연결은 지속성을 띄어야 하지. 3. 그러니까, 내가 아무것도 하지 않을 때에도 메시지를 받을 수 있어야 해. 4. 조금 더 추가하자면, 대화내용이 어딘가에 저장되었으면 하는군. 5. 고난이도의 문제로, 내가 접속중이지 않을 때 받은 메시지도 볼 수 있으면 좋을것 같군.
- 각각의 해결방안 모색
1. 소켓프로그래밍을 이용하도록 하자. 2. 소켓에서도 C/S 방법을 이용하도록 하자. 3. 대기중에는 진짜 메시지를 기다리도록 하자. 4. 메시지를 먼저 파일이나 RDBMS에 저장해보자. 5. 전송을 받으면 OK 신호를 보내도록 하자. 그렇게 하면 그냥 OK 안 들어온거만 재전송하면 끝.
- 야 이거만 할 줄 알아도 웬만한 회사에서는 널 존나 써먹을 수 있을거다.
- 진짜 제대로 된 채팅프로그램 짤 줄 아는 애들이 많이 없거든..
- 여기에 프로토콜만 붙이면 산업용 장비나, 온라인게임도 만들 수 있게 되지.
- 자. 파이썬으로 쉽게 하나 짜볼까?
[ 파이썬 서버 / 파이썬 클라이언트 ] pycurses라는거 보여? 저거 좀만 손대면 pyqt로도 변경이 가능하지.