블로그 이미지
Every unexpected event is a path to learning for you.

카테고리

분류 전체보기 (2738)
Unity3D (817)
Programming (475)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (228)
협업 (58)
3DS Max (3)
Game (12)
Utility (136)
Etc (96)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (53)
Android (14)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (18)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday
05-01 09:15



출처 : 허성도 서울대학교 중어중문학과 교수의 강연 녹취록

           사단법인 한국엔지니어클럽
           일 시: 2010년 6

월 17일 (목) 오전 7시 30분
           장 소: 서울특별시 강남구 테헤란로 521 그랜드 인터컨티넨탈 호텔 2층 국화룸


(인터넷에 꽤 많은 펌글들이 검색이 되는 바, 처음 인터넷에 게재된 곳이 어디인지 출처를 알 수 없게 되었습니다. )

 


저는 지난 6월 10일 오후 5시 1분에 컴퓨터를 뚫어지게 바라보고 있었습니다.

우리 나로호가 성공하기를 바라는 마음이 여기에 계신 어르신들도 크셨겠지만 저도 엄청나게 컸습니다. 그런데 대략 6시쯤에 실패했다는 이야기가 나오고 7시에 거의 그것이 확정되었습니다. 저는 성공을 너무너무 간절히 바랐습니다.
그날 연구실을 나오면서 이러한 생각으로 정리를 했습니다. 제가 그날 서운하고 속상했던 것은 나로호의 실패에도 있었지만 행여라도 나로호를 만들었던 과학자, 기술자들이 실망하지 않았을까 그분들이 의기소침하지 않았을까 그것이 더 가슴 아팠습니다. 그분들이 용기를 잃지 않고 더 일할 수 있기를 바라는 심정으로 어떻게 이것을 학생들에게 말해 주고 그분들에게 전해 줄까 하다가 그로부터 얼마 전에 이런 글을 하나 봤습니다.

1600년대에 프랑스에 라 포슈푸코라는 학자가 있었는데 그 학자가 이런 말을 했습니다.
‘촛불은 바람이 불면 꺼진다. 그러나 큰 불은 바람이 불면 활활 타오른다.’라는 말을 했습니다. 저는 우리의 우주에 대한 의지가 강열하다면 또 우리 연구자, 과학자들의 의지가 강열하다면 나로호의 실패가 더 큰 불이 되어서 그 바람이 더 큰 불을 만나서 활활 타오르기를 진심으로 기대합니다.

○ 그런데 이 나로호 말씀을 드리는 이유는 이러한 것도 바로 우리의 역사와 연관이 되어 있기 때문입니다. 이 실패가 사실은 너무도 당연하고 우리가 러시아의 신세를 지는 것을 국민이 부끄러움으로 여기지만 그것이 너무나도 당연하다는 것을 역사는 말해 주고 있습니다.

-1957 년입니다. 제가 초등학교 2학년 때 소련이 스푸트니크 1호라고 하는 인공위성을 발사했습니다. 그 충격은 대단했다고 하는데, 초등학교 학생인 저도 충격을 엄청나게 많이 받았습니다. 그러고 나서 미국이 깜짝 놀랐습니다. 그리고 뱅가드호를 발사했는데 뱅가드호는 지상 2m에서 폭발했습니다. 이것을 실패하고 미국이 본격적인 조사에 착수했습니다. 왜 소련은 성공하고 우리는 실패했는가, 그 연구보고서의 맨 마지막 페이지는 이렇게 끝이 나 있습니다.
‘우리나라(미국)가 중학교, 고등학교의 수학 교과과정을 바꿔야 한다.’ 아마 연세 드신 분들은 다 기억하실 것입니다.

그런데 사실은 소련이 스푸트니크 1호를 발사한 것도 독일 과학자들의 힘이었다는 것을 아실 것입니다. 미국이 뱅가드호를 실패하고 그 다음에 머큐리, 재미니, 여러분들이 아시는 아폴로계획에 의해서 우주사업이 성공했습니다. 그런데 그것도 미국의 힘이 아니라 폰 브라운이라고 하는 독일 미사일기술자를 데려다가 개발했다는 것도 여러분이 아실 것입니다.

○ 중국은 어떻게 되냐면 여기는 과학자들이니까 전학삼(錢學森)이라는 이름을 기억하실 텐데요, 전학삼은 상해 교통대학을 졸업하고 미국에 유학을 가서 캘리포니아에 공과대학에서 29살에 박사학위를 받고 캘리포니아 공과대학 교수를, 2차대전 때 미국 국방과학위원회의 미사일팀장을, 그리고 독일의 미사일기지 조사위원회 위원장을 했습니다. 미국에서는 핵심기술자입니다.

그런데 이 전학삼이라는 인물이1950년에 미사일에 관한 기밀문서를 가지고 중국으로 귀국하려다가 이민국에 적발되었습니다. 그래서 간첩혐의로 구금이 되었고 그때 미국에서는 ‘미국에 귀화해라. 미국에 귀화하면 너는 여기서 마음껏 연구할 수 있다.’라고 이야기했고 전학삼은 그것을 거절하고 있었습니다. 중국에서는 모택동이 미국 정부에 전학삼을 보내달라고 했습니다.

그런데 미국이 이 말을 들을 수밖에 없었던 것은 그때 중국 정부는 미국인 스파이를 하나 구속하고 있었고, 이 둘을 1 대 1로 교환하자고 그랬어요. 그런데 미국이 그 이야기를 들어주면서 전학삼에게 ‘마지막 기회를 주겠다, 우리는 너와 우리의 스파이를 교환하지만 네가 미국에 귀화한다면 너는 여기 있을 수 있다.’ 그랬더니 전학삼은 가겠다고 했어요. 그러니까 미국에서 전학삼에게 ‘너는 중국에 가더라도 책 한 권, 노트 한 권, 메모지 한 장도 가져갈 수 없다, 맨몸으로만 가라.’
그래도 전학삼은 가겠다고 했습니다.

나이 마흔여섯에 중국에 가서 모택동을 만났습니다. 여기서부터는 일화입니다.
모택동이 ‘우리도 인공위성을 쏘고 싶다, 할 수 있느냐.’ 그랬더니 전학삼이 이렇게 말했다고 합니다.
‘내가 그것을 해낼 수 있다. 그런데 5년은 기초과학만 가르칠 것이다. 그 다음 5년은 응용과학만 가르친다. 그리고 그 다음 5년은 실제 기계제작에 들어가면 15년 후에 발사할 수 있다. 그러니까 나에게 그동안의 성과가 어떠하냐 등의 말을 절대 15년 이내에는 하지 마라. 그리고 인재들과 돈만 다오. 15년 동안 나에게 어떠한 성과에 관한 질문도 하지 않는다면 15년 후에는 발사할 수 있다.’ 이렇게 대답했습니다.

모택동이 그것을 들어 주었습니다. 그래서 인재와 돈을 대주고 15년 동안은 전학삼에게 아무것도 묻지 말라는 명령을 내려 놓고 있었습니다.
그리고 이 사람 나이 61세, 1970년 4월에 중국이 인공위성 발사에 성공했습니다. 그리고 중국 정부가 이 모든 발사제작의 책임자가 전학삼이라는 것을 공식 확인해 주었습니다.
이렇게 보면 오늘날 중국의 우주과학 이러한 것도 전부 전학삼에서 나왔는데 그것도 결국은 미국의 기술입니다. 미국은 독일의 기술이고 소련도 독일의 기술입니다. 저는 이런 이야기를 하면서 우리가 러시아의 신세를 지는 것은 부끄러운 일이 아니다. 선진국도 다 그랬다는 말씀을 드리고자 합니다.

◈ 한국역사의 특수성

○ 미국이 우주과학을 발전시키기 위해서 중·고등학교의 수학 교과과정을 바꾸었다면 우리는 우리를 알기 위해서 무엇을 해야 하는가, 결론은 그것 입니다.

-역사를 보는 방법도 대단히 다양한데요. 우리는 초등학교 때 이렇게 배웠습니다.
‘조선은 500년 만에 망했다.’ 아마 이 가운데서 초등학교 때 공부 잘하신 분들은 이걸 기억하실 것입니다. 500년 만에 조선이 망한 이유 4가지를 달달 외우게 만들었습니다. 기억나십니까?
“사색당쟁, 대원군의 쇄국정책, 성리학의 공리공론, 반상제도 등 4가지 때문에 망했다.” 이렇게 가르칩니다. 그러면 대한민국 청소년들은 어떻게 생각하느냐 하면
‘아, 우리는 500년 만에 망한 민족이구나, 그것도 기분 나쁘게 일본에게 망했구나.’ 하는 참담한 심정을 갖게 되어 있습니다.

그런데 아까 나로호의 실패를 중국, 미국, 소련 등 다른 나라에 비추어 보듯이 우리 역사도 다른 나라에 비추어 보아야 됩니다.
조선이 건국된 것이 1392년이고 한일합방이 1910년입니다. 금년이 2010년이니까 한일합방 된 지 딱 100년이 되는 해입니다. 그러면 1392년부터 1910년까지 세계 역사를 놓고 볼 때 다른 나라 왕조는 600년, 700년, 1,000년 가고 조선만 500년 만에 망했으면 왜 조선은 500년 만에 망했는가 그 망한 이유를 찾는 것이 맞을 것입니다. 그런데 만약 다른 나라에는 500년을 간 왕조가 그 당시에 하나도 없고 조선만 500년 갔으면 어떻게 하겠습니까?

조선은 어떻게 해서 500년이나 갔을까 이것을 따지는 것이 맞을 것입니다.

-1300 년대의 역사 구도를 여러분이 놓고 보시면 전 세계에서 500년 간 왕조는 실제로 하나도 없습니다. 서구에서는 어떻게 됐느냐면, 신성로마제국이 1,200년째 계속되고 있었는데 그것은 제국이지 왕조가 아닙니다. 오스만투르크가 600년째 계속 되고 있었습니다. 그런데 그것도 제국이지 왕조는 아닙니다. 유일하게 500년 간 왕조가 하나 있습니다. 에스파냐왕국입니다. 그 나라가 500년째 가고 있었는데 불행히도 에스파냐왕국은 한 집권체가 500년을 지배한 것이 아닙니다.
예를 들면 나폴레옹이 ‘어, 이 녀석들이 말을 안 들어, 이거 안 되겠다. 형님, 에스파냐 가서 왕 좀 하세요.’ 그래서 나폴레옹의 형인 조셉 보나파르트가 에스파냐에 가서 왕을 했습니다. 이렇게 왔다 갔다 한 집권체이지 단일한 집권체가 500년 가지 못했습니다.

전세계에서 단일한 집권체가 518년째 가고 있는 것은 조선 딱 한 나라 이외에는 하나도 없습니다.

-그러면 잠깐 위로 올라가 볼까요.
고려가 500년 갔습니다. 통일신라가 1,000년 갔습니다. 고구려가 700년 갔습니다. 백제가 700년 갔습니다. 신라가 BC 57년에 건국됐으니까 BC 57년 이후에 세계 왕조를 보면 500년 간 왕조가 딱 두 개 있습니다. 러시아의 이름도 없는 왕조가 하나 있고 동남 아시아에 하나가 있습니다. 그 외에는 500년 간 왕조가 하나도 없습니다. 그러니까 통일신라처럼 1,000년 간 왕조도 당연히 하나도 없습니다. 고구려, 백제만큼 700년 간 왕조도 당연히 하나도 없습니다.
제가 지금 말씀드린 것은 과학입니다.

-그러면 이 나라는 엄청나게 신기한 나라입니다. 한 왕조가 세워지면 500년, 700년, 1,000년을 갔습니다. 왜 그럴까요? 그럴려면 두 가지 조건 중에 하나가 성립해야 합니다.
하나는 우리 선조가 몽땅 바보다, 그래서 권력자들, 힘 있는 자들이 시키면 무조건 굴종했다, 그러면 세계 역사상 유례없이 500년, 700년, 1,000년 갔을 것입니다. 그런데 우리 선조들이 바보가 아니었다, 인간으로서의 권리를 주장하고 다시 말씀드리면 인권에 관한 의식이 있고 심지어는 국가의 주인이라고 하는 의식이 있다면, 또 잘 대드는 성격이 있다면, 최소한도의 정치적인 합리성, 최소한도의 경제적인 합리성, 조세적인 합리성, 법적인 합리성, 문화의 합리성 이러한 것들이 있지 않으면 전 세계 역사상 유례없는 이러한 장기간의 통치가 불가능할 것이라고 말씀드릴 수 있습니다.

◈ 기록의 정신

○ "조선왕조실록(朝鮮王朝實錄)"을 보면 25년에 한 번씩 민란이 일어납니다.

