Developfordummies: 두 판 사이의 차이

Ubuntu Korea Community Wiki
둘러보기로 이동 검색으로 이동
imported>Wiki
imported>Wiki
119번째 줄: 119번째 줄:
* 스탠다드는 있긴 한데, 옛날 사람이 만든거라 별 도움이 안 돼.
* 스탠다드는 있긴 한데, 옛날 사람이 만든거라 별 도움이 안 돼.
* 20세기에는 막 플로챠트를 위한 도형자 같은것도 팔았다?
* 20세기에는 막 플로챠트를 위한 도형자 같은것도 팔았다?
[file:figureruler.jpg]
[[file:figureruler.jpg]]
* 근데 이딴거 필요없어. 그냥 동그라미나 네모나 니가 원하는 걸로 작성하면 돼.
* 근데 이딴거 필요없어. 그냥 동그라미나 네모나 니가 원하는 걸로 작성하면 돼.
* 니가 일주일 전 점심때 뭘 먹었는지 기억 못하면 니가 일주일 전 작성한 프로그램인데 코드 보면 뭐하는 코드인지 생각 안 날걸?
* 니가 일주일 전 점심때 뭘 먹었는지 기억 못하면 니가 일주일 전 작성한 프로그램인데 코드 보면 뭐하는 코드인지 생각 안 날걸?

2014년 4월 28일 (월) 05:51 판

이 문서를 쓰게 된 동기

  • 지금까지 나온 기술서적은 일반적으로 효율적인 프로그래밍 방법에 대해 이야기하고 있다.
  • 물론 효율적인 프로그래밍이 중요하지 않다는 것은 아니다.
  • 하지만 많은 학생들이 원하는 것 중의 하나는, ‘어떻게 나의 목적을 이룰 것인가?’에 대한 답변이라고 필자는 생각한다.
  • 네트워크 관리 등 관리 분야의 기술서적에서는 방법론에 대한 이야기가 많은데, 프로그래밍 개발 관련 서적에서는 잘 보이지 않았다.
  • 그나마 프로그래밍 기술서적중에 Head First Series가 있는데, 이런 방식의 서적이 필자에게 많이 도움이 되었다.
  • 선배가 이야기해주듯 프로그래밍을 이야기하는 것이 필자의 목적이다.

이야기의 구성

문제 발생 -> 문제점 분석 -> 각각의 해결방안 모색 -> 각각의 프로토타입 작성 -> 연습문제

  • 먼저, 릴리즈 타입의 프로그램 작성은 하지 않는다.
  • 리눅스와 같은 프로젝트는 처음부터 지금까지도 베타버전이다.
  • ‘정식버전 리눅스’같은 이야기를 들어본 적이 있는가?
  • 만약 니가 회사에 다닌다면, 회사에서는 릴리즈 버전을 발매할 것이다.
  • 하지만 그 릴리즈 버전에 대한 기준이 전부 다르며, 필자는 지금까지 작성한 프로그램이 모두 프로토타입이었고, 회사에서 차용했다(이 방법은 너 개인이든, 회사든 전혀 좋지 않다. 확실한 기준이 있는 회사에 입사해라).
  • 또한, 변수가 어떻고, 반복문이 어떻고 하는 문법에 관한 이야기는 하지 않는다.
  • 그런게 나와있는 책은 너무나도 많고, 니들은 그런 정보를 얻고 싶어서 이 책을 보는게 아니잖아. 좋은 책들 존나 많은데.

프로그래밍 환경

  • 기본적으로 Linux / g++ / vi 환경을 기본으로 하지만,
  • 뜬금없이 Microsoft C#.net과 같은 언어를 사용하거나 Java를 사용할 수도 있다.
  • 심지어 Delphi를 사용하기도 한다.
  • 즉, 문제 해결에 있어서 가장 좋은 언어를 고르면 되는 것이다.
  • 오픈소스 라이브러리 중 괜찮은 게 있다면 갖다 쓰는 방향으로 진행한다.
  • 어떤 라이브러리가 필요할 때 검색하는 능력까지 기대될 수 있다.

기대 효과

  • ‘언어의 사용법’보다는 ‘어떻게 프로그래밍을 할 것인가?’에 대한 고찰
  • 어떤 과제가 주어졌을 때 해결하는 능력 향상
  • 각 언어에 대한 Skill보다 전체적인 문제 해결 능력 향상

Chapter 1. Hello World와 별찍기.

문제 발생

  • 이거 프로그램을 짜서 돌리면 제대로 돌아가기나 할까?

문제점 분석

  • 아주 기본적인 프로그램을 작성하여 돌려보도록 하자.

해결 방안

  1. 그냥 단순한 텍스트가 출력되는지 보자.
  2. 그냥 단순한 창 같은 거 하나 띄워보자.
  3. 그냥 단순한 텍스트 나열을 보자.
  • 사실 Hello World라는건 동작 확인에 쓰이는 것이다.
  • 내가 프로그래밍을 해서 Hello World가 화면에 찍히기까지 많은 일이 준비되어 있다는 거다.
  • 프로그래머야 그냥 쉽게 확인한다고 생각하지만, 여러 가지가 전제되어 있는 환경이 이미 구축되어 있는 것이다.
  • 하지만 프로토타입 설계할 때 그런 건 신경쓰지 말자. 괜시리 설계만 쓸데없이 커진다.
  • 사실 Hello World의 경우 굳이 프로그래밍할 때 순서도를 작성하지 않아도 되는 유일한 프로그램일 것이다.
  • 일반적인 경우 무조건 플로챠트를 그리길 권한다.
  • 물론 이 문서에서 다음 챕터부터는 플로챠트가 꼭 등장한다.
  • 먼저, 인터넷에서(검색엔진이 무엇이 되었든) Hello World를 검색한다.
  • Hello World 어플리케이션은 대부분의 언어에서 샘플로 제공할 것이다. 그걸 쓰면 된다.
  • 가장 많이 이야기되는 C언어를 보자.

