*******************
이 글은 '소스왕국'의 '김태영'님의 글임을 알립니다.
즐거운 시간되세요. ^^
*******************
언제부턴가 주위 사람 대부분이 나에게 프로그램을 어떻게 하면 잘할 수 있 는 물어보려고 한다. 그게 언제부터인가는 생각나지 않지만 그게 중요한가!!
빌어먹을 아직도 프로그램하나 만들려면 검은 머리털이 하나씩 새치로 변해 가는 느낌인데 그래서 말인데 컴퓨터한테 유감이 좀많아 나의 젊은 청춘을 프로그램 만는드는데 바꾸는것도 별로 유쾌하지도 않고 그런데도 프로그램을 만들고 싶다고!!!! 벌써 세번째다. 몇일간 강좌를 올리지 않은건 여러분에게 잠시 생각할 시간 을 준 것이다. 필자가 강의하는 것이 혼란스럽고 이상해보일수도 있다. 그러 나 앞선내용을 소화해내지 않았다면 더이상 보지를 말라. 지금부터는 더욱 그럴것이기 때문이다.
다들 빨리 배울길원한다. 첫강의부터 포인터가 어떻고 비교는 어떻고 등등 이런 것을 알려주지 요런것은 쓸데없는 것은 낭비라고 생각할지도 모르겠 다. 파우스트에서 인간은 노력하는동안 헤메이게 마련이라며 냉소한다. 당신 이 노력하면 할수록 무엇을 하고있는지 모르게 마련이다. 프로그래밍은 노 력의 산물이긴하다 그러나 무한히 노력만 한다고 모든 것이 해결되는 것은 아니다. 프로그래밍의 열쇠는 전체를 계속해서 숙지하면서 세부적인 것을 결정하는 방법이다. 처음엔 어렵고 힘들겠지만 이방법에 익숙해진다면 우리 가 숨쉬는 것처럼 자연스럽게 이루어질 것이다. 배움의 길은 왕도가 없다.
2 언어 그리고 C
이제부터 언어와 생각에 대한 것이다. C라는 프로그램도구에 관한 것인데 잘잃어보는 좋을 것이다. A==A의 방법으로 하는 것이 아니라 A생각A이나까.
2.1.1 정의를 배우자.
언어는 정의다. 어떤책에서(책이름을 밝히기 곤란하단걸 잘 알겠죠) 정의와 언어에 관해서 방대하게 쓴 것을 본적이 있다. 정의와 선언의본질에 관한 것이 아니라 선 언이 어떻고 정의가 어떻고 이렇게 양분법적인 시각에서 나누려고 했다. 분 명한 것은 그렇게 방대하게 썼다면 그것은 그것이 중요하기 때문이다. "책상은 책상이다"란 책에서 주인공은 외부와 단절을하고 사물에 자기만의 이름을 붙이고 있다. 책상은 거울로, 의자는 빈대떡로 이런식으로 모든것에 대한 이름을 바꾸었다. 세월이 흘러 그사람은 자신이 이름붙인것에 익숙해 졌다. 어느날 그가 외출을 했을때 그는 세상 사람이 미친것만 같았다. 왜냐 하면 거울을 책상이라고 부르고, 세상에나 빈대떡보고 의자라고 불렀다. 그 는 세상사람들이 모두미쳤다고 생각하면 집으로 돌아와서 영원히 집에서 나 오지 안았다. 이제 생각해보자 언어에서 정의가 얼마나 중요한것인가! 우선 정의와선언에 대하여 먼제 알아보자. 소유냐 존재냐란 책을 상기해보자(안읽었다고 해도 상관없다) 여기서 소유 의 표현은 "나는 컴퓨터를 가지고있다"라고 한다. 하지만 존재표현으로는 "나는 컴퓨터가 있다."이다. 이두가지의 차이점은 존재하는 상태(있다, 없다) 가 아니라 관점의 차이에 있다. 이미 존재하는 것을 관점에 따라 다르게 표 현한다. 정의는 선언과 같다. 왜냐하면 정의는 존재하는 것을 대상으로 하기 때문이 다. 그러나 선언은 정의와 같지 않다. 선언은 존재하는 사물에 다른 관점이 다(헛갈리죠, 나도 알아요). 상상력을 동원해보자.
질문 : 모스크바에 가본적이 있는가?
답 : 없다.
질문 : 그렇다면 모스크바가 존재한다고 믿는가?
답 : 그렇다.
질문 : 그럼 모스크바가 존재하는 것을 어떻게 아는가?
답 : 여러 가지 사실로 지도, 다녀온사람등
질문 : 그렇다면 귀신은 존재하는가?
답 : 확실하지 않다.
질문 : 귀신을 본사람이 있다면 어떻게 생각하는가?
답 : 내가 보지 못한건 믿을수 없다.
질문 : 모스크바와 귀신의 차이점은 무엇인가?
답 : ......
모스크바의 믿음과 귀신의 불신의 차이는 무엇인가. 과학적인것과 비과학적 인 것의 차이는 화학과 연금술의 차이이다. 과학은 비과학적인 곳에서 출발 해서 과학적인곳으로 발전해왔다. 정의와 선언을 설명하는데 모스크바와 귀 신이 무엇을 말하겠는가?
아버지 어머니 형 나 동생 <------ 모두 존재한다(정의)
│ │ │ │ │
└───┴┬─┴─┴──┘
│
가족 <------ 존재에 대한 관계(선언)
<도표 2.1.1>
아버지, 어머니, 형, 나, 동생은 분명히 존재하는 것이다. 즉 정의(존재)가 되 어있다. 그러나 가족은 선언(소유)되어 있다. 왜 가족이 선언된 것이 냐고 그것은 아버지, 어머니, 형, 나, 동생의 관계를 나타낸 것이기 때문이다. 가 족이란 항상 같지가 않다. 형제가 한명일 수 도 있고, 열명일수도 있지 않은 가! - 존재 하는 대상의 이름붙임은 정의다. - 관계나 다른이름(관계는 형이지만 형도 자신의 이름이 있다.)를 나타내는 것들은 선언이다. 자 여러분이 C++에 관심이 있다면 필자의 설명에서 C++에서의 객체와 연 관성이 있어보이지 않는가? 그렇다. C++에서의 객체는 정의(존재)에 대한 선언(소유)이다. 이것이 C++, 객체지향의 열쇠이다. C++어렵고 힘들어 보이 는가? 그것은 당신에게 정의와 선언에 관한 명확한 이해가 없기 때문이다. C++에관심이 있는 사람을 위해 약간의 힌트만 주겠다.
class family
{
// 가족 선언
private:
int 아버지; // 정의
int 어머니;
int 형;
int 나;
int 동생;
int 초인종단추상태;
public:
family(주소); // 생성자
int 누가집에있는가(void); // 행동양식 선언(따로정의된다).
int 특정인불러내기(int 가족);
void 초인종(int 초인종단추상태){ return 초인종단추상태 };
// 행동양식 정의(inline)
~family(주소); //<--- 소멸자
}
*** inline 이포함된 문장은 선언(이름붙임)과 동시에 정의된 것이다. 왜그런가? 선언은 지금처럼 관계와 그속에 관련된것의 이름붙임 이고 정의란 그것이 실제하게 만드는것이다. 선언된것이 언제 정의되는가? 간단한다! family myfamily;라고 정의 하면서부터 존재하게 되는것이다. 우리가 새집으로 이상왔다(생성자 호출). 누가 초인총을 눌렀다(초인종 함수호출). 집에 누가 있나(누가집에있나 함수 호출 하면 집에 있는사람이 나올거이 아 닌가)? 동생을 찾아 왔다고(특정인불러내기 함수를 통해서 불러낸다)! 나오면 같이 놀러가고 없다면 그냥 돌아가면 되지 았겠는가!! 형이 결혼 했다(클래스를 파생시켜서 새로운 클라스를 추가하면 된다. 상속 성이라 한다). class newfamily: public family
{
private:
int 형수;
public:
int 남편(int 형);
}
이제 형수는 우리집에 한식구다. 그리고 새로운 가족이 됐다. 그리고 마지막으로 우린 이사를 갔다(소멸자). 간단하지만 이해하기 쉽지 안은가!! 정의와 선언을 중요한 문제로 생각하는 것은 모호하게 이해하지 말라는 것 이다. A, B사이에서 서로의 유사점 때문에 둘사이를 오해하면 곤란하다. A 에대한 생각과 B에대한 생각 그리고 모호점에 대한 생각 이렇게 세가지로 명확하게 나누어서 생각해야 한다.
2.1.2 앞뒤구분하기
프로그램을 작성할때 먼저해야 할것이 있고 나중에 해야 할것이 있다. 선언, 정의부분도 있고 변수의 선언, 정의 함수의 선언, 정의도 있다. 이런한 것을 명확하게 구분짓지 못한다면 나중에 후회(잘못하면 처음부터 다시만들어야 한다)를 하게 될 것이다. 추가해야할것이나 빼버려야 할부분이 생겼을때 어 떻게 해야 할지 모르는 상태로 빠져들어가 버린다. 자칫실수하면 프로그램 전체에 영향을 미치게 된다. 프로그램이란 조화와 균형이다. 프로그램이란 무작정시작하면 결과를 보기 어렵다. 예를들어 보라고!!!! 작은 프로그램이라 면 별로 걱정할것이 없다. 그러나 많은자료를 다루어야 한다면 심각한 문제 를 발생할 수 있다. 배열의 크기가 2000000만byte 정도 필요한 상황에 놓일 지도 모른다. 그것도 한자리에 몽땅모아놓고 처리하지 않으면 안되는 상황 이 발생할 수도 있다(사실 지금 내가 만들고 있는 프로그램이 그렇다) 이것 은 심각한 문제를 일으킨다. 처음에 미리 충분히 생각하지 안았다면 골치깨 나 썩이게 될것이다. 여러분이 소스(source)를 가지고 그속에서 무엇인가 좋은 것들을 찾으려고 하는데 설명문은 거의 없고 명령만 나열된 상되있다면 여러분은 제대로 파 악할 수 있을까? 훌륭한 코드(code)는 설명문이 필요 없다지만 이 것을 읽 고 있는 여러분이 그 정도로 경험이 많은가? 여러분이 프로그램 소스 (source)를 분석하기 전에 해야 할일은 결과를 예측하는 것이다. 결과를 예 측하면 그 소스에서 가장 중요한 부분과 그렇지 못한 부분을 찾아낼 수 있 다. 앞뒤을 구분한다는 결과를 먼저 예측하고 분석을 하는 것이다. 다른말로 하면 전체를 생각하면서 세부적인 것을 분석하라는 것이다. 사실 초보자가 프로그램 소스를 분석할때 대부분은 명령어를 따라다니는 방법에 의존한다. 그러나 그런식으로 파악을 하기가 매우 어렵다. 당신이 먼저해야 할일은 변 수부터 파악하는 일이다. 프로그램의 흐름을 결정하는 것은 명령이 아니라 변수다(이것에 대한 자세한 것은 다음편 변수론에서 나온다). 이점을 명심하 라. 필자는 계속해서 생각을 먼저 정리하고 프로그램에 들어가야 한다는 것을 말하고 있다. 이것은 단순한 이야기다. 그러나 왜이렇게 반복적으로 이야기 하는가? 그것은 당신이 계속해서 저지르는 실수(안타깝지만 필자도 종종 그 런다)이기 때문이다. 프로그램에 들어가기 전에 반드시 당신의 생각을 정리 해두지 않는다면 당신은 어디서부터 프로그램을 만들어야 할지 무엇을 먼저 만들어야 할지 언제쯤일이 끝날지 지금 무엇을 하고 있는 알수가 없는 것이 다. 먼저할일 나중에 할일 이것부터 구별할줄 알아야 하기 때문이다. 난 초 보자라서 힘들다고 힘들다고 화장실에 안가는가? 힘들어서 莪?못먹는가? 힘들어도 해야 한다. 이것을 못한다면 필자가 머라고 했는가!!!!! 컴퓨터를 보자기에 싸서 깊은 산속에다 모셔두고 게임기나 사서 제미나게 놀자.
2.1.3 구조화가 뭐지
프로그램의 구조화는 고급언어로 갈수록 중요한 문제가 되고 있다. 프로그 래머가 좀더 효율적으로 프로그램 소스를 인식할 수 있도록 하기 위한 방법 이 필요해 졌고 그래서 도입된 것이 구조화 프로그래밍이다. C언어를 배우기전에 여러분은 순수하게 프로그래밍이 무엇인가를 생각하여 야 한다. 벽돌공장 공장장이 벽돌답을 잘쌓는 것이 아니다. 벽돌공장 공장장 에게 우리집의 담을 쌓아 달라고는 할 수 없다. 그는 벽돌을 만들뿐이다. 프 로그래밍을 어떻게 해야 하는지 생각하지 못한다면 C언어에 대하여 아무리 자세하게 설명해도 여러분은 이해하기 힘들 것이다. 언어의 구조화는 일정 한 형태(이것을 template라한다)를 가지고 있다. 그러나 그것은 언어적인 문 제이고 당신의 생각은 어떻한가? 먼저 당신의 생각부터 구조화하여야 한다. 왜그러냐고? 당신 생각이 정리 되지 안았는데 어떻게 프로그램을 작성할 것 인가. 반딧불같은 생각을 자꾸하다가 보면 백열등같이 밝아지고 나중에는 태양같 이 밝아질 것이다. 생각이란 그런 것이다. 하면 할 수 록 살이 붙어 나간다. 여러분이 생각을 할때 명확하게 구조를 정하지 않는다면 나중에는 더이상 생각할 수 없는 상태로 나아간다. 생각을 일정한 규칙에 마추지 못한다면 (그것에 대해서는 두번째강의 마지막에서 이야기 했다)더이상 전진 하지말 라. 구조화란 규칙속에서 자유로움을 찾는 것이다. 생각을 구조화 하지 않는 다면 프로그램도 구조화될수 없다. 왜냐하면 구조화란 언어의 문제가 보다 도 사람의 문제 이기 때문이다. C가 구조화된 언어라고 아니다. 얼마든지 구조화되지 못하게 만들수 있다. 그렇게 만드는건 바로 당신이다. 프로그램을 만드는건 미래예측과 비슷하다. 미래란 선택에의해 자꾸움직이 는 것이라서 처음 생각했던 것이 완성하고 나면 다른 모습으로 변해있을 지 도 모른다. 그런식으로 완성된 프로그램은 처음 생각보다 좋을 수도 있지만 대부분은 그렇지 못하다. 처음 생각했던 위대했던 모습을 잊지 말자.
2.1.4 프로그램을 느끼자.
자이제 설명이 지루해져가고 있을 것이다. 당연하다. 필자는 오로지 한가지 만 끈질기게 강요하고 있으니까!!!!!! 그러나 그것은 매우 중요하기 때문이 다. 언어를 배우는것보다 더중요하다. 남태평양의 어느 섬나라에서는 길을 다듬어 활주로처럼 만들고 그 활주로 양옆을 따라 불을 피우고, 관제탑처럼 생긴 단을 쌓고 그위에 올라가 안테 나처럼 막대를 머리에 꼽은 사람이 하늘을 보며 비행기가 착륙하길 기다린 다. 이섬은 전쟁중에 군수기지였고 비행기가 매일뜨고 내렸다. 비행기가 내 릴때마다 엄청난 물건들이 내려졌다. 섬사람들은 그 모습을 흉내내는 것이 다. 마치 비향기가 다시 와서 그들이 원하는 것을 물건을 무한정 내려주길 바라고 있는 것이다. 그 행위자체는 완벽하다. 그러나 가장 중요한 것이 빠 졌다는 것을 외면 한다. 어쩌면 우리는 모두 남태평양의 사람처럼 책을 사 고 컴퓨터 앞에 가만히 앉아서 훌륭한 프로그래머가 되기를 기원하는지도 모른다. 오지 안는 비행기를 기다릴것인가 아니면 직접 날아볼것인가 여러분의 선택 이다. 프로그램을 작성하는건 기술이다. 그러나 생각하는 것은 기술이 아니라 느 끼는 것이다. 컴퓨터를 사용하다가 많은 자료를 잃어버려 느낀불편을 프로 그램으로 만들어 유명해진 사람도 있고 미식축구자료를 관리하려고 DATA BASE 프로그램을 만들어 유명해진 사람도 있다. 프로그램이란 편한 느낌을 주는 것이 최고다. 즉 사용하기 편리하고 간단하면 간단 할 수 록 좋은 것 이다. 지금은 안그렇지만 옛날에 프로그램을 작성할때 프로그래머 마음대로 일때가 있었다. 프로그램이란 프로그래머 마음대로 만드는 것 아니다. 프로 그램을 쓰는 사람을 위해 만드는 것이다. 이점이 바로 좋은 프로그램인가 나쁜 프로그램인가를 결정짓는 근거가된다. 기능이 아무리 훌륭해도 사용하 기 불편하다면 좋은 프로그램이 아니다. 당신은 잘 사용할 수 있겠지만 그 건 당신 생각일뿐이다. 보편적인 보통사람을 위한것일때 우린 좀더 신중해 져야 한다.
2.1.5 프로그램 언어의 흐름
컴퓨터는 흐름을 따라 움직인다. 이것을 알고리즘이라 부르든 그것은 중요 치 않다. 지금 중요한 것은 이제 프로그램언어를 배워야 할때가 왔다는 것 이다. 몰론 나머지부분도 이해해야 한다. 지금은 돌아가는 길처럼 보일지도 모르지만 지금 가는 길이 바로 지름길이기 때문이다. 나는 컴호텔 주인입니다. 컴호텔은 1층부터 5층까지 각층마다 5개의 방이 있습니다. 우리호텔에는 귀도 잘안들리고 말도 잘못하며 머리도 안좋아서 한번에 한가 지씩만 할줄 아는 일꾼이 있습니다. 내가 그사람에게 일을 시키는 방법은 간단합니다. 각방문마다 毛樗獵?게시판에 그사람이 해야 할일을 적어놓고 다닙니다. 그사람은 그것을 읽어보고 그방에서 해야할일을 하죠. 그는 항상 1층 1번방부터 찾아갑니다. 거기에는 두장의 메모지가 순서대로 붙어있죠 첫번째것은 "침대를 정리 할 것" 두번째는 "1층 3번방으로 갈것" 그는 순대대로 일을 처리하고 층 3번방으로 갔죠 거기에는 "침대정리", "화 장실청소" "2층 4번방으로" 그는 순서대로 일을 하고 2층4번 방으로 갔는데 거기는 "휴지통을 버릴 것", "4층 1번방으로"그는 일을 하고 4층1번방으로 갔는데 거기는 "3층 2번방에 갔가올 것 이모메지만 떼버릴것", "침대정리" " 5층 3번방으로" 그는 우서 3층2번 방으로 가서을 일을 하고 다시 돌아 왔 죠. 그리고는 일을 하고 5층 3번방으로 갔습니다. 거기에는 "손님확인 있으 면 돌아가서 쉴 것 없으면 다음메모지를 읽을 것" "TV를 4층2번방으로" 그 방에는 손님이 없어서 TV를 들고 4층 2번방으로 갔죠. "TV를 선반에 올려 놓고 돌아가서 쉴 것"
이 글은 '소스왕국'의 '김태영'님의 글임을 알립니다.
즐거운 시간되세요. ^^
*******************
언제부턴가 주위 사람 대부분이 나에게 프로그램을 어떻게 하면 잘할 수 있 는 물어보려고 한다. 그게 언제부터인가는 생각나지 않지만 그게 중요한가!!
빌어먹을 아직도 프로그램하나 만들려면 검은 머리털이 하나씩 새치로 변해 가는 느낌인데 그래서 말인데 컴퓨터한테 유감이 좀많아 나의 젊은 청춘을 프로그램 만는드는데 바꾸는것도 별로 유쾌하지도 않고 그런데도 프로그램을 만들고 싶다고!!!! 벌써 세번째다. 몇일간 강좌를 올리지 않은건 여러분에게 잠시 생각할 시간 을 준 것이다. 필자가 강의하는 것이 혼란스럽고 이상해보일수도 있다. 그러 나 앞선내용을 소화해내지 않았다면 더이상 보지를 말라. 지금부터는 더욱 그럴것이기 때문이다.
다들 빨리 배울길원한다. 첫강의부터 포인터가 어떻고 비교는 어떻고 등등 이런 것을 알려주지 요런것은 쓸데없는 것은 낭비라고 생각할지도 모르겠 다. 파우스트에서 인간은 노력하는동안 헤메이게 마련이라며 냉소한다. 당신 이 노력하면 할수록 무엇을 하고있는지 모르게 마련이다. 프로그래밍은 노 력의 산물이긴하다 그러나 무한히 노력만 한다고 모든 것이 해결되는 것은 아니다. 프로그래밍의 열쇠는 전체를 계속해서 숙지하면서 세부적인 것을 결정하는 방법이다. 처음엔 어렵고 힘들겠지만 이방법에 익숙해진다면 우리 가 숨쉬는 것처럼 자연스럽게 이루어질 것이다. 배움의 길은 왕도가 없다.
2 언어 그리고 C
이제부터 언어와 생각에 대한 것이다. C라는 프로그램도구에 관한 것인데 잘잃어보는 좋을 것이다. A==A의 방법으로 하는 것이 아니라 A생각A이나까.
2.1.1 정의를 배우자.
언어는 정의다. 어떤책에서(책이름을 밝히기 곤란하단걸 잘 알겠죠) 정의와 언어에 관해서 방대하게 쓴 것을 본적이 있다. 정의와 선언의본질에 관한 것이 아니라 선 언이 어떻고 정의가 어떻고 이렇게 양분법적인 시각에서 나누려고 했다. 분 명한 것은 그렇게 방대하게 썼다면 그것은 그것이 중요하기 때문이다. "책상은 책상이다"란 책에서 주인공은 외부와 단절을하고 사물에 자기만의 이름을 붙이고 있다. 책상은 거울로, 의자는 빈대떡로 이런식으로 모든것에 대한 이름을 바꾸었다. 세월이 흘러 그사람은 자신이 이름붙인것에 익숙해 졌다. 어느날 그가 외출을 했을때 그는 세상 사람이 미친것만 같았다. 왜냐 하면 거울을 책상이라고 부르고, 세상에나 빈대떡보고 의자라고 불렀다. 그 는 세상사람들이 모두미쳤다고 생각하면 집으로 돌아와서 영원히 집에서 나 오지 안았다. 이제 생각해보자 언어에서 정의가 얼마나 중요한것인가! 우선 정의와선언에 대하여 먼제 알아보자. 소유냐 존재냐란 책을 상기해보자(안읽었다고 해도 상관없다) 여기서 소유 의 표현은 "나는 컴퓨터를 가지고있다"라고 한다. 하지만 존재표현으로는 "나는 컴퓨터가 있다."이다. 이두가지의 차이점은 존재하는 상태(있다, 없다) 가 아니라 관점의 차이에 있다. 이미 존재하는 것을 관점에 따라 다르게 표 현한다. 정의는 선언과 같다. 왜냐하면 정의는 존재하는 것을 대상으로 하기 때문이 다. 그러나 선언은 정의와 같지 않다. 선언은 존재하는 사물에 다른 관점이 다(헛갈리죠, 나도 알아요). 상상력을 동원해보자.
질문 : 모스크바에 가본적이 있는가?
답 : 없다.
질문 : 그렇다면 모스크바가 존재한다고 믿는가?
답 : 그렇다.
질문 : 그럼 모스크바가 존재하는 것을 어떻게 아는가?
답 : 여러 가지 사실로 지도, 다녀온사람등
질문 : 그렇다면 귀신은 존재하는가?
답 : 확실하지 않다.
질문 : 귀신을 본사람이 있다면 어떻게 생각하는가?
답 : 내가 보지 못한건 믿을수 없다.
질문 : 모스크바와 귀신의 차이점은 무엇인가?
답 : ......
모스크바의 믿음과 귀신의 불신의 차이는 무엇인가. 과학적인것과 비과학적 인 것의 차이는 화학과 연금술의 차이이다. 과학은 비과학적인 곳에서 출발 해서 과학적인곳으로 발전해왔다. 정의와 선언을 설명하는데 모스크바와 귀 신이 무엇을 말하겠는가?
아버지 어머니 형 나 동생 <------ 모두 존재한다(정의)
│ │ │ │ │
└───┴┬─┴─┴──┘
│
가족 <------ 존재에 대한 관계(선언)
<도표 2.1.1>
아버지, 어머니, 형, 나, 동생은 분명히 존재하는 것이다. 즉 정의(존재)가 되 어있다. 그러나 가족은 선언(소유)되어 있다. 왜 가족이 선언된 것이 냐고 그것은 아버지, 어머니, 형, 나, 동생의 관계를 나타낸 것이기 때문이다. 가 족이란 항상 같지가 않다. 형제가 한명일 수 도 있고, 열명일수도 있지 않은 가! - 존재 하는 대상의 이름붙임은 정의다. - 관계나 다른이름(관계는 형이지만 형도 자신의 이름이 있다.)를 나타내는 것들은 선언이다. 자 여러분이 C++에 관심이 있다면 필자의 설명에서 C++에서의 객체와 연 관성이 있어보이지 않는가? 그렇다. C++에서의 객체는 정의(존재)에 대한 선언(소유)이다. 이것이 C++, 객체지향의 열쇠이다. C++어렵고 힘들어 보이 는가? 그것은 당신에게 정의와 선언에 관한 명확한 이해가 없기 때문이다. C++에관심이 있는 사람을 위해 약간의 힌트만 주겠다.
class family
{
// 가족 선언
private:
int 아버지; // 정의
int 어머니;
int 형;
int 나;
int 동생;
int 초인종단추상태;
public:
family(주소); // 생성자
int 누가집에있는가(void); // 행동양식 선언(따로정의된다).
int 특정인불러내기(int 가족);
void 초인종(int 초인종단추상태){ return 초인종단추상태 };
// 행동양식 정의(inline)
~family(주소); //<--- 소멸자
}
*** inline 이포함된 문장은 선언(이름붙임)과 동시에 정의된 것이다. 왜그런가? 선언은 지금처럼 관계와 그속에 관련된것의 이름붙임 이고 정의란 그것이 실제하게 만드는것이다. 선언된것이 언제 정의되는가? 간단한다! family myfamily;라고 정의 하면서부터 존재하게 되는것이다. 우리가 새집으로 이상왔다(생성자 호출). 누가 초인총을 눌렀다(초인종 함수호출). 집에 누가 있나(누가집에있나 함수 호출 하면 집에 있는사람이 나올거이 아 닌가)? 동생을 찾아 왔다고(특정인불러내기 함수를 통해서 불러낸다)! 나오면 같이 놀러가고 없다면 그냥 돌아가면 되지 았겠는가!! 형이 결혼 했다(클래스를 파생시켜서 새로운 클라스를 추가하면 된다. 상속 성이라 한다). class newfamily: public family
{
private:
int 형수;
public:
int 남편(int 형);
}
이제 형수는 우리집에 한식구다. 그리고 새로운 가족이 됐다. 그리고 마지막으로 우린 이사를 갔다(소멸자). 간단하지만 이해하기 쉽지 안은가!! 정의와 선언을 중요한 문제로 생각하는 것은 모호하게 이해하지 말라는 것 이다. A, B사이에서 서로의 유사점 때문에 둘사이를 오해하면 곤란하다. A 에대한 생각과 B에대한 생각 그리고 모호점에 대한 생각 이렇게 세가지로 명확하게 나누어서 생각해야 한다.
2.1.2 앞뒤구분하기
프로그램을 작성할때 먼저해야 할것이 있고 나중에 해야 할것이 있다. 선언, 정의부분도 있고 변수의 선언, 정의 함수의 선언, 정의도 있다. 이런한 것을 명확하게 구분짓지 못한다면 나중에 후회(잘못하면 처음부터 다시만들어야 한다)를 하게 될 것이다. 추가해야할것이나 빼버려야 할부분이 생겼을때 어 떻게 해야 할지 모르는 상태로 빠져들어가 버린다. 자칫실수하면 프로그램 전체에 영향을 미치게 된다. 프로그램이란 조화와 균형이다. 프로그램이란 무작정시작하면 결과를 보기 어렵다. 예를들어 보라고!!!! 작은 프로그램이라 면 별로 걱정할것이 없다. 그러나 많은자료를 다루어야 한다면 심각한 문제 를 발생할 수 있다. 배열의 크기가 2000000만byte 정도 필요한 상황에 놓일 지도 모른다. 그것도 한자리에 몽땅모아놓고 처리하지 않으면 안되는 상황 이 발생할 수도 있다(사실 지금 내가 만들고 있는 프로그램이 그렇다) 이것 은 심각한 문제를 일으킨다. 처음에 미리 충분히 생각하지 안았다면 골치깨 나 썩이게 될것이다. 여러분이 소스(source)를 가지고 그속에서 무엇인가 좋은 것들을 찾으려고 하는데 설명문은 거의 없고 명령만 나열된 상되있다면 여러분은 제대로 파 악할 수 있을까? 훌륭한 코드(code)는 설명문이 필요 없다지만 이 것을 읽 고 있는 여러분이 그 정도로 경험이 많은가? 여러분이 프로그램 소스 (source)를 분석하기 전에 해야 할일은 결과를 예측하는 것이다. 결과를 예 측하면 그 소스에서 가장 중요한 부분과 그렇지 못한 부분을 찾아낼 수 있 다. 앞뒤을 구분한다는 결과를 먼저 예측하고 분석을 하는 것이다. 다른말로 하면 전체를 생각하면서 세부적인 것을 분석하라는 것이다. 사실 초보자가 프로그램 소스를 분석할때 대부분은 명령어를 따라다니는 방법에 의존한다. 그러나 그런식으로 파악을 하기가 매우 어렵다. 당신이 먼저해야 할일은 변 수부터 파악하는 일이다. 프로그램의 흐름을 결정하는 것은 명령이 아니라 변수다(이것에 대한 자세한 것은 다음편 변수론에서 나온다). 이점을 명심하 라. 필자는 계속해서 생각을 먼저 정리하고 프로그램에 들어가야 한다는 것을 말하고 있다. 이것은 단순한 이야기다. 그러나 왜이렇게 반복적으로 이야기 하는가? 그것은 당신이 계속해서 저지르는 실수(안타깝지만 필자도 종종 그 런다)이기 때문이다. 프로그램에 들어가기 전에 반드시 당신의 생각을 정리 해두지 않는다면 당신은 어디서부터 프로그램을 만들어야 할지 무엇을 먼저 만들어야 할지 언제쯤일이 끝날지 지금 무엇을 하고 있는 알수가 없는 것이 다. 먼저할일 나중에 할일 이것부터 구별할줄 알아야 하기 때문이다. 난 초 보자라서 힘들다고 힘들다고 화장실에 안가는가? 힘들어서 莪?못먹는가? 힘들어도 해야 한다. 이것을 못한다면 필자가 머라고 했는가!!!!! 컴퓨터를 보자기에 싸서 깊은 산속에다 모셔두고 게임기나 사서 제미나게 놀자.
2.1.3 구조화가 뭐지
프로그램의 구조화는 고급언어로 갈수록 중요한 문제가 되고 있다. 프로그 래머가 좀더 효율적으로 프로그램 소스를 인식할 수 있도록 하기 위한 방법 이 필요해 졌고 그래서 도입된 것이 구조화 프로그래밍이다. C언어를 배우기전에 여러분은 순수하게 프로그래밍이 무엇인가를 생각하여 야 한다. 벽돌공장 공장장이 벽돌답을 잘쌓는 것이 아니다. 벽돌공장 공장장 에게 우리집의 담을 쌓아 달라고는 할 수 없다. 그는 벽돌을 만들뿐이다. 프 로그래밍을 어떻게 해야 하는지 생각하지 못한다면 C언어에 대하여 아무리 자세하게 설명해도 여러분은 이해하기 힘들 것이다. 언어의 구조화는 일정 한 형태(이것을 template라한다)를 가지고 있다. 그러나 그것은 언어적인 문 제이고 당신의 생각은 어떻한가? 먼저 당신의 생각부터 구조화하여야 한다. 왜그러냐고? 당신 생각이 정리 되지 안았는데 어떻게 프로그램을 작성할 것 인가. 반딧불같은 생각을 자꾸하다가 보면 백열등같이 밝아지고 나중에는 태양같 이 밝아질 것이다. 생각이란 그런 것이다. 하면 할 수 록 살이 붙어 나간다. 여러분이 생각을 할때 명확하게 구조를 정하지 않는다면 나중에는 더이상 생각할 수 없는 상태로 나아간다. 생각을 일정한 규칙에 마추지 못한다면 (그것에 대해서는 두번째강의 마지막에서 이야기 했다)더이상 전진 하지말 라. 구조화란 규칙속에서 자유로움을 찾는 것이다. 생각을 구조화 하지 않는 다면 프로그램도 구조화될수 없다. 왜냐하면 구조화란 언어의 문제가 보다 도 사람의 문제 이기 때문이다. C가 구조화된 언어라고 아니다. 얼마든지 구조화되지 못하게 만들수 있다. 그렇게 만드는건 바로 당신이다. 프로그램을 만드는건 미래예측과 비슷하다. 미래란 선택에의해 자꾸움직이 는 것이라서 처음 생각했던 것이 완성하고 나면 다른 모습으로 변해있을 지 도 모른다. 그런식으로 완성된 프로그램은 처음 생각보다 좋을 수도 있지만 대부분은 그렇지 못하다. 처음 생각했던 위대했던 모습을 잊지 말자.
2.1.4 프로그램을 느끼자.
자이제 설명이 지루해져가고 있을 것이다. 당연하다. 필자는 오로지 한가지 만 끈질기게 강요하고 있으니까!!!!!! 그러나 그것은 매우 중요하기 때문이 다. 언어를 배우는것보다 더중요하다. 남태평양의 어느 섬나라에서는 길을 다듬어 활주로처럼 만들고 그 활주로 양옆을 따라 불을 피우고, 관제탑처럼 생긴 단을 쌓고 그위에 올라가 안테 나처럼 막대를 머리에 꼽은 사람이 하늘을 보며 비행기가 착륙하길 기다린 다. 이섬은 전쟁중에 군수기지였고 비행기가 매일뜨고 내렸다. 비행기가 내 릴때마다 엄청난 물건들이 내려졌다. 섬사람들은 그 모습을 흉내내는 것이 다. 마치 비향기가 다시 와서 그들이 원하는 것을 물건을 무한정 내려주길 바라고 있는 것이다. 그 행위자체는 완벽하다. 그러나 가장 중요한 것이 빠 졌다는 것을 외면 한다. 어쩌면 우리는 모두 남태평양의 사람처럼 책을 사 고 컴퓨터 앞에 가만히 앉아서 훌륭한 프로그래머가 되기를 기원하는지도 모른다. 오지 안는 비행기를 기다릴것인가 아니면 직접 날아볼것인가 여러분의 선택 이다. 프로그램을 작성하는건 기술이다. 그러나 생각하는 것은 기술이 아니라 느 끼는 것이다. 컴퓨터를 사용하다가 많은 자료를 잃어버려 느낀불편을 프로 그램으로 만들어 유명해진 사람도 있고 미식축구자료를 관리하려고 DATA BASE 프로그램을 만들어 유명해진 사람도 있다. 프로그램이란 편한 느낌을 주는 것이 최고다. 즉 사용하기 편리하고 간단하면 간단 할 수 록 좋은 것 이다. 지금은 안그렇지만 옛날에 프로그램을 작성할때 프로그래머 마음대로 일때가 있었다. 프로그램이란 프로그래머 마음대로 만드는 것 아니다. 프로 그램을 쓰는 사람을 위해 만드는 것이다. 이점이 바로 좋은 프로그램인가 나쁜 프로그램인가를 결정짓는 근거가된다. 기능이 아무리 훌륭해도 사용하 기 불편하다면 좋은 프로그램이 아니다. 당신은 잘 사용할 수 있겠지만 그 건 당신 생각일뿐이다. 보편적인 보통사람을 위한것일때 우린 좀더 신중해 져야 한다.
2.1.5 프로그램 언어의 흐름
컴퓨터는 흐름을 따라 움직인다. 이것을 알고리즘이라 부르든 그것은 중요 치 않다. 지금 중요한 것은 이제 프로그램언어를 배워야 할때가 왔다는 것 이다. 몰론 나머지부분도 이해해야 한다. 지금은 돌아가는 길처럼 보일지도 모르지만 지금 가는 길이 바로 지름길이기 때문이다. 나는 컴호텔 주인입니다. 컴호텔은 1층부터 5층까지 각층마다 5개의 방이 있습니다. 우리호텔에는 귀도 잘안들리고 말도 잘못하며 머리도 안좋아서 한번에 한가 지씩만 할줄 아는 일꾼이 있습니다. 내가 그사람에게 일을 시키는 방법은 간단합니다. 각방문마다 毛樗獵?게시판에 그사람이 해야 할일을 적어놓고 다닙니다. 그사람은 그것을 읽어보고 그방에서 해야할일을 하죠. 그는 항상 1층 1번방부터 찾아갑니다. 거기에는 두장의 메모지가 순서대로 붙어있죠 첫번째것은 "침대를 정리 할 것" 두번째는 "1층 3번방으로 갈것" 그는 순대대로 일을 처리하고 층 3번방으로 갔죠 거기에는 "침대정리", "화 장실청소" "2층 4번방으로" 그는 순서대로 일을 하고 2층4번 방으로 갔는데 거기는 "휴지통을 버릴 것", "4층 1번방으로"그는 일을 하고 4층1번방으로 갔는데 거기는 "3층 2번방에 갔가올 것 이모메지만 떼버릴것", "침대정리" " 5층 3번방으로" 그는 우서 3층2번 방으로 가서을 일을 하고 다시 돌아 왔 죠. 그리고는 일을 하고 5층 3번방으로 갔습니다. 거기에는 "손님확인 있으 면 돌아가서 쉴 것 없으면 다음메모지를 읽을 것" "TV를 4층2번방으로" 그 방에는 손님이 없어서 TV를 들고 4층 2번방으로 갔죠. "TV를 선반에 올려 놓고 돌아가서 쉴 것"