여러분이 아시는 동학란이나 이런 것은 전국적인 규모이고, 이 민란은 요새 말로 하면 대규모의 데모에 해당합니다. 우리는 상소제도를 가지고 있었습니다. 백성들이, 기생도 노비도 글만 쓸 수 있으면 ‘왕과 나는 직접 소통해야겠다, 관찰사와 이야기하니까 되지를 않는다.’ 왕한테 편지를 보냅니다. 그런데 이런 상소제도에 불만을 가진 사람들이 생겨났습니다. 왜? 편지를 하려면 한문 꽤나 써야 되잖아요. ‘그럼 글 쓰는 사람만 다냐, 글 모르면 어떻게 하느냐’ 그렇게 해서 나중에는 언문상소를 허락해 주었습니다.

그래도 불만 있는 사람들이 나타났습니다. ‘그래도 글줄 깨나 해야 왕하고 소통하느냐, 나도 하고 싶다’ 이런 불만이 터져 나오니까 신문고를 설치했습니다. ‘그럼 와서 북을 쳐라’ 그러면 형조의 당직관리가 와서 구두로 말을 듣고 구두로 왕에게 보고했습니다. 이래도 또 불만이 터져 나왔습니다. 여러분, 신문고를 왕궁 옆에 매달아 놨거든요. 그러니까 지방 사람들이 뭐라고 했냐면 ‘왜 한양 땅에 사는 사람들만 그걸하게 만들었느냐, 우리는 뭐냐’ 이렇게 된 겁니다. 그래서 격쟁(?錚)이라는 제도가 생겼습니다. 격은 칠격(?)자이고 쟁은 꽹과리 쟁(錚)자입니다. 왕이 지방에 행차를 하면 꽹과리나 징을 쳐라. 혹은 대형 플래카드를 만들어서 흔들어라, 그럼 왕이 ‘무슨 일이냐’ 하고 물어봐서 민원을 해결해 주었습니다. 이것을 격쟁이라고 합니다.

○ 우리는 이러한 제도가 흔히 형식적인 제도겠지 라고 생각하지만 그게 아닙니다.
예를 들어 정조의 행적을 조사해 보면, 정조가 왕 노릇을 한 것이 24년입니다. 24년 동안 상소, 신문고, 격쟁을 해결한 건수가 5,000건 입니다. 이것을 제위 연수를 편의상 25년으로 나누어보면 매년 200건을 해결했다는 얘기이고 공식 근무일수로 따져보면 매일 1건 이상을 했다는 것입니다.

영조 같은 왕은 백성들이 너무나 왕을 직접 만나고 싶어 하니까 아예 날짜를 정하고 장소를 정해서 ‘여기에 모이시오.’ 해서 정기적으로 백성들을 만났습니다. 여러분, 서양의 왕 가운데 이런 왕 보셨습니까? 이것이 무엇을 말하느냐면 이 나라 백성들은 그렇게 안 해주면 통치할 수 없으니까 이러한 제도가 생겼다고 봐야 합니다.
그러면 이 나라 국민들은 바보가 아닙니다. 그렇게 보면 아까 말씀 드린 두 가지 사항 가운데 후자에 해당합니다. 이 나라 백성들은 만만한 백성이 아니다. 그러면 최소한도의 합리성이 있었을 것이다. 그 합리성이 무엇인가 하는 것을 오늘 말씀 드리고자 합니다.

-첫째는 조금 김새시겠지만 기록의 문화입니다.여러분이 이집트에 가 보시면, 저는 못 가봤지만 스핑크스가 있습니다. 그걸 딱 보면 어떠한 생각을 할까요? 중국에 가면 만리장성이 있습니다. 아마도 여기 계신 분들은 거의 다 이런 생각을 하셨을 것입니다. ‘이집트 사람, 중국 사람들은 재수도 좋다, 좋은 선조 만나서 가만히 있어도 세계의 관광달러가 모이는 구나’
여기에 석굴암을 딱 가져다 놓으면 좁쌀보다 작습니다. 우리는 뭐냐. 이런 생각을 하셨지요? 저도 많이 했습니다. 그런데 역사에 관심을 가지고 있다 보니까 그러한 유적이 우리에게 없는 것이 얼마나 다행인가 싶습니다. 베르사유의 궁전같이 호화찬란한 궁전이 없는 것이 얼마나 다행인가 싶습니다.

여러분, 만약 조선시대에 어떤 왕이 등극을 해서 피라미드 짓는 데 30만 명 동원해서 20년 걸렸다고 가정을 해보죠. 그 왕이 ‘국민 여러분, 조선백성 여러분, 내가 죽으면 피라미드에 들어가고 싶습니다. 그러니 여러분의 자제 청·장년 30만 명을 동원해서 한 20년 노역을 시켜야겠으니 조선백성 여러분, 양해하시오.’
그랬으면 무슨 일이 났을 것 같습니까? ‘마마, 마마가 나가시옵소서.’ 이렇게 되지 조선백성들이 20년 동안 그걸 하고 앉아있습니까? 안 하지요. 그러니까 우리에게는 그러한 문화적 유적이 남아 있을 수 없습니다. 만일 어떤 왕이 베르사유궁전 같은 것을 지으려고 했으면 무슨 일이 났겠습니까. ‘당신이 나가시오, 우리는 그런 것을 지을 생각이 없소.’ 이것이 정상적일 것입니다. 그러니까 우리에게는 그러한 유적이 있을 수가 없습니다.

-대신에 무엇을 남겨 주었느냐면 기록을 남겨주었습니다. 여기에 왕이 있다면, 바로 곁에 사관이 있습니다.
여러분, 이렇게 생각하시면 간단합니다. 여러분께서 아침에 출근을 딱 하시면, 어떠한 젊은이가 하나 달라붙습니다. 그래서 여러분이 하시는 말을 다 적고, 여러분이 만나는 사람을 다 적고, 둘이 대화한 것을 다 적고, 왕이 혼자 있으면 혼자 있다, 언제 화장실 갔으면 화장실 갔다는 것도 다 적고, 그것을 오늘 적고, 내일도 적고, 다음 달에도 적고 돌아가신 날 아침까지 적습니다. 기분이 어떠실 것 같습니까?
공식근무 중 사관이 없이는 왕은 그 누구도 독대할 수 없다고 경국대전에 적혀 있습니다. 우리가 사극에서 살살 간신배 만나고 장희빈 살살 만나고 하는 것은 다 거짓말입니다. 왕은 공식근무 중 사관이 없이는 누구도 만날 수 없게 되어 있습니다.

심지어 인조 같은 왕은 너무 사관이 사사건건 자기를 쫓아다니는 것이 싫으니까 어떤 날 대신들에게 ‘내일은 저 방으로 와, 저 방에서 회의할 거야.’ 그러고 도망갔습니다. 거기서 회의를 하고 있었는데 사관이 마마를 놓쳤습니다. 어디 계시냐 하다가 지필묵을 싸들고 그 방에 들어갔습니다. 인조가 ‘공식적인 자리가 아닌 데서 회의를 하는데도 사관이 와야 되는가?’ 그러니까 사관이 이렇게 말했습니다. ‘마마, 조선의 국법에는 마마가 계신 곳에는 사관이 있게 되어 있습니다.’ 그리고 적었습니다.
너무 그 사관이 괘씸해서 다른 죄목을 걸어서 귀향을 보냈습니다. 그러니까 다음 날 다른 사관이 와서 또 적었습니다. 이렇게 500년을 적었습니다.

사관은 종7품에서 종9품 사이입니다. 오늘날 대한민국의 공무원제도에 비교를 해보면 아무리 높아도 사무관을 넘지 않습니다. 그러한 사람이 왕을 사사건건 따라 다니며 다 적습니다. 이걸 500년을 적는데, 어떻게 했냐면 한문으로 써야 하니까 막 흘려 썼을 것 아닙니까? 그날 저녁에 집에 와서 정서를 했습니다. 이걸 사초라고 합니다.
그러다가 왕이 돌아가시면 한 달 이내, 이것이 중요합니다. 한 달 이내에 요새 말로 하면 왕조실록 편찬위원회를 구성합니다. 사관도 잘못 쓸 수 있잖아요. 그러니까 ‘영의정, 이러한 말 한 사실이 있소? 이러한 행동한 적이 있소?’ 확인합니다. 그렇게 해서 즉시 출판합니다. 4부를 출판했습니다. 4부를 찍기 위해서 목판활자, 나중에는 금속활자본을 만들었습니다.

여러분, 4부를 찍기 위해서 활자본을 만드는 것이 경제적입니까, 사람이 쓰는 것이 경제적입니까? 쓰는 게 경제적이지요. 그런데 왜 활판인쇄를 했느냐면 사람이 쓰면 글자 하나 빼먹을 수 있습니다. 글자 하나 잘못 쓸 수 있습니다. 하나 더 쓸 수 있습니다. 이렇게 해서 후손들에게 4부를 남겨주는데 사람이 쓰면 4부가 다를 수 있습니다. 그러면 후손들이 어느 것이 정본인지 알 수 없습니다. 그러니까 목판활자, 금속활자본을 만든 이유는 틀리더라도 똑같이 틀려라, 그래서 활자본을 만들었습니다.
이렇게 해서 500년 분량을 남겨주었습니다.

유네스코에서 조사를 했습니다. 왕의 옆에서 사관이 적고 그날 저녁에 정서해서 왕이 죽으면 한 달 이내에 출판 준비에 들어가서 만들어낸 역사서를 보니까 전 세계에 조선만이 이러한 기록을 가지고 있습니다. 이것이 6,400만자입니다. 6,400만자 하면 좀 적어 보이지요? 그런데 6,400만자는 1초에 1자씩 하루 4시간을 보면 11.2년 걸리는 분량입니다. 그러니까 우리나라에는 공식적으로 "조선왕조실록"을 다룬 학자는 있을 수가 없게 되어 있습니다.

-그런데 여러분, 이러한 생각 안 드세요? ‘사관도 사람인데 공정하게 역사를 기술했을까’ 이런 궁금증이 가끔 드시겠지요? 사관이 객관적이고 공정한 역사를 쓰도록 어떤 시스템을 가지고 있었는지를 말씀드리죠.
세종이 집권하고 나서 가장 보고 싶은 책이 있었습니다. 뭐냐 하면 태종실록입니다. ‘아버지의 행적을 저 사관이 어떻게 썼을까?’ 너무너무 궁금해서 태종실록을 봐야겠다고 했습니다. 맹사성이라는 신하가 나섰습니다.
‘보지 마시옵소서.’ ‘왜, 그런가.’ ‘마마께서 선대왕의 실록을 보시면 저 사관이 그것이 두려워서 객관적인 역사를 기술할 수 없습니다.’
세종이 참았습니다. 몇 년이 지났습니다. 또 보고 싶어서 환장을 했습니다. 그래서 ‘선대왕의 실록을 봐야겠다.’ 이번에는 핑계를 어떻게 댔느냐면 ‘선대왕의 실록을 봐야 그것을 거울삼아서 내가 정치를 잘할 것이 아니냐’
그랬더니 황 희 정승이 나섰습니다. ‘마마, 보지 마시옵소서.’ ‘왜, 그런가.’
‘마마께서 선대왕의 실록을 보시면 이 다음 왕도 선대왕의 실록을 보려 할 것이고 다음 왕도 선대왕의 실록을 보려할 것입니다. 그러면 저 젊은 사관이 객관적인 역사를 기술할 수 없습니다. 그러므로 마마께서도 보지 마시고 이다음 조선왕도 영원히 실록을 보지 말라는 교지를 내려주시옵소서.’ 그랬습니다.
이걸 세종이 들었겠습니까, 안 들었겠습니까? 들었습니다. ‘네 말이 맞다. 나도 영원히 안 보겠다. 그리고 조선의 왕 누구도 실록을 봐서는 안 된다’는 교지를 내렸습니다. 그래서 조선의 왕 누구도 실록을 못 보게 되어 있었습니다.

-그런데 사실은 중종은 슬쩍 봤습니다. 봤다는 기록이 남아 있습니다. 그러나 그 누구도 안보는 것이 원칙으로 되어 있었습니다.
여러분, 왕이 못 보는데 정승판서가 봅니까? 정승판서가 못 보는데 관찰사가 봅니까? 관찰사가 못 보는데 변 사또가 봅니까?
이런 사람이 못 보는데 국민이 봅니까? 여러분, 문제는 여기에 있습니다.
조선시대 그 어려운 시대에 왕의 하루하루의 그 행적을 모든 정치적인 상황을 힘들게 적어서 아무도 못 보는 역사서를 500년을 썼습니다. 누구 보라고 썼겠습니까?