<syntaxhighlight lang="c">

  1. 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">

  1. include <Windows.h>

</syntaxhighlight> 자, 그냥 하나 띄우는데에도 코드가 엄청 커졌다는걸 느낄거다. 예전에는 저걸 전부 외우거나 책을 보고 타이핑을 했어야 하지만, 요즘은 그렇게 프로그래밍하면 효율적이지 않다는 이야기를 듣게 될 것이다. 각 컴파일러에서 제공하는 예제를 보고, 어느 부분이 핵심인지 파악하는게 중요하다. 즉, 여기서는 CreateWM 부분이 중요하며, MFC는 먼저 윈도우를 띄우고 나서 내용을 채워넣는 방식이라는걸 알 수 있다. 의외로, 많은 책들이 코드를 보는 방법에 대해서는 잘 가르쳐주지 않는 것 같다. 이제, Hello World는 찍어봤으니, 이걸 다른걸로 바꿔서 한 번 해보자. 그냥 몇줄 정도 찍어보도록 한다. <syntaxhighlight lang="c">

  1. 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. 성적 관리 프로그램.

  • 문제 발생
  1. 중고등학생이라면 성적 같은 거 관리해야지. 프로그래밍 하지 말고 성적 관리 좀 해 이놈들아. 그리고 뭐, 당신네들 성적 올리는걸 이 책에서 해줄 수는 없는 거야. 성적을 올리고 싶으면 프로그래밍을 좀 쉬었다 해도 돼.
  2. 그리고 이 성적을 말하는 게 아니라, 이건 쌤들용 프로그램이지. 우리 반 애들 성적을 입력하면 누가 몇 등 했는지 볼 수 있는 프로그램.
  • 문제점 분석
  1. 먼저 아이들 성적 입력을 받아야겠지.
  2. 또, 저장을 해야 돼. 프로그램을 구동할 때마다 계속 입력 해야 되면 짜증나잖아.
  3. 그리고, 성적순으로 뽑아 보려면 정렬을 해야 되지.
  • 각각의 해결방안 모색
  1. 각각 다른 프로그램을 만드는 거야.
  2. 이것도 텍스트 버전으로 만들 거야. 그래픽 버전은 니가 만들어 보라구.
  3. 저장은 먼저 파일 저장이랑 RDBMS 이용하는 거랑 해보자.
  4. 정렬하는 건, 출력할 때 정렬하는 걸로 하자.
  • 근데 사실 솔직히.. 이런 종류의 프로그램들을 ERP라고 하거든.
  • 이건 단순한 거고, 커지고 요구사항이 많으면 되게 어려워.
  • 그래서 결국 하고자 하는 얘기는, 다음 그림처럼 하자는 얘기지.

[ 성적관리 프로그램의 입력부, 출력부에 대한 플로챠트 ]

  • 플로챠트 보니까 어떠냐? 어떤 프로그램을 쓰건 니 머릿속에 있는걸 그려보는게 중요해 보이긴 하지?
  • 니가 말을 존나 잘 하면 말로 설명하는 것도 한가지 방법일 수 있겠는데, 그 말을 들어야 할 사람이 존나 많으면 어떻게 하냐?
  • 지금 니들이 글을 읽고는 있지만 제대로 읽긴 하냐?
  • 근데 그림은 바로 보이지?
  • 영어나 일본어나 중국어로 써있어도 이해할걸? 어차피 함수 이름은 영어고.
  • 즉, 외국인이랑도 일 할 수 있다는 얘기야. 영어도 중요하긴 한데, 미술은 더더욱 중요한거임.
  • 도형은 뭐 니들이 알아서 해. 아무거나 써도 되는거야 그거.
  • 스탠다드는 있긴 한데, 옛날 사람이 만든거라 별 도움이 안 돼.
  • 20세기에는 막 플로챠트를 위한 도형자 같은것도 팔았다?

파일:Figureruler.jpg

  • 근데 이딴거 필요없어. 그냥 동그라미나 네모나 니가 원하는 걸로 작성하면 돼.
  • 니가 일주일 전 점심때 뭘 먹었는지 기억 못하면 니가 일주일 전 작성한 프로그램인데 코드 보면 뭐하는 코드인지 생각 안 날걸?
  • 근데 그림이라도 끄적여 놓으면 기억 나거든.
  • 봐봐. 필자도 지금 보면 뭐 할지 정하고 다 그리고 시작하지?
  • 회사에서 다 정해줬다고 해서 그거 따라가면 되긴 하는데, 뭐 좀 부실할걸? 니 작업은 니가 다시 설계 해야 돼. 너한테 맞게 구체화시켜야지.
  • 어쨌든 간에 자, 그럼 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로도 변경이 가능하지.