대한민국 국민 보라고 썼습니다.

저는 이런 생각을 합니다. 이 땅은 영원할 것이다. 그리고 우리의 핏줄 받은 우리 민족이 이 땅에서 영원히 살아갈 것이다. 그러니까 우리의 후손들이여, 우리는 이렇게 살았으니 우리가 살았던 문화, 제도, 양식을 잘 참고해서 우리보다 더 아름답고 멋지고 강한 나라를 만들어라, 이러한 역사의식이 없다면 그 어려운 시기에 왕도 못 보고 백성도 못 보고 아무도 못 보는 그 기록을 어떻게 해서 500년이나 남겨주었겠습니까.
"조선왕조실록"은 한국인의 보물일 뿐 아니라 인류의 보물이기에, 유네스코가 세계기록문화유산으로 지정을 해 놨습니다.

○ ‘승정원일기(承政院日記)’가 있습니다. 승정원은 오늘날 말하자면 청와대비서실입니다. 사실상 최고 권력기구지요. 이 최고 권력기구가 무엇을 하냐면 ‘왕에게 올릴 보고서, 어제 받은 하명서, 또 왕에게 할 말’ 이런 것들에 대해 매일매일 회의를 했습니다. 이 일지를 500년 동안 적어 놓았습니다. 아까 실록은 그날 밤에 정서했다고 했지요. 그런데 ‘승정원일기’는 전월 분을 다음 달에 정리했습니다. 이 ‘승정원일기’를 언제까지 썼느냐면 조선이 망한 해인 1910년까지 썼습니다. 누구 보라고 써놓았겠습니까? 대한민국 국민 보라고 썼습니다. 유네스코가 조사해보니 전 세계에서 조선만이 그러한 기록을 남겨 놓았습니다. 그런데 ‘승정원일기’는 임진왜란 때 절반이 불타고 지금 288년 분량이 남아있습니다. 이게 몇 자냐 하면 2억 5,000만자입니다. 요새 국사편찬위원회에서 이것을 번역하려고 조사를 해 보니까 잘하면 앞으로 50년 후에 끝나고 못하면 80년 후에 끝납니다. 이러한 방대한 양을 남겨주었습니다. 이것이 우리의 선조입니다.

○ ‘일성록(日省錄)’이라는 책이 있습니다. 날 日자, 반성할 省자입니다. 왕들의 일기입니다. 정조가 세자 때 일기를 썼습니다. 그런데 왕이 되고 나서도 썼습니다. 선대왕이 쓰니까 그 다음 왕도 썼습니다. 선대왕이 썼으니까 손자왕도 썼습니다. 언제까지 썼느냐면 나라가 망하는 1910년까지 썼습니다.
아까 ‘조선왕조실록’은 왕들이 못 보게 했다고 말씀 드렸지요. 선대왕들이 이러한 경우에 어떻게 정치했는가를 지금 왕들이 알게 하려면 어떻게 해야 되는가를 정조가 고민해서 기왕에 쓰는 일기를 체계적, 조직적으로 썼습니다. 국방에 관한 사항, 경제에 관한 사항, 과거에 관한 사항, 교육에 관한 사항 이것을 전부 조목조목 나눠서 썼습니다.
여러분, 150년 분량의 제왕의 일기를 가진 나라를 전 세계에 가서 찾아보십시오. 저는 우리가 서양에 가면 흔히들 주눅이 드는데 이제부터는 그럴 필요 없다고 생각을 합니다.

저는 언젠가는 이루어졌으면 하는 꿈과 소망이 있습니다. 이러한 책들을 전부 한글로 번역합니다. 이 가운데 ‘조선왕조실록’은 개략적이나마 번역이 되어 있고 나머지는 손도 못 대고 있습니다. 이것을 번역하고 나면 그 다음에 영어로 하고 핀란드어로 하고 노르웨이어로 하고 덴마크어로 하고 스와힐리어로 하고 전 세계 언어로 번역합니다. 그래서 컴퓨터에 탑재한 다음날 전 세계 유수한 신문에 전면광고를 냈으면 좋겠습니다.
‘세계인 여러분, 아시아의 코리아에 150년간의 제왕의 일기가 있습니다. 288년간의 최고 권력기구인 비서실의 일기가 있습니다. 실록이 있습니다. 혹시 보시고 싶으십니까? 아래 주소를 클릭하십시오. 당신의 언어로 볼 수 있습니다.’
해서 이것을 본 세계인이 1,000만이 되고, 10억이 되고 20억이 되면 이 사람들은 코리안들을 어떻게 생각할 것 같습니까.
‘야, 이놈들 보통 놈들이 아니구나. 어떻게 이러한 기록을 남기는가, 우리나라는 뭔가.’이러한 의식을 갖게 되지 않겠습니까. 그게 뭐냐면 국격이라고 하는 것입니다. 한국이라고 하는 브랜드가 그만큼 세계에서 올라가는 것입니다. 우리의 선조들은 이러한 것을 남겨주었는데 우리가 지금 못 하고 있을 뿐입니다.

○ 이러한 기록 중에 지진에 대해 제가 조사를 해 보았습니다. '삼국사기(三國史記)'에는 지진이 87회 기록되어 있습니다. ‘삼국유사(三國遺事)’에는 3회 기록되어 있습니다. ‘고려사(高麗史)’에는 249회의 지진에 관한 기록이 있습니다. ‘조선왕조실록’에는 2,029회 나옵니다. 다 합치면 2,368회의 지진에 관한 기록이 있습니다.

우리 방폐장, 핵발전소 만들 때 이것을 참고해야 한다고 생각합니다. 이것을 통계를 내면 어느 지역에서는 155년마다 한 번씩 지진이 났었을 수 있습니다. 어느 지역은 200년마다 한 번씩 지진이 났었을 수 있습니다. 이러한 지역을 다 피해서 2000년 동안 지진이 한 번도 안 난 지역에 방폐장, 핵발전소 만드는 것이 맞을 것입니다. 이렇게 해서 방폐장, 핵발전소 만들면 세계인들이 틀림없이 산업시찰을 올 것입니다. 그러면 수력발전소도 그런 데 만들어야지요. 정문에 구리동판을 세워놓고 영어로 이렇게 썼으면 좋겠습니다.
‘우리 민족이 가진 2,000년 동안의 자료에 의하면 이 지역은 2,000년 동안 단 한번도 지진이 발생하지 않았다. 따라서 이곳에 방폐장, 핵발전소, 수력발전소를 만든다. 대한민국 국민 일동.’
이렇게 하면 전 세계인들이 이것을 보고 ‘정말 너희들은 2,000년 동안의 지진에 관한 기록이 있느냐?’고 물어볼 것이고, 제가 말씀드린 책을 카피해서 기록관에 하나 갖다 놓으면 됩니다.

이 지진의 기록도 굉장히 구체적입니다. 어떻게 기록이 되어 있느냐 하면 ‘우물가의 버드나무 잎이 흔들렸다’ 이것이 제일 약진입니다. ‘흙담에 금이 갔다, 흙담이 무너졌다, 돌담에 금이 갔다, 돌담이 무너졌다, 기왓장이 떨어졌다, 기와집이 무너졌다‘ 이렇게 되어 있습니다.
현재 지진공학회에서는 이것을 가지고 리히터 규모로 계산을 해 내고 있습니다. 대략 강진만 뽑아보니까 통일신라 이전까지 11회 강진이 있었고 고려시대에는 11회 강진이, 조선시대에는 26회의 강진이 있었습니다. 합치면 우리는 2,000년 동안 48회의 강진이 이 땅에 있었습니다.
이러한 것을 계산할 수 있는 자료를 신기하게도 선조들은 우리에게 남겨주었습니다.

◈ 정치, 경제적 문제

○ 그 다음에 조세에 관한 사항을 보시겠습니다.

세종이 집권을 하니 농민들이 토지세 제도에 불만이 많다는 상소가 계속 올라옵니다. 세종이 말을 합니다.
‘왜 이런 일이 나는가?’ 신하들이 ‘사실은 고려 말에 이 토지세 제도가 문란했는데 아직까지 개정이 안 되었습니다.’
세종의 리더십은 ‘즉시 명령하여 옳은 일이라면 현장에서 해결 한다’는 입장입니다. 그래서 개정안이 완성되었습니다. 세종12년 3월에 세종이 조정회의에 걸었지만 조정회의에서 부결되었습니다. 왜 부결 되었냐면 ‘마마, 수정안이 원래의 현행안보다 농민들에게 유리한 것은 틀림없습니다. 그러나 농민들이 좋아할지 안 좋아할지 우리는 모릅니다.’ 이렇게 됐어요. ‘그러면 어떻게 하자는 말이냐’ 하다가 기발한 의견이 나왔어요.
‘직접 물어봅시다.’ 그래서 물어보는 방법을 찾는 데 5개월이 걸렸습니다. 세종12년 8월에 국민투표를 실시했습니다. 그 결과 찬성 9만 8,657표, 반대 7만 4,149표 이렇게 나옵니다. 찬성이 훨씬 많지요. 세종이 조정회의에 다시 걸었지만 또 부결되었습니다. 왜냐하면 대신들의 견해는 ‘마마, 찬성이 9만 8,000, 반대가 7만 4,000이니까 찬성이 물론 많습니다. 그러나 7만 4,149표라고 하는 반대도 대단히 많은 것입니다. 이 사람들이 상소를 내기 시작하면 상황은 전과 동일합니다.’ 이렇게 됐어요. 

세종이 ‘그러면 농민에게 더 유리하도록 안을 만들어라.’해서 안이 완성되었습니다. 그래서 실시하자 그랬는데 또 부결이 됐어요. 그 이유는 ‘백성들이 좋아할지 안 좋아할지 모릅니다.’였어요. ‘그러면 어떻게 하자는 말이냐’하니 ‘조그마한 지역에 시범실시를 합시다.’ 이렇게 됐어요. 
시범실시를 3년 했습니다. 결과가 성공적이라고 올라왔습니다. ‘전국에 일제히 실시하자’고 다시 조정회의에 걸었습니다. 조정회의에서 또 부결이 됐어요. ‘마마, 농지세라고 하는 것은 토질이 좋으면 생산량이 많으니까 불만이 없지만 토질이 박하면 생산량이 적으니까 불만이 있을 수 있습니다. 그래서 이 지역과 토질이 전혀 다른 지역에도 시범실시를 해 봐야 됩니다.’ 세종이 그러라고 했어요. 다시 시범실시를 했어요. 성공적이라고 올라왔어요. 
세종이 ‘전국에 일제히 실시하자’고 다시 조정회의에 걸었습니다. 또 부결이 됐습니다. 이유는 ‘마마, 작은 지역에서 이 안을 실시할 때 모든 문제점을 우리는 토론했습니다. 그러나 전국에서 일제히 실시할 때 무슨 문제가 나는지를 우리는 토론한 적이 없습니다.’ 세종이 토론하라 해서 세종25년 11월에 이 안이 드디어 공포됩니다. 
조선시대에 정치를 이렇게 했습니다. 세종이 백성을 위해서 만든 개정안을 정말 백성이 좋아할지 안 좋아할지를 국민투표를 해 보고 시범실시를 하고 토론을 하고 이렇게 해서 13년만에 공포·시행했습니다. 

대한민국정부가 1945년 건립되고 나서 어떤 안을 13년 동안 이렇게 연구해서 공포·실시했습니까. 저는 이러한 정신이 있기 때문에 조선이 500년이나 간 것이 아닌가 하는 생각을 하고 있습니다. 

◈ 법률 문제 

○ 법에 관한 문제를 보시겠습니다. 

우리가 오늘날 3심제를 하지 않습니까? 조선시대에는 어떻게 했을 것 같습니까? 조선시대에 3심제는 없었습니다. 그런데 사형수에 한해서는 3심제를 실시했습니다. 원래는 조선이 아니라 고려 말 고려 문종 때부터 실시했는데, 이를 삼복제(三覆制)라고 합니다. 
조선시대에 사형수 재판을 맨 처음에는 변 사또 같은 시골 감형에서 하고, 두 번째 재판은 고등법원, 관찰사로 갑니다. 옛날에 지방관 관찰사는 사법권을 가지고 있었습니다. 마지막 재판은 서울 형조에 와서 받았습니다. 재판장은 거의 모두 왕이 직접 했습니다. 왕이 신문을 했을 때 그냥 신문한 것이 아니라 신문한 것을 옆에서 받아썼어요. 조선의 기록정신이 그렇습니다. 기록을 남겨서 그것을 책으로 묶었습니다. 
그 책 이름이 ‘심리록(審理錄)’이라는 책입니다. 정조가 1700년대에 이 '심리록'을 출판했습니다. 오늘날 번역이 되어 큰 도서관에 가시면 ‘심리록’이라는 책이 있습니다. 왕이 사형수를 직접 신문한 내용이 거기에 다 나와 있습니다. 
왕들은 뭐를 신문했냐 하면 이 사람이 사형수라고 하는 증거가 과학적인가 아닌가 입니다. 또 한 가지는 고문에 의해서 거짓 자백한 것이 아닐까를 밝히기 위해서 왕들이 무수히 노력합니다. 이 증거가 맞느냐 과학적이냐 합리적이냐 이것을 계속 따집니다. 이래서 상당수의 사형수는 감형되거나 무죄 석방되었습니다. 
이런 것이 조선의 법입니다. 이렇기 때문에 조선이 500년이나 간 것이 아닌가 하는 생각을 합니다. 

◈ 과학적 사실 

○ 다음에는 과학에 대해 말씀 드리겠습니다. 

코페르니쿠스가 태양이 아니라 지구가 돈다고 지동설을 주장한 것이 1543년입니다. 그런데 코페르니쿠스의 주장에는 이미 다 아시겠지만 물리학적 증명이 없었습니다. 물리학적으로 지구가 돈다는 것을 증명한 것은 1632년에 갈릴레오가 시도했습니다. 종교법정이 그를 풀어주면서도 갈릴레오의 책을 보면 누구나 지동설을 믿을 수밖에 없으니까 책은 출판금지를 시켰습니다. 그 책이 인류사에 나온 것은 그로부터 100년 후입니다. 1767년에 인류사에 나왔습니다. 

-동양에서는 어떠냐 하면 지구는 사각형으로 생겼다고 생각했습니다. 하늘은 둥글고 지구는 사각형이다, 이를 천원지방설(天圓地方說)이라고 얘기합니다. 그런데 실은 동양에서도 지구는 둥글 것이라고 얘기한 사람들이 상당히 많았습니다. 대표적인 사람이 여러분들이 아시는 성리학자 주자입니다, 주희. 주자의 책을 보면 지구는 둥글 것이라고 나와 있습니다. 황진이의 애인, 고려시대 학자 서화담의 책을 봐도 ‘지구는 둥글 것이다, 지구는 둥글어야 한다, 바닷가에 가서 해양을 봐라 지구는 둥글 것이다’ 이렇게 주장했습니다. 

-그런데 이것을 어떠한 형식이든 증명한 것이 1400년대 이순지(李純之)라고 하는 세종시대의 학자입니다. 이순지는 지구는 둥글다고 선배 학자들에게 주장했습니다. 그는 ‘일식의 원리처럼 태양과 달 사이에 둥근 지구가 들어가고 그래서 지구의 그림자가 달에 생기는 것이 월식이다, 그러니까 지구는 둥글다.’ 이렇게 말했습니다. 이것이 1400년대입니다. 그러니까 선배 과학자들이 ‘그렇다면 우리가 일식의 날짜를 예측할 수 있듯이 월식도 네가 예측할 수 있어야 할 것 아니냐’고 물었습니다. 이순지는 모년 모월 모시 월식이 생길 것이라고 했고 그날 월식이 생겼습니다. 이순지는 ‘교식추보법(交食推步法)’이라는 책을 썼습니다. 일식, 월식을 미리 계산해 내는 방법이라는 책입니다. 그 책은 오늘날 남아 있습니다. 

이렇게 과학적인 업적을 쌓아가니까 세종이 과학정책의 책임자로 임명했습니다. 이때 이순지의 나이 약관 29살입니다. 그리고 첫 번째 준 임무가 조선의 실정에 맞는 달력을 만들라고 했습니다. 여러분, 동지상사라고 많이 들어보셨지요? 동짓달이 되면 바리바리 좋은 물품을 짊어지고 중국 연변에 가서 황제를 배알하고 뭘 얻어 옵니다. 다음 해의 달력을 얻으러 간 것입니다. 달력을 매년 중국에서 얻어 와서는 자주독립국이 못될뿐더러, 또 하나는 중국의 달력을 갖다 써도 해와 달이 뜨는 시간이 다르므로 사리/조금의 때가 정확하지 않아요. 
그러니까 조선 땅에 맞는 달력이 필요하다 이렇게 됐습니다. 수학자와 천문학자가 총 집결을 했습니다. 이순지가 이것을 만드는데 세종한테 그랬어요. 
‘못 만듭니다.’ 
‘왜?’ 
‘달력을 서운관(書雲觀)이라는 오늘날의 국립기상천문대에서 만드는데 여기에 인재들이 오지 않습니다.’ 
‘왜 안 오는가?’ 
‘여기는 진급이 느립니다.’ 그랬어요. 
오늘날 이사관쯤 되어 가지고 국립천문대에 발령받으면 물 먹었다고 하지 않습니까? 행정안전부나 청와대비서실 이런 데 가야 빛 봤다고 하지요? 옛날에도 똑같았어요. 그러니까 세종이 즉시 명령합니다. 
‘서운관의 진급속도를 제일 빠르게 하라.’ 
‘그래도 안 옵니다.’ 
‘왜?’ 
‘서운관은 봉록이 적습니다.’ 
‘봉록을 올려라.’ 그랬어요. 
‘그래도 인재들이 안 옵니다.’ 
‘왜?’ 
‘서운관 관장이 너무나 약합니다.’ 
‘그러면 서운관 관장을 어떻게 할까?’ 
‘강한 사람을 보내주시옵소서. 왕의 측근을 보내주시옵소서.’ 
세종이 물었어요. ‘누구를 보내줄까?’ 
누구를 보내달라고 했는 줄 아십니까? 
‘정인지를 보내주시옵소서.’ 그랬어요. 정인지가 누구입니까? 고려사를 쓰고 한글을 만들고 세종의 측근 중의 측근이고 영의정입니다. 

세종이 어떻게 했을 것 같습니까? 영의정 정인지를 서운관 관장으로 겸임 발령을 냈습니다. 그래서 1,444년에 드디어 이 땅에 맞는 달력을 만드는 데 성공했습니다. 이순지는 당시 가장 정확한 달력이라고 알려진 아라비아의 회회력의 체제를 몽땅 분석해 냈습니다. 일본학자가 쓴 세계천문학사에는 회회력을 가장 과학적으로 정교하게 분석한 책이 조선의 이순지著 ‘칠정산외편(七政算外篇)’이라고 나와 있습니다. 

그런데 달력이 하루 10분, 20분, 1시간 틀려도 모릅니다. 한 100년, 200년 가야 알 수 있습니다. 이 달력이 정확한지 안 정확한지를 어떻게 아냐면 이 달력으로 일식을 예측해서 정확히 맞으면 이 달력이 정확한 것입니다. 이순지는 '칠정산외편'이라는 달력을 만들어 놓고 공개를 했습니다. 1,447년 세종 29년 음력 8월 1일 오후 4시 50분 27초에 일식이 시작될 것이고 그날 오후 6시 55분 53초에 끝난다고 예측했습니다. 이게 정확하게 맞아떨어졌습니다. 세종이 너무나 반가워서 그 달력의 이름을 ‘칠정력’이라고 붙여줬습니다. 이것이 그 후에 200년간 계속 사용되었습니다. 

여러분 1,400년대 그 당시에 자기 지역에 맞는 달력을 계산할 수 있고 일식을 예측할 수 있는 나라는 전 세계에 세 나라밖에 없었다고 과학사가들은 말합니다. 하나는 아라비아, 하나는 중국, 하나는 조선입니다. 
그런데 이순지가 이렇게 정교한 달력을 만들 때 달력을 만든 핵심기술이 어디 있냐면 지구가 태양을 도는 시간을 얼마나 정교하게 계산해 내는가에 달려 있습니다. ‘칠정산외편’에 보면 이순지는 지구가 태양을 도는 데 걸리는 시간은 365일 5시간 48분 45초라고 계산해 놓았습니다. 오늘날 물리학적인 계산은 365일 5시간 48분 46초입니다. 1초 차이가 나게 1400년대에 계산을 해냈습니다. 여러분, 그 정도면 괜찮지 않습니까? 

-홍대용이라는 사람은 수학을 해서 ‘담헌서(湛軒書)’라는 책을 썼습니다. ‘담헌서’는 한글로 번역되어 큰 도서관에는 다 있습니다. 이 ‘담헌서’ 가운데 제5권이 수학책입니다. 홍대용이 조선시대에 발간한 수학책의 문제가 어떤지 설명 드리겠습니다. ‘구체의 체적이 6만 2,208척이다. 이 구체의 지름을 구하라.’ cos, sin, tan가 들어가야 할 문제들이 쫙 깔렸습니다. 조선시대의 수학책인 ‘주해수용(籌解需用)’에는 이렇게 되어 있습니다. 
sinA를 한자로 正弦, cosA를 餘弦, tanA를 正切, cotA를 餘切, secA를 正割, cosecA를 如割, 1-cosA를 正矢, 1-sinA를 餘矢 이렇게 되어 있습니다. 그러면 이런 것이 있으려면 삼각함수표가 있어야 되잖아요. 이 ‘주해수용’의 맨 뒤에 보면 삼각함수표가 그대로 나와 있습니다. 제가 한 번 옮겨봤습니다. 
예를 들면 正弦 25도 42분 51초, 다시 말씀 드리면 sin25.4251도의 값은 0.4338883739118 이렇게 나와 있습니다. 제가 이것을 왜 다 썼느냐 하면 소수점 아래 몇 자리까지 있나 보려고 제가 타자로 다 쳐봤습니다. 소수점 아래 열세 자리까지 있습니다. 이만하면 조선시대 수학책 괜찮지 않습니까? 

다른 문제 또 하나 보실까요? 甲地와 乙地는 동일한 子午眞線에 있다. 조선시대 수학책 문제입니다. 이때는 子午線이라고 안 하고 子午眞線이라고 했습니다. 이런 것을 보면 이미 이 시대가 되면 지구는 둥글다고 하는 것이 보편적인 지식이 되어 있는 것 같습니다. 甲地와 乙地는 동일한 子午線上에 있다. 甲地는 北極出地, 北極出地는 緯度라는 뜻입니다. 甲地는 緯度 37도에 있고 乙地는 緯度 36도 30분에 있다. 甲地에서 乙地로 직선으로 가는데 고뢰(鼓?)가 12번 울리고 종료(鍾鬧)가 125번 울렸다. 이때 지구 1도의 里數와 지구의 지름, 지구의 둘레를 구하라. 이러한 문제입니다. 

이 고뢰(鼓? ) , 종료(鍾鬧)는 뭐냐 하면 여러분 김정호가 그린 대동여지도를 초등학교 때 사회책에서 보면 오늘날의 지도와 상당히 유사하지 않습니까? 옛날 조선시대의 지도가 이렇게 오늘날 지도와 비슷했을까? 이유는 축척이 정확해서 그렇습니다. 대동여지도는 십리 축척입니다. 십리가 한 눈금으로 되어 있는데 이것이 왜 정확하냐면 기리고거(記里鼓車)라고 하는 수레를 끌고 다녔습니다. 
기리고거가 뭐냐 하면 기록할 記자, 리는 백리 2백리 하는 里자, 里數를 기록하는, 고는 북 鼓자, 북을 매단 수레 車, 수레라는 뜻입니다. 어떻게 만들었냐 하면 수레가 하나 있는데 중국의 동진시대에 나온 수레입니다. 바퀴를 정확하게 원둘레가 17척이 되도록 했습니다. 17척이 요새의 계산으로 하면 대략 5미터입니다. 이것이 100바퀴를 굴러가면 그 위에 북을 매달아놨는데 북을 ‘뚱’하고 치게 되어 있어요. 북을 열 번 치면 그 위에 종을 매달아놨는데 종을 ‘땡’하고 치게 되어 있어요. 여기 고뢰, 종료라고 하는 것이 그것입니다. 그러니까 이것이 5km가 되어서 딱 10리가 되면 종이 ‘땡’하고 칩니다. 김정호가 이것을 끌고 다녔습니다. 

우리 세종이 대단한 왕입니다. 몸에 피부병이 많아서 온양온천을 자주 다녔어요. 그런데 온천에 다닐 때도 그냥 가지 않았습니다. 이 기리고거를 끌고 갔어요. 그래서 한양과 온양 간이라도 길이를 정확히 계산해 보자 이런 것을 했었어요. 이것을 가지면 지구의 지름, 지구의 둘레를 구할 수 있다는 얘기입니다. 그러니까 원주를 파이로 나누면 지름이다 하는 것이 이미 보편적인 지식이 되어 있었습니다. 

◈ 수학적 사실 

○ 그러면 우리 수학의 씨는 어디에 있었을까 하는 것인데요, 

여러분 불국사 가보시면 건물 멋있잖아요. 석굴암도 멋있잖아요. 불국사를 지으려면 건축학은 없어도 건축술은 있어야 할 것이 아닙니까, 최소한 건축술이 있으려면 물리학은 없어도 물리술은 있어야 할 것 아닙니까. 물리술이 있으려면 수학은 없어도 산수는 있어야 할 것 아닙니까? 이게 제가 고등학교 3학년 때 가졌던 의문입니다, 이것을 어떻게 지었을까. 
그런데 저는 ‘삼국사기’의 저자 김부식 선생님을 너무 너무 존경합니다. 여러분 세계에서 가장 오래된 대학이 어디인 줄 아십니까? 에스파냐, 스페인에 있습니다. 1490년대에 국립대학이 세워졌습니다. 여러분이 아시는 옥스퍼드와 캠브리지는 1600년대에 세워진 대학입니다. 우리는 언제 국립대학이 세워졌느냐, ‘삼국사기’를 보면 682년, 신문왕 때 국학이라는 것을 세웁니다. 그것을 세워놓고 하나는 철학과를 만듭니다. 관리를 길러야 되니까 논어, 맹자를 가르쳐야지요. 그런데 학과가 또 하나 있습니다. 김부식 선생님은 어떻게 써놓았냐면 ‘산학박사와 조교를 두었다.’ 이렇게 되어 있습니다. 명산과입니다. 밝을 明자, 계산할 算자, 科. 계산을 밝히는 과, 요새 말로 하면 수학과입니다. 수학과를 세웠습니다. ‘15세에서 30세 사이의 청년 공무원 가운데 수학에 재능이 있는 자를 뽑아서 9년 동안 수학교육을 실시하였다.’ 이렇게 되어 있습니다. 여기를 졸업하게 되면 산관(算官)이 됩니다. 수학을 잘 하면 우리나라는 공무원이 됐습니다. 
전 세계에서 가서 찾아보십시오. 수학만 잘 하면 공무원이 되는 나라 찾아보십시오. 이것을 산관이라고 합니다. 삼국시대부터 조선이 망할 때까지 산관은 계속 되었습니다. 이 산관이 수학의 발전에 엄청난 기여를 하게 됩니다. 산관들은 무엇을 했느냐, 세금 매길 때, 성 쌓을 때, 농지 다시 개량할 때 전부 산관들이 가서 했습니다. 세금을 매긴 것이 산관들입니다. 
그런데 그때의 수학 상황을 알려면 무슨 교과서로 가르쳤느냐가 제일 중요하겠지요? 정말 제가 존경하는 김부식 선생님은 여기다가 그 당시 책 이름을 쫙 써놨어요. 삼개(三開), 철경(綴經), 구장산술(九章算術), 육장산술(六章算術)을 가르쳤다고 되어 있습니다. 그 가운데 오늘날 우리가 볼 수 있는 것은 구장산술이라는 수학책이 유일합니다. 구장산술은 언제인가는 모르지만 중국에서 나왔습니다. 최소한도 진나라 때 나왔을 것이라고 얘기하고 있습니다. 어떤 사람은 주나라 문왕이 썼다고 하는데 중국에서는 좋은 책이면 무조건 다 주나라 문왕이 썼다고 하는 경향이 있습니다. 
이 책의 제 8장의 이름이 방정입니다. 방정이 영어로는 equation입니다. 방정이라는 말을 보고 제 온 몸에 소름이 쫙 돋았습니다. 저는 사실은 중학교 때 고등학교 때부터 방정식을 푸는데, 방정이라는 말이 뭘까가 가장 궁금했습니다. 어떤 선생님도 그것을 소개해 주지 않았습니다. 그런데 이 책에 보니까 우리 선조들이 삼국시대에 이미 방정이라는 말을 쓴 것을 저는 외국수학인 줄 알고 배운 것입니다. 

○ 9 장을 보면 9장의 이름은 구고(勾股)입니다. 갈고리 勾자, 허벅다리 股자입니다. 맨 마지막 chapter입니다. 방정식에서 2차 방정식이 나옵니다. 그리고 미지수는 다섯 개까지 나옵니다. 그러니까 5원 방정식이 나와 있습니다. 중국 학생들은 피타고라스의 정리라는 말을 모릅니다. 여기에 구고(勾股)정리라고 그래도 나옵니다. 자기네 선조들이 구고(勾股)정리라고 했으니까. 
여러분 이러한 삼각함수 문제가 여기에 24문제가 나옵니다. 24문제는 제가 고등학교 때 상당히 힘들게 풀었던 문제들이 여기에 그대로 나옵니다. 이러한 것을 우리가 삼국시대에 이미 교육을 했습니다. 그런데 우리는 이러한 것들이 전부 서양수학인 줄 알고 배우고 있습니다. 
여기에는 밀률(密率)이라는 말도 나옵니다. 비밀할 때 密, 비율 할 때 率. 밀률의 값은 3으로 한다고 되어 있습니다. 고려시대의 수학교과서를 보면 밀률의 값은 3.14로 한다. 이렇게 되어 있습니다. 아까 이순지의 칠정산외편, 달력을 계산해 낸 그 책에 보면 ‘밀률의 값은 3.14159로 한다.’ 이렇게 되어 있습니다. 우리 다 그거 삼국시대에 했습니다. 그런데 어떻게 해서 우리는 오늘날 플러스, 마이너스, 정사각형 넓이, 원의 넓이, 방정식, 삼각함수 등을 외국수학으로 이렇게 가르치고 있느냐는 겁니다. 

저는 이런 소망을 강력히 가지고 있습니다. 
우리 초등학교나 중·고등 학교 책에 플러스, 마이너스를 가르치는 chapter가 나오면 우리 선조들은 늦어도 682년 삼국시대에는 플러스를 바를 正자 정이라 했고 마이너스를 부채, 부담하는 부(負)라고 불렀다. 그러나 편의상 正負라고 하는 한자 대신 세계수학의 공통부호인 +-를 써서 표기하자, 또 π를 가르치는 chapter가 나오면 682년 그 당시 적어도 삼국시대에는 우리는 π를 밀률이라고 불렀다, 밀률은 영원히 비밀스런 비율이라는 뜻이다, 오늘 컴퓨터를 π를 계산해 보면 소수점 아래 1조자리까지 계산해도 무한소수입니다. 그러니까 무한소수라고 하는 영원히 비밀스런 비율이라는 이 말은 철저하게 맞는 말이다, 그러나 밀률이라는 한자 대신 π라고 하는 세계수학의 공통 부호를 써서 풀기로 하자 하면 수학시간에도 민족의 숨결을 느낄 수 있습니다. 
저는 없는 것을 가지고 대한민국이 세계 제일이다라고 말씀드리는 것이 아닙니다. 선조들이 명백하게 다큐멘트, 문건으로 남겨주었음에도 불구하고 우리 선조들이 그것을 배웠음에도 불구하고 이것이 ‘서양 것’이라고 가르치는 것은 거짓이 아닌가라는 생각이 듭니다. 이러한 것이 전부 정리되면 세계사에 한국의 역사가 많이 올라갈 수 있을 것입니다. 이것은 우리가 잘났다는 것을 자랑하는 것이 아니라 인류의 역사인 세계사를 풍성하게 한다는, 세계사에 대한 기여입니다. 

◈ 맺는 말 

○ 결론으로 들어가겠습니다. 

제가 지금까지 말씀드린 모든 자료는 한문으로 되어 있습니다. 그런데 선조들이 남겨준 그러한 책이 ‘조선왕조실록’ 6,400만자짜리 1권으로 치고 2억 5,000만자짜리 ‘승정원일기’ 한 권으로 칠 때 선조들이 남겨준 문질이 우리나라에 문건이 몇 권 있냐면 33만권 있습니다. 그런데 여러분 주위에 한문 전공한 사람 보셨습니까? 
정말 엔지니어가 중요하고 나로호가 올라가야 됩니다. 그러나 우리 국학을 연구하려면 평생 한문만 공부하는 일단의 학자들이 필요합니다. 이들이 이러한 자료를 번역해 내면 국사학자들은 국사를 연구할 것이고, 복제사를 연구한 사람들은 한국복제사를 연구할 것이고, 경제를 연구한 사람들은 한국경제사를 연구할 것이고, 수학교수들은 한국수학사를 연구할 것입니다. 그런데 이러한 시스템이 우리나라에는 전혀 되어 있지 않습니다. 한문을 공부하면 굶어죽기 딱 좋기 때문에 아무도 한문을 하지 않습니다. 

그러면 결국 우리의 문건을 해결하기 위해서 언젠가는 동경대학으로 가고 북경대학으로 가는 상황이 나타날 것입니다. 그러나 어떤 사람이 한문을 해야 되냐 하면 공대 나온 사람이 한문을 해야 합니다. 그래야 한국물리학사, 건축학사가 나옵니다. 수학과 나온 사람이 한문을 해야 됩니다. 그래야 허벅다리, 갈고리를 아! 딱 보니까 이거는 삼각함수구나 이렇게 압니다. 밤낮 논어·맹자만 한 사람들이 한문을 해서는 ‘한국의 과학과 문명’이라는 책이 나올 수가 없습니다.
여러분, 사회에 나가시면 ‘이 시대에도 평생 한문만 하는 학자를 우리나라가 양성할 필요가 있다.’ 이러한 여론을 만들어주십시오. 이 마지막 말씀을 드리기 위해서 이런 데서 강연 요청이 오면 저는 신나게 와서 떠들어 댑니다. 

감사합니다.

 


반응형
Posted by blueasa
, |

There is certainly a lot more to be said about C++/CLI, never mind the Visual C++ 2005 compiler, but I hope this article has provided you with a good introduction to what it has to offer for programmers targeting the CLR. The new language design provides unprecedented power and elegance to write rich .NET applications completely in C++ without sacrificing productivity, conciseness, or performance.

The following table provides a summary of the most common constructs for quick reference.

Description C++/CLI C#
Allocate reference type ReferenceType^ h = gcnew ReferenceType; ReferenceType h = new ReferenceType();
Allocate value type ValueType v(3, 4); ValueType v = new ValueType(3, 4);
Reference type, stack semantics ReferenceType h; N/A
Calling Dispose method ReferenceType^ h = gcnew ReferenceType;

delete h;

ReferenceType h = new ReferenceType();

((IDisposable)h).Dispose();

Implementing Dispose method ~TypeName() {} void IDisposable.Dispose() {}
Implementing Finalize method !TypeName() {} ~TypeName() {}
Boxing int^ h = 123; object h = 123;
Unboxing int^ hi = 123;

int c = *hi;

object h = 123;

int i = (int) h;

Reference type definition ref class ReferenceType {};

ref struct ReferenceType {};

class ReferenceType {}
Value type definition value class ValueType {};

value struct ValueType {};

struct ValueType {}
Using properties h.Prop = 123;

int v = h.Prop;

h.Prop = 123;

int v = h.Prop;

Property definition property String^ Name
{
    String^ get()
    {
        return m_value;
    }
    void set(String^ value)
    {
        m_value = value;
    }
}
string Name
{
    get
    {
        return m_name;
    }
    set
    {
        m_name = value;
    }
}

 

About the author

Kenny Kerr spends most of his time designing and building distributed applications for the Microsoft Windows platform. He also has a particular passion for C++ and security programming. Reach Kenny at http://weblogs.asp.net/kennykerr/ or visit his Web site: http://www.kennyandkarin.com/Kenny/.

[출처] C++/CLI article in MSDN|작성자 MON

반응형
Posted by blueasa
, |

트리뷰 추가하기

treeView1.Nodes.Add("Main Server");             //노드 추가하기 0번째부터 시작!!

treeView1.Nodes[0].Nodes.Add("Main Server"); //0번째 노드에 자식노드 추가하기

 

트리뷰 삭제하기

treeView1.Nodes.RemoveAt(인덱스값_정수형);

 

하위 트리뷰까지 처음부터 활성화하기

treeView1.ExpandAll();

 

트리뷰 아이콘 넣기

 

ImageList myimageList = new ImageList();

myimageList.Images.Add(Image.FromFile(@"Clienticon_nateon.bmp"));//imageindex 0

myimageList.Images.Add(Image.FromFile(@"Clienticon_starc.bmp")); //imageindex 1

 

treeView1.ImageList = myimageList;

 

treeView1.Nodes.Add("Main Server");

treeView1.Nodes[0].ImageIndex = 1;   //트리뷰의 0번째의 이미지 설정

 

treeView1.Nodes[0].Nodes.Add("Node");

treeView1.ImageIndex = 0;            //트리뷰의 노드 전체의 이미지 설정

 



출처] [C#] 트리뷰(treeview) 추가(add),삭d제(remove), 아이콘(icon) 설정하기|작성자 한아랑

반응형
Posted by blueasa
, |
 형변환 (Typecasting)  
 : 그동안 명시적인 형변환을 할때는 괄호를 사용했었는데 C++에서는 이를 대체 할 수 있는 4가지 종류의 형변환 연산자가 추가 되었다. 그럼 그동안에 사용했던 명시적 형변환을 계속 쓰지 않고 새로운 형변환 종류가 추가 되었을까? 일단 기존의 C 스타일 형변환은 두가지 문제점이 있다. 첫번째는 C 스타일의 형변환(컴파일 타입 형변환)은 눈에 잘 띄지도 않고 찾아내기 힘이 든다는 점이다. 사용자가 프로그램을 짜다 보면, 형변환 말고도 괄호를 사용하는 부분이 많기 때문이다. 뭐 눈에 잘 안띈다고 단점이될까? 
  명시적 형변환을 수행한다는 것은 암시적인 형변환이 불가능하다는 뜻이고, 암시적인 형변환이 불가능하다는 것은 컴퓨터가 생각하기에는 문제의 소지가 있다는 뜻이다. 다음으로 C 스타일의 형변환은 형변환의 의도를 구별해내기가 힘들다는 문제점도 있다. C++에서의 형변환 연산자는 그 용도에 따라서, 안전한 형변환, const 속성을 제거하는 형변환, 위험한 형변환, 클래스 타입간의 형변환 등으로 나뉘어져 있다. 그렇기 때문에 C++ 연산자를 사용해서 형변환을 하면 코드를 읽는 사람이 형변환의 의도를 쉽게 알아챌 수 있다. 컴퓨터 역시 코드를 작성한 사람의  의도를 파악 할 수 있기 때문에 컴퓨터가 개발자의 실수를 발견해서 경고해주는 것도 가능하다. 

 const_cast  
 : const_cast는 어떤 타입에서 const 속성이나 volatile 속성을 제거 할때 사용한다. 
* volatile속성 
 : 변수를 정의할때 volatile 키워드를 붙여줄 수 있는데 컴퓨터는 가끔씩 어떤 이유에서 변수를 상수로 만들어버리는 작업을 하게 되는데,  volatile로 지정한 변수는 그 작업에서 열외가 된다. 대부분의 경우 변수를 상수로 만드는 작업은 프로그램의 성능을 높이는데 도움이 되지만, 어떤 상황에서는 문제를 일으키기 때문이다. (지금은 쓸데가 없지만, volatile은 Multi threading과 관련된 곳에서 사용할 일이 생길 수 있다.) 다음은 const int 타입을 int 타입으로 형변환 하는 코드이다. 
  1. const int value = 100;   
  2. int i = const_cast<int> (value);  

 reinterpret_cast  
 : reinterpret_cast는 일반적으로 허용하지 않는 위험한 형변환을(무조건적인 형변환 ) 할때 사용한다. 즉, 그 안의 데이터가 어떤 객체이던 그저 비트열로만 보고 원하는 형으로 강제로 변환을 한다는 것이다. 예를 들어 포인터를 정수로 변환하는 작업 등이 이에 해당 되겠다.
  1. int a, b;   
  2. a = reinterpret_cast<int>(&b);  

 static_cast  
 : static_cast는 가장 일반적인 형태의 형변환을 할때 사용한다. 만약에 A타입에서 B타입으로의 암시적인 형변환이 가능하다면 static_cast를 사용해서 B타입에서 A타입으로 형변환 할 수 있다. 예를 들어 double 타입을 char 형으로 형변환하는데 사용할 수 있겠다.
  1. double d = 10.0;   
  2. char c;   
  3. c = static_cast<char>(d);  
 static_cast는 명시적인 형변환이기는 하지만 대체적으로 안전한 형변환이라고 볼 수 있다. 아마도 우리가 수행하는 대부분의 형변환은 여기에 속할 것이다. 

 dynamic_cast  
 : 유일하게 C 스타일의 형변환으로는 흉내낼 수 없는 것이 dynamic_cast이다. dynamic_cast는 서로 상속 관계에 있는 클래스간에 형변환을 할 때 사용한다. 더불어 형변환을 수행하는 동시에 이 형변환이 안전한 것인지까지 검사 해준다. 그래서 dynamic_cast는 실시간에 형검사를 하거나 형변환할 때 사용한다.
  1. #include <iostream>   
  2. using namespace std;   
  3.   
  4. class Parent   
  5. {   
  6. public:   
  7.     virtual void Print( ) {}   
  8. };   
  9. class Child1 : public Parent   
  10. {   
  11. public:   
  12.     void Print( ) { cout << "class Child1 no problem" << endl; }   
  13. };   
  14. class Child2 : public Parent   
  15. {   
  16. public:   
  17.     void Print( ) { cout << "class Child2 no problem" << endl; }   
  18. };   
  19. void main( )   
  20. {   
  21.     Parent *p = new Child1;   
  22.     Parent *p1 = new Parent;   
  23.   
  24.     Child2* faile_child = dynamic_cast<Child2*> (p1);   
  25.     if( NULL == faile_child )   
  26.         cout << "Child2 Null 반환." <<endl;   
  27.     else  
  28.         faile_child->Print();   
  29.   
  30.     Child1 *pChild1 = dynamic_cast<Child1*>(p);    
  31.     if( NULL == pChild1 )   
  32.         cout << "Child1 Null 반환." <<endl;   
  33.     else  
  34.         pChild1->Print();   
  35.   
  36.     Child2 *pChild2 = dynamic_cast<Child2*>(p);   
  37.     if( NULL == pChild2 )   
  38.         cout << "Child2 Null 반환." <<endl;   
  39.     else  
  40.         pChild2->Print();   
  41.   
  42.     try  
  43.     {   
  44.         Child2& C2 = dynamic_cast<Child2&> (*p);   
  45.     }   
  46.     catch (bad_cast& e)   
  47.     {   
  48.         cout<<"bad_cast currupt"<<endl;   
  49.     }   
  50. }  

 위 예제에서 본것처럼, dynamic_cast는 다운 캐스트, 즉 부모 클래스 타입에서 자식 클래스 타입으로 형변환 할때 유용하게 사용할 수 있다. 다운 캐스트는 포인터나 레퍼런스가 가리키고 있는 객체의 실제 타입이 무엇이냐에 따라서 안전할 수 있고 위험할 수도 있는데 dynamic_cast가 알아서 안전여부는 검사를 해준다. 
 만약에 형변환에 문제가 있는 경우라면 dynamic_cast 연산자는 NULL 값을 반환하거나 bad_cast 예외를 던지게 된다.(위 결과 처럼 말이다.) 포인터의 형변환이라면 NULL을 반환함으로써 문제 상황을 알릴 수 있지만, 레퍼런스의 형변환인 경우에는 어떤 특정한 값은 반환하는 것이 불가능하므로 bad_cast 예외를 던지게 된다. (bas_cast 에외 역시 C++의 다른 예외 클래스들처럼 exception 클래스를 상속받았다.)
 위에서는 의미도 없는 가상함수를 사용했는데, 가상함수가 하나도 없는 클래스는 dyynamic_cast를 사용할 수 없기 때문이다. 이는 RTTI의 내부 구현과 관련이 있다. 위의 예제는 나머지 자식 클래스들도 상속받아 물려받은 가상 함수가 있는 셈이므로 dynamic_cast를 사용 할 수 있는 것이다. 만약 클래스가 가상함수를 하나도 가지지 않는다면 해당 클래스는 타입으로는 RTTI 를 이용할 수 있지만 객체로는 RTTI 를 이용할 수 없다.

 그럼 검사도 해주고 형변환도 해주는 dynamic_cast가 만능이냐? 아니다. static_cast<Child1*>(p); 이와 같이 static_cast를 해줄 수도있다. 하지만 이는 아무런 검사도 하지 않고 형변환을 하기 때문에, 실제론 잘못동작할수 있는 코드가 아무런 경고나 에러없이 컴파일되게 되는 불안요소를 가지고 있다고 할 수 있죠. 
 dynamic_cast는 RTTI를 이용해서 런타임시에 형을 체크하기 때문에, 잦은 dynamic_cast는 눈에 띌 정도의 퍼포먼스 저하의 원인이 될수 있습니다. 그렇기 때문에 자신이 하는 형변환하는 것이 안전하고 확실하다고 생각할때만 static_cast를 이용하고, 확신할수 없을 경우는 dynamic_cast를 이용하여 널포인터를 체크하는 것이 바람직하다.

 RTTI (Runtime Type Information)  
 : RTTI (Runtime Type Information)실행시간에 객체의 타입에 대한 정보를 얻을 수 있는 기능을 말한다. C++은 클래스의 객체만 가지고선 어떤 클래스의 객체인지 알수 있는 방법이 원래 없기 때문이다. 형변환 중 dynamic_cast를 할려면 RTTI가 필요 한데, 우리가 많이 쓰는 Visual Studio는 기본적으로 RTTI 기능을 사용하지 않게 설정되어 있다. 왜냐하면 RTTI의 특성상 객체를 생성할때마다 그 객체 내부에 타입 정보와 상속 정보를 넣어두기 때문에 속도(퍼포먼스)의 저하가 일어나기 때문이다. 
그래서 RTTI 기능 및 dynamic_cast를 사용하기 위해서는 비주얼 스튜디오의 프로젝트 설정을 변경 시켜 줘야 한다. 프로젝트의 Properties에 들어가 C++ -> Language -> Enable Run-Tie Type Information을 Yes(/GR)로 바꿔주면 된다.

  그럼 이 RTTI와 dynamic_cast는 어떻게 작동을 하는 것일까? 컴파일러는 RTTI 와 객체를 연결하기 위해서 가상함수 포인터 테이블을 이용을 한다. 원래 C++ 언어의 가상함수 포인터 테이블은 순수한 가상함수에 대한 함수 포인터 배열이다. RTTI 와 객체의 연결을 위해 C++ 언어는 가상함수 포인터 테이블 앞에 4 byte 를 만들고 이것을 RTTI 와의 연결 고리로 사용한다. 
 프로그램이 dynamic_cast 를 이용하여 캐스트를 한 경우 실행 코드는 dynamic_cast 의 표현식에 기술된 객체를 이용하여 RTTI 포인터 테이블을 검색하고, 만약 RTTI 포인터 테이블 상에 일치하는 RTTI 가 존재 한다면 표현식에 기술된 객체의 타입을 변환하여 반환하고, RTTI 포인터 테이블 상에 일치하는 RTTI 가 존재 하지 않는다면 dynamic_cast 는 NULL(0) 을 반환을 할 것이다. 

출처 : 
반응형

'Programming > C/C++' 카테고리의 다른 글

enum, 보다 나은 enum  (0) 2011.01.13
IME 소스 (한글)  (2) 2010.11.26
GameLoop (번역)  (0) 2010.09.16
IME 관련  (0) 2010.09.10
TLS (Thread Local Strorage)  (0) 2010.08.30
Posted by blueasa
, |

Tekken Tag Tournament 2 발표!

Game / 2010. 9. 28. 02:20
우오~ TTT 다음이 나오는구나 =ㅁ=

http://www.thisisgame.com/board/view.php?id=493561&category=117
반응형
Posted by blueasa
, |
1) Key, Value Binding
    comboBox.DataSource = new BindingSource(Dictionary, null);

2) Key Binding
    comboBox.DataSource = new BindingSource(Dictionary.Keys, null);

3) Value Binding
    comboBox.DataSource = new BindingSource(Dictionary.Values, null);


반응형
Posted by blueasa
, |

GameLoop (번역)

Programming/C/C++ / 2010. 9. 16. 19:43

소개

 게임 루프는 모든 게임의 핵심입니다. 어떤 게임도 게임 루프 없이는 실행될 수가 없습니다. 그러나 불행히도 새로운 게임 프로그래머에게 인터넷 상에서 이러한 내용이 적절하게 나와있는 좋은 곳을 찾을 수 없습니다. 그러나 두려워하지 마세요. 왜냐하면 게임루프에 주목해 볼만한 글을 방금 발견했기 때문에요.


 나의 직업이 게임 프로그래머인 것에 감사합니다. 소형 모바일 게임들을 위한 많은 코드를 접하게 되었습니다. 몇 몇의 게임 루프들이 나를 놀라게 만들었습니다. 아마 당신도 게임 루프들이 어떻게 다르게 쓰여지는 것에 대해 궁금할것입니다. 가장 인기있는 게임 루프 방법에 대해 찬반토론을 하겠습니다. 또한 게임루프 실행의 최고 방법을 알려 드리겠습니다.( 제 생각으로요.)


(브라질의 포루투칼어로도 이용하게 해줄수 있게 한  Kao Cardoso Felix 감사드립니다.)

 

 게임 루프
 모든 게임들은 사용자의 입력, 게임의 상태 수정, AI 조작, 배경음과 효과음들의 연속으로 이루어져 있다. 이 연속된 동작들은 게임 루프를 통해 처리된다. 소개에서 말한대로 게임 루프는 모든 게임의 핵심이다. 앞서 언급한 작업에 대해 자세하게 설명하지 않고, 게임루프 하나에 집중하도록 하겠다. 그래서 작업들을 두개의 기능으로 단순하게 했다 : 게임 업데이트와 디스플레이

 

최고로 단순한 게임 루프 예제 코드:

 

bool game_is_running = true;
while( game_is_running )  {
    update_game();
    display_game();
}


 이 단순한 게임 루프의 문제는 시간을 고려하지 않고 있다. 그저 게임을 실행할 뿐이다. 느린 하드웨어에서는 느려지고, 빠른 하드웨어에서는 빨라진다. 예전 하드웨어의 속도를 알고 있다면 상관이 없다. 그러나 오늘날 많은 하드웨어 플랫폼이 존재한다. 우리는 속도를 다른 어떤 방법으로 실행해야 한다. 여기에 많은 방법들이 있고, 이 방법들에 대해 이어지는 섹션에서 토의해 보자

 

 첫째, 이 글에서 사용하는 두 단어에 대해 설명하겠다 :

 

FPS
 FPS는 Frames Per Second의 약어이다. display_game()의 초당 호출 횟수이다.

게임 속도
 게임 속도는 초당 게임 상태의 갱신 속도이다. 다른 말로는 초당 update_game()의 호출 횟수이다.

 

 FPS가 게임속도에 의존적

구현
 타이밍 문제를 해결하기 위한 쉬운 방법은 단지 초당 25 프레임으로 게임을 실행하면 된다. 코드는 다음과 같다.

   

    const int FRAMES_PER_SECOND = 25;
    const int SKIP_TICKS = 1000 / FRAMES_PER_SECOND;

 

    DWORD next_game_tick = GetTickCount();
    // GetTickCount() returns the current number of milliseconds
    // that have elapsed since the system was started

 

    int sleep_time = 0;
    bool game_is_running = true;


    while( game_is_running ) {
        update_game();
        display_game();
        next_game_tick += SKIP_TICKS;
        sleep_time = next_game_tick - GetTickCount();
        if( sleep_time >= 0 ) {
            Sleep( sleep_time );
        }
        else {
            // Shit, we are running behind!
        }
    }

 

 이 방법은 큰 혜택이 있다. 참 쉽죠! update_game()이 초당 25번 불려진다는 것은 알기에 게임 코드를 작성하기에 쉽다. 예를 들면 이러한 게임 루프는 응답 구현 기능의 구현이 쉽다. 만약 게임 안에서 랜덤 값을 사용하지 않는다면, 단지 유저의 입력 변화 혹은 재생들을 기록하기만 하면 된다.

테스트하는 하드웨어에 FRAMES_PER_SECOND를 이상적인 값으로 적응시킬 수 있다. 하지만 보다 빠르거나 느린 하드웨어서는 무슨 일이 벌어질것인가? 그럼 이제 알아보자.

 

느린 하드웨어

 하드웨어서 정해놓은 FPS를 다룰 수 있다면 문제가 없다. 그렇지만 하드웨어에서 FPS를 다룰 수 없을 때 문제가 발생한다. 게임은 느려질 것이다. 가장 나쁜 케이스는 게임이 무거운 부분에서는 느리게 움직이고 어떤 부분에서 정상적이게 게임이 돌아가는 것이다. 타이밍은 왜곡되어서 게임을 할 수 없게 만든다.

 

빠른 하드웨어

 빠른 하드웨어에서는 문제가 없을 것이다. 하지만 정말로 많은 귀중한 클럭 사이클을 낭비하는 것이다. 쉽게 300 FPS를 만들 수 있을 때 25 또는 30FPS를 돌리는 것은... 부끄러운 줄 알아라! 특히 빠르게 움직이는 객체에 대해 시각적인 효과를 낭비하는 것이다.

 다른 한편으로 모바일 장치에서 이것은 효과적일 수 있다. 게임을 계속 돌리는게 아니라서 배터리 시간을 유지할 수 있다.

 

결론

 일정한 게임 속도에 FPS를 의존적이게 만드는 것은 쉽게 구현할 수있고 코드를 심플하게 하지만 문제가 약간 있다. 높은 FPS는 느린 하드웨어에서 문제를 야기할 수 있다. 그리고 느린 FPS는 빠른 하드웨어에서는 시각적 효과의 낭비로 이어진다.

 

 게임속도가 가변FPS에 의존적

구현

 또 다른 게임 루프의 구현은 가능한 빠르게 게임 루프를 도는 것이다. 그리고 FPS가 게임 속도를 결정한다. 바로 전 프레임과 다른 시간으로 게임은 갱신된다.

   

    DWORD prev_frame_tick;
    DWORD curr_frame_tick = GetTickCount();

 

    bool game_is_running = true;
    while( game_is_running ) {
        prev_frame_tick = curr_frame_tick;
        curr_frame_tick = GetTickCount();

 

        update_game( curr_frame_tick - prev_frame_tick );
        display_game();
    }


 게임코드가 약간 더 어려워 지고 있다. 왜냐하면 우리는 update_game()의 기능에 대해 고려해야 하기 때문이다. 그러나 아직까지 어렵지는 않다. 첫눈에 봐서 우리의 문제를 해결하기에 이상적인 방법으로 보인다. 나는 많은 똑똑한 프로그래머들이 이런 종류의 게임루프를 구현하는 것을 봤다. 그들 중 일부는 아마도 이러한 루프를 구현하기 전에 이 글을 봤어야 했는데 할 것이다. 내가 즉시 느린 하드웨어나 빠른 하드웨어( 맞다! 빠른!)  둘 모두에 심각한 문제를 발생하는 것을 보여주겠다.

 

느린 하드웨어

 느린 하드웨어서 때때로 어떤 곳에서 확실하게 느려진다.  게임 내 무거운 곳에서. 이러한 현상은 3D게임에서 수많은 폴리곤들이 보여지는 일정한 시간동안 확실하게 느려진다. 이러한 프레임 하락은 입력 반응 시간에 영향을 미치게 되고 마찬지로 플레이어의 반응 시간에도 영양을 끼친다. 게임 업데이트에 딜레이를 느낄 것이고 게임 상태는 큰 시간뒤에 갱신될 것이다. 그 결과 플레이어 및 AI의 반응 시간 또한 느려진다. 그래서 단순한 이동 실패 심지어 이동 불가능이 될 것이다. 예를 들어 정상적인 FPS에서는 장애물을 피할 수 있는데 낮은 FPS에서는 불가능하게 된다. 좀 더 심각한 문제는 시뮬레이션이 폭발할 수도 있다는 것이다!

 

빠른 하드웨어
 위에 나와있는 게임코드가 어떻게 빠른 하드웨어에 문제인지 궁금할 것이다. 불행하게도 가능하다. 첫째로 컴퓨터 위에서의 계산에 대해 설명하겠다.
 float 또는 double형의 메모리 공간 한계 때문에 몇 몇 값들을 나타낼 수가 없다. 예를 들어 0.1은 이진수로 나타낼 수가 없어서 double에서 저장될때 어림수로 된다. pyton을 통해 보여주겠다. :


>>> 0.1
0.10000000000000001


 이것은 별로 극적이지 않다. 예를 들면 레이싱카가 밀리세컨드당 0.001의 속도로 움직이는데 10초 후에 움직인 거리는 10.0이다. 만약 게임공간 내에서 쪼개서 계산을 한다면 초당 프레임으로 입력을 받는 다음과 같은 함수를 사용할 것이다.

 

>>> def get_distance( fps ):
...     skip_ticks = 1000 / fps
...     total_ticks = 0
...     distance = 0.0
...     speed_per_tick = 0.001
...     while total_ticks < 10000:
...             distance += speed_per_tick * skip_ticks
...             total_ticks += skip_ticks
...     return distance

 

 이제 우리는 초당 40프레임 때의 거리를 계산 할 것이다. :


>>> get_distance( 40 )
10.000000000000075


 잠시만 기다려봐라... 10.0이 아니네?? 무슨일인가? 흠, 왜냐하면 우리는 400 추가를 나누어서 계산했고 작은 에러들은 커진 것이다. 초당 100 프레임에서 무슨 일이 일어나는가...


>>> get_distance( 100 )
9.9999999999998312


 머라고? 심지어 에러가 더 커졌다!! 흠, 왜냐하면 우리는 100fps에서 좀 더 더했기 때문이다. 라운딩 에러가 크게될 가능성이 있다. 그래서 게임에서 초당 40 이나 100프레임이 틀린것이다.

 

>>> get_distance( 40 ) - get_distance( 100 )
2.4336088699783431e-13


 게임에서 이러한 차이가 너무 작다고 느낄 것이다. 그러나 진짜 문제는 잘못된 값으로 무엇을 계산하려고 할 때 생긴다. 이 방법으로는 작은 에러가 크게 된다. 그리고 높은 프레임 레이트에서는 게임을 불능으로 만들어 버린다. 이러한 일이 생기냐고? 고려하기에 충분하다! 이러한 게임 루프를 사용하는 게임을 보아왔고 정말로 높은 프레임 레이트에서 문제를 일으켰다. 후에 프로그래머가 게임 코어에 숨어있는 문제를 발견했다. 결국 많은 약간의 코드들을 수정했다.

 

결론
 얼핏보면 이러한 게임 루프들은 좋다. 하지만 어리석게 굴지 마라. 느리거나 빠른 하드웨어 둘 모두 게임에 심각한 문제를 발생시킨다. 그리고 그거 외에도 고정 프레임 레이트를 사용할 때보다 구현이 더 어렵다. 그래서 굳이 이것을 사용 하겠는가?

 

 최대FPS에 대한 일정한 게임 속도
구현

 우리 첫번째 방법인 일정한 게임 속도에 의존적인 FPS의 경우 느린 하드웨에서 문제를 일으켰다. 그 경우 프레임레이트와 게임속도 둘 모두 저하됬다. 만일 그렇다면 가능한 방법은 게임 갱신은 그대로 두고 랜더링 프레임레이트를 줄이는 것이다. 이 것은 다음과 같은 게임루프를 사용한다 :

 

    const int TICKS_PER_SECOND = 50;
    const int SKIP_TICKS = 1000 / TICKS_PER_SECOND;
    const int MAX_FRAMESKIP = 10;

 

    DWORD next_game_tick = GetTickCount();
    int loops;

 

    bool game_is_running = true;
    while( game_is_running )
{

 

        loops = 0;
        while( GetTickCount() > next_game_tick && loops < MAX_FRAMESKIP)
{
            update_game();

 

            next_game_tick += SKIP_TICKS;
            loops++;
        }

        display_game();
    }

 

 이 게임은 일정하게 초당 50번 갱신을 하고 랜더링은 가능한 빠르게 완료한다. 랜더링은 초당 50번보다 많게 이루어진다는 것을 알 수 있고 이어지는 몇몇 프레임도 비슷해진다. 그래서 실제 영상 프레임은 초당 50프레임의 최대로 표현되어 질것이다. 느린 하드웨어서 돌아갈 경우 프레임레이트는 게임 업데이트가 MAX_FRAMESKIP에 도착할 때까지 떨어질 것이다. 실제로 render FPS가 5까지 (= FRAMES_PER_SECOND / MAX_FRAMESKIP)까지 떨어진다는 것을 의미한다. 실제 게임은 느려질 것이다.


느린 하드웨어
 느린 하드웨어에서 초당 프레임은 떨어질것이다. 그러나 게임은 아마도 정상적인 속도로 돌아갈 것이다. 만약 하드웨어가 여전히 정상적인 속도를 따라가지 못한다면 게임은 느려지고 프레임레이트는 전혀 부드럽지 않을 것이다.

 

빠른 하드웨어
 빠른하드웨어에서 게임은 문제가 없을 것이다. 그러나 처음 해결책과 비슷하다. 높은 프레임 레이트로 쓸 수 있는 많은 귀중한 클럭 사이클을 낭비하고 있다. 빠른 갱신율과 느린 컴퓨터와의 균형을 발견하는게 중요하다.

 

결론
 최대 FPS를 쓴 일정한 게임속도는 쉽게 구현을 할 수 있고 코드가 심플하다. 그러나 여전히 약간의 문제를 가지고 있다 : 높은 FPS를 설정할 경우 여전히 느린 하드웨어에서의 위험성을 가지고 있다(그러나 첫번째 해결책만큼 심각하지 않다) 그리고 낮은 FPS를 설정할 경우 높은 하드웨어에서는 영상효과의 낭비이다.


 가변FPS에 비의존적인 일정한 게임 속도
구현

 느린하드웨어서는 한층 더 빠르고 빠른 하드웨어에서는 시각적으로 좀 더 매력적이게 향상시키는 게 가능한가? 그럼 우리에게 행운이다! 가능하다. 게임 상태는 초당 60번의 갱신이 필요하지 않다. 사용자의 입력이나 AI 그리고 게임 상태는 초당 25프레임으로 충분하다. 그래서 초당 update_game()를 더적게 더 많이도 말고 25번 부르도록 하자. 한편으로 랜더링은 하드웨어가 다룰 수 있으면 있을 만큼 빠르게 되도록하자. 그러나 느린 프레임 레이트는 게임의 갱신을 방해할 것이다. 이것을 해결하는 하는 방법은 이 게임루프를 따르는 것이다.

   
    const int TICKS_PER_SECOND = 25;
    const int SKIP_TICKS = 1000 / TICKS_PER_SECOND;
    const int MAX_FRAMESKIP = 5;

 

    DWORD next_game_tick = GetTickCount();
    int loops;


    float interpolation;

    bool game_is_running = true;


    while( game_is_running ) {

        loops = 0;
        while( GetTickCount() > next_game_tick && loops < MAX_FRAMESKIP) {
            update_game();

 

            next_game_tick += SKIP_TICKS;
            loops++;

        }

 

        interpolation = float( GetTickCount() + SKIP_TICKS - next_game_tick )
                        / float( SKIP_TICKS );
        display_game( interpolation );
    }

 

 이러한 게임 루프에서 update_game() 부분은 여전히 쉽다. 그러나 불행하게도 display_game() 함수는 좀 더 복잡하게 되었다. 보간 변수를 쓰는 예상함수를 구현해야 한다. 그러나 걱정하지 마라. 어렵지 않다. 단지 조금의 일을 더 하는 것 뿐이다. 보간과 예상하는 일을 어떻게 하는지에 대해 설명해 주겠다. 그러나 첫째 왜 이게 필요한지 보여주겠다.

 

보간의 필요성

 게임 상태는 초당 25번 업데이트를 한다. 그래서 만약 랜더링에 보간을 사용하지 않는다면 마찬가지의 속도로 보여질 것이다. 예를 들어 영화의 경우 초당 24 프레임으로 실행되기에 25FPS가 어떤사람들은 느리지 않다고 생각한다. 그래서 25FPS가 시각적으로 만족스럽다고 생각한다. 그러나 빠르게 움직이는 객체에 대해서는 여전히 좀더 빠른 FPS를 쓰는게 개선된다는 것을 알 수있다. 그러므로 프레임 사이 마다의 빠른 움직임을 좀 더 부드럽게 하려면 무엇을 해야 한다. 그래서 보간과 예상 함수는 해결책을 제시해 쥔다.

 

보간과 예상

 게임 코드는 초당의 현재 프레임으로 돌고 있다고 말했다. 그래서 프레임들 마다 draw/render할 때 2개의 게임시간이 가능하다. 예를 들어 게임상태를 10번 업데이트하고 난 후 장면을 나타내려고 한다. 랜더링은 10번째와 11번째 게임업데이트 사이에 될 것이다. 그래서 10.3 쯤에 랜더링이 가능 할 것이다. 보간 값은 그 때 0.3을 유지하게 된다. 예들 들자면 : 차가 다음과 같은 게임 시간으로 움직인다 :

 

    position = position + speed;

 

만약 10번째 게임시간에 500이라는 위치에 있을때 속도는 100이다. 그 후 11번째 게임 시간에 위치는 600일 것이다. 그렇다면 차는 랜더링 시에 어느 위치에 있겠는가? 마지막 게임시간의 위치에 있게 할것이다(여기서는 500). 하지만 더 좋은 방법은 정확한 10.3 위치를 예상하는 것이다. 이와 같은 것이다 :

 

    view_positon = position + (speed * interpolation))


 차는 530 위치에 그려질 것이다. 그래서 기본적으로 보간 값은 이전 게임시간과 다음(previous = 0.0, next = 1.0) 사이에 값을 포함하고 있다.  랜더링 시간에 차/카메라/…가 배치될 때 "예상"함수를 어디에 만들어야 하는가? 예상함수를 객체의 속도 또는 조정, 회전 속도에 기초를 둬야 한다. 이것은 복잡함을 필요로 하지 않다. 왜냐하면 우리는 단지 프레임사이를 부드럽게 하려고 할 뿐이기 때문이다. 충돌을 감기 되기 전에 객체가 다른 객체로 표현되어지는 것이 실제로 가능하다. 그러나 이전에 봐왔듯이 게임은 초당 25프레임으로 업데이트 되고 있다. 그러므로 이와 같이 일이 일어날때 에러는 순식간에 보여진다. 사람 눈으로는 거의 알아차리기 어렵다.

 

느린 하드웨어

 대부분의 경우 update_game()은 display_game()보다 훨씬 적은 시작을 필요로 한다. 사실상 우리는 심지어 느린 하드웨어 위에서도 update_game() 함수가 초당 25번 실행된다고 예상한다. 비록 게임이 초당 15프레임으로 화면을 보여줄지라도 많은 문제없이 플레이어의 입력을 다루고 게임상태를 업데이트할 것이다.

 

빠른 하드웨어

 빠른 하드웨어 위에서 게임은 일정하게 초당 25프레임을 유지 할 것이다. 그러나 화면에 업데이트는 되는 것은 이것보다 빠를 것이다. 보간/예상 함수는 높은 프레임레이트에서 돌아가는 멋진 효과를 만들어 낼 것이다. FPS를 속이는 좋은 방법이다. 왜냐하면 매 프레임 레이트마다 게임 상태를 업데이트 하지 않는다. 내가 설명한 두번째 방법보다 높은 FPS를 가지고 있다.

 

결론

 FPS에 독립적인 게임상태를 만드는 것은 가장 이상적인 게임루프 구현으로 보인다. 하지만 disply_game() 함수를 예상하는 것을 구현해야 한다. 그러나 어렵지 않다.

 

종합 결론

 게임루프는 생각한 것보다 좀 더 많은 것을 가지고 있다. 우리는 4가지 가능한 구현을 살펴 보았다. 그 중 하나는 확실하게 피해야 할 것이다. 그 하나는 가변FPS에 따르는 게임속도이다. 모바일 장치에게 일정한 프레임레이트는 좋고 간단한 해결책이다. 그러나 모든 하드웨어에 쓰이기에는 별로이다. 가장 좋은 게임루프는 높은 프레임레이트를 위해 예상을 사용하는 게임속도에 독립적인 FPS이다.

만약 일부로 예상 함수를 사용하지 않는다면 최대 프레임레이트에서 작업할 수 있다. 하지만 적당한 게임 업데이트 레이트가 느리거나 빠른 하드웨어 모두 고장을 내는 것을 발견 할 수 있을 것이다. 이제 멋진 게임을 위한 코드를 생각해 보자!

 

Koen Witters

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

출처 : http://dewitters.koonsolo.com/gameloop.html

 

발번역이 올려도 될지 모르겠습니다. 이제 겨우 AI 공부를 끝내고 스프라이트 툴을 만지고 있습니다 ^^

말없이 많이 도움을 받아가서 부끄럽지만 올립니다 ^^;;;;;

 

의역 및 오역이 많으니 이상한 부분은 원문을... 번역이 더 머리 아플지도...


출처 : http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=30&MAEULNO=12&no=235&page=1

반응형

'Programming > C/C++' 카테고리의 다른 글

IME 소스 (한글)  (2) 2010.11.26
[C++] 형변환 (Typecasting) - const_cast, reinterpret_cast, static_cast, dynamic_cast  (0) 2010.09.28
IME 관련  (0) 2010.09.10
TLS (Thread Local Strorage)  (0) 2010.08.30
TCHAR을쓰면 바뀌는 함수들  (0) 2010.07.27
Posted by blueasa
, |

C#에서는 C++에서 사용하던 memset, memcpy 등의 함수를 사용할 수 없다.

 

 

배열을 초기화 하기 위해서는 아래의 함수를 사용

Array.Clear(array, index, length);

 

public static void Clear (
   
Array
array,  // 포함된 요소를 지울 Array입니다.
    int index,     // 지울 요소 범위의 시작 인덱스입니다.
    int length    // 지울 요소의 개수입니다.
)

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

 

배열카피는 아래의 함수 이용

Array.Copy(SourceArray, SourceIndex, DestinationArray, DestinationIndex, Length);

 

public static void Copy (
    Array sourceArray,        // 복사할 데이터가 들어 있는 Array입니다.
    int sourceIndex,           // 복사가 시작되는 sourceArray의 인덱스를 나타내는 32비트 정수입니다.
    Array destinationArray, // 데이터를 받는 Array입니다.
    int destinationIndex,     // 저장이 시작되는 destinationArray의 인덱스를 나타내는 32비트 정수입니다.
    int length                    // 복사할 요소의 개수를 나타내는 32비트 정수입니다.
)

출처 : http://rockset76.blog.me/10078890919

반응형
Posted by blueasa
, |

중요한 작업하고 있는데 아래와 같이 팝업창 뜨며 계속 다시 시작하라고 합니다.

전 나중에 다시 시작하고 싶은데 말입니다. ㅡㅡ;;


 
몇 번을 '나중에 다시 시작' 누르지만

어느 순간 잘 못 눌러 '지금 다시 시작'을 누르고 있습니다. ㅡㅡ;;


저장 안 된 작업중인 문서를 보며 수습해 보지만 늦었습니다.

망호니ㅏ러ㅠㅎ핯ㅍ챠ㅐ퍼ㅐㅁ니러ㅣㅏ


오늘 처음 알았습니다. 팝업창 끄는 방법이 있다는 것을... ㅡㅡ;;

이 쉬운 것을 모르고 몇년을 불편하게 살았는지... ㅠㅠ


방법은 간단합니다.

==============================================

'윈도우키 + R'을 누른 후 'net stop wuauserv' 타이핑 합니다.  끝.  ㅇㅇ

==============================================


단점은 재부팅 후 변경된 설정이 리셋 된다는 것 입니다.

즉, '다시 시작' 팝업창 뜰때 마다 위 작업을 해줘야 합니다.


뭐 이렇게 명령이 긴지... 까먹으면 다음에 또 고생합니다.

그래서 전 오늘 외우기로 했습니다.  제 맘대로 풀어서 외웁니다.


net stop wuauserv(Windows Update Ask pop-Up SERVice)


자주 필요성 느끼신 분은 꼭!! 외우시길~^^;;

 

추가내용
==============================================
똥똥파리파리 님이 좋은 아이디어 주셨습니다.^^

외우기 번거로운 분들은

메모창 열어서 'net stop wuauserv' 타이핑 후 확장자를 bat로 변경하여 저장합니다.

그리고 바탕화면에 두시고 필요할 때 마나 실행하시면 되겠습니다.^^


출처 : http://doriclan.blog.me/90094516278

반응형
Posted by blueasa
, |

public class BaseForm : Form
{
새로운 기능에 정의되는 멤버 변수 ;
새로운 기능에 정의되는 메서드();
}


실제 윈도우 폼을 생성하시고

public partial class Form1 : BaseForm
{

}
이렇게 하시면 됩니다.

그리고 BaseForm은 abstruct 걸면 디자이너가 안뜹니다.

BaseForm에 메서드같은경우 가상메서드로 선언해두시면

폼마다 오버라이드로 재정의해서 쓸수 있습니다. ^^;;


출처 : http://www.hoons.kr/Board.aspx?Name=QACSHAP&Mode=2&BoardIdx=20382&Key=Title&Value=%ec%83%81%ec%86%8d
반응형

'Programming > C#' 카테고리의 다른 글

Dictionary To ComboBox BindingSource  (0) 2010.09.27
배열 초기화 및 카피 - C ( memset , memcpy)  (0) 2010.09.15
interface(C# 참조)  (0) 2010.09.14
abstract(C# 참조)  (0) 2010.09.14
이벤트 만들기 (초보자)  (0) 2010.09.14
Posted by blueasa
, |