철도 건널목 이야기

철도와 일반 도로가 평면 교차하는 곳에는 잘 알다시피 건널목이라는 게 설치된다.

사용자 삽입 이미지

철도 차량은 어지간한 육상 자동차하고는 잽도 안 되는 어마어마한 질량을 갖고 있고 이를 바탕으로 억소리나는 운동 에너지를 자랑한다. 그렇잖아도 이렇게 무거운 데다 쇠로 된 바퀴로 쇠로 된 길을 달리기 때문에 철도 차량은 가감속이 무진장 더디다. 새마을호가 비상 제동 수준의 강한 제동을 걸어야 시속 100km 상태에서 무려 600m를 더 진행한 후에야 완전히 멈춰 설 수 있을 정도라고 알려져 있다.

이것이 무엇을 의미할까? 열차가 한번 달리기 시작하면 주변의 다른 사람이나 자동차들이 알아서 피해야 한다. 열차는 장애물 앞에서 딱 멈춰 설 수가 없다.
그러니 건널목에서는 열차의 통과 우선순위가 언제나 갑이다. 사람과 자동차들이 기다리지, 열차가 잠시 멈췄다가 사람과 자동차들을 피해 다니는 일은 없다.

건널목에서 충돌 사고가 났다 하면 육중한 열차는 하나도 탈이 없지만 자동차는 형체를 알아볼 수 없는 개발살이 난 채로 수십~100수십 미터를 질질 끌려가며, 사람이 치이기라도 하면 즉시 끔살 당한다. 철도 차량 객차 내부에 안전벨트가 없는 이유를 알 수 있을 것이다. 자동차와는 달리, 사람이 밖으로 튕겨져 나갈 정도로 급정거를 할 일이 없기 때문.

물론, 속도를 주체하질 못한다는 특성이 장점으로만 작용하는 건 아닌지라, 장애물과 충돌한 열차가 그래도 뒷부분이 도무지 멈춰 서질 못한 나머지 탈선해서 앞 객차를 타넘고 오르는 일이라도 생기면, 철도로도 대형 인명 참사가 얼마든지 생길 수 있다.

건널목에도 세 가지 모델이 있어서 비교적 통행량이 많은 건널목은 표지판+노란 색의 차단기+경보기 3콤보가 모두 갖춰져 있지만, 잉여스러운 장소에는 몇몇 요소가 생략된 건널목도 있다. 자기 폐색 구간에 열차가 바퀴가 닿은 게 감지되면 띵동~ 띵동~ 소리와 함께 차단기가 내려온다. 그리고 열차가 다 지나가면 다시 차단기는 올라간다.

우리나라의 교통 관련법에 의하면 철길과 도로의 교차는 45도보다 작은 각도로 하지는 않게 되어 있다. 대부분이 90도 수직이지만, 그래도 시골 도로를 보면 예각 교차도 그럭저럭 볼 수 있다. 건널목 사고를 줄이기 위해 요즘은 많은 건널목이 입체화되었으며, 특히 오늘날 새로 건설하는 철도는 건널목을 전혀에 가깝게 만들지 않는다고 생각하면 된다.

그럼에도 불구하고 경원선은 서빙고 역 일대와 회기-외대앞 역 사이에 일반열차도 아닌 전동차가 수시로 다니는 선로에 건널목이 있으니 안타까운 현실이다. 어서 입체화가 되어야 할 것이다.

본인은 어렸을 때 주변에 중앙선 철길이 있는 지역에서 자랐다. 철길이 지역을 심리적으로 양분하는 효과는 무척 컸다. 옛날에 나라 분위기가 더 살벌하던 시절에는 ‘철길로 다니지 맙시다’와 더불어, 레일 위에다 돌을 올려 놓아서 열차 운행을 고의로 방해하거나 열차를 전복시키는 자는 무슨무슨 형에 처해진다는 경고문도 꼭 붙어 있었다.

우리나라에 발생했던 상당히 참혹한 건널목 사고로 철덕이라면 1970년의 장항선 모산 수학여행 참사를 기억할 것이다. 그건 아주 극단적인 예이다.
2002년 5월 1일에는 잘 알다시피 전라선 상행 새마을호에서 세계적으로 유례를 찾기 힘든 괴이한 3콤보 건널목 인명 사고가 난 적이 있다.

오늘날에도 전국에서 건널목 사고로 목숨을 잃는 사람이 연간 10~20여 명은 있는 모양이다. 이것도 물론 2, 30여 년 전의 100수십여 명에 비해서는 매우 크게 감소한 것이다.

비교적 최근인 2011년 7월 30일에는 좀 어처구니없는 사고가 났다. KTX가 건널목에서 제네시스 승용차와 충돌하여 여성 운전자가 목숨을 잃었는데.. 아니, 고속선에서 시속 300km로 질주하고 있을 KTX가 호남선 구간도 아닌 무슨 연기군에서 웬 건널목 사고에 연루되는 게 가능한지 궁금할 것이다. 이 KTX는 대전-서울 구간을 기존선으로 달리는 녀석이었다.

건널목을 건너던 중에 차가 시동 꺼져 뻗은 것도 아니고, 자세한 경위를 들어 보니 정말 “아 씨바 할 말을 잃었습니다” 급이다. 차가 건널목을 통과하고 있던 도중에 차단기가 내려와 버렸다.;; 그래서 그 차는 철길에 갇혀 고립됐다. 타이밍 한번 정말 더럽다. ㄷㄷㄷㄷ

경부선은 복선이기 때문에 철길의 폭과 양쪽 건널목 사이의 간격이 단선보다 훨씬 더 크다. 그래서 이런 케이스가 가능했다. 복선 건널목이 단선 건널목보다 더욱 위험하다는 건 두말 할 나위가 없다.

마치 고속도로 톨게이트에서 하이패스가 인식되지 않아서 차단봉이 내려오더라도 당황하지 말고 일단 통과는 해야 하듯, 이때도 차 범퍼로 차단기의 철길 안쪽면을 툭 치기만 하면 차단기는 다시 올라가게 돼 있다. 차단기는 위험을 알려서 사람을 살리려고 만들어진 장치이지 사람을 잡으려고 만들어진 게 아니다.

그랬는데, 지금은 이미 고인이 된 그 운전자는 당황하여 그대로 차를 세운 채 철길 위에서 아무 조치도 취하지 않았고, 하다못해 밖으로 탈출하지도 않았다. 마치 자신이 철길 밖의 건널목 앞에서 기다리고 있는 것처럼 그냥 가만히 있었다. 열차가 알아서 정지해 줄 거라고 생각했는가 보다.

충돌 직전 몇 초 동안 KTX 열차가 비상 제동을 걸면서 필사적으로 경적을 빵빵 울릴 때 그분, 무슨 생각을 했을까? 그 뒤 시밤쾅! 그 고급 승용차는 박살 난 채 전복되어 나뒹굴었다. 이건 뭐 스크린도어에 끼인 채로 열차가 출발해 버려서 사람이 죽은 것 같은 그런 기괴한 사고이다만, 더 근본적으로는 고인이 철도에 대해서 너무 무지하여 벌어진 참극이 아닐 수 없다.

우리나라 철도 당국은 사고의 원흉인 평면교차와 건널목을 없애려고 많은 노력을 기울이고 있다. 신호 받으면서 수시로 가다 서다 하기가 어려운 교통수단일수록 자기만의 독립된 길에서 쭉 가기만 하게 해 주는 게 당연히 유리하니까 말이다.

다만 철도가 너무 입체화만 되면 사람의 발이 철길과 직접 교감을 할 기회가 없어지니, 발을 어느 정도 뻗어야 표준궤 궤간인지 감을 익히기가 어렵다. 난 고향에 가면 철길 건널목에 도보로 들를 일이 있을 때 그거 연습을 하곤 한다.

.
.

그리고 또 여담 하나.

<다리>(Bridge)라고 2003년에 체코에서 만들어진 단편 독립영화가 있다. 원제목은 Most인데, 이건 영어의 형용사/부사를 뜻하는 most가 아니라, 자기네 체코 어로 bridge라는 뜻이다. 스토리는 대략 이렇다.

어느 강에 철교가 놓여 있는데, 이게 배가 지나갈 때는 공간 확보하려고 다리를 들어올리게 돼 있다. 다시 말해 이 다리는 승강교이며, 자동차가 아니라 배와 열차 사이의 평면교차로이다.
신호 지시에 따라 다리를 올리고 내리는 관리자가 있고, 그에게는 어린 외아들이 있다. 그런데 어느 열차의 기관사가 적색 정지 신호를 못 본 채, 다리가 열려 있는 철교 구간으로 열차를 진입시키고 만다. 그러고 보니 이 열차는 가감속의 매우 힘든 증기 기관차이며, 영화의 배경은 20세기 초중반으로 보인다.
다리 관리실 근처에서 놀고 있던 아들은 멀리서 이 열차를 보고 황급히 놀라지만, 아무리 소리를 질러도 배경 소음 때문에 아버지는 상황 파악을 못 한다. 아들은 열차가 끊어진 다리로 더 진입을 못 하게 하려고 선로 쪽으로 달려가다가 잘못해서 다리의 부품에 끼이고 만다.
아버지는 그제서야 모든 상황을 파악한다. 지금이라도 다리를 황급히 내리면 열차를 아주 간신히 다리 건너편으로 통과시킬 수는 있다. 하지만 다리가 내려가면서 부품에 끼여 있던 아들이 끔살 당하게 된다. 그 반면, 그 조치를 취하지 않으면 아무것도 모르는 열차는 끊어진 선로 너머 강으로 추락하고 수백 명의 승객들이 죽거나 다친다.
이때 애 아버지는 눈물을 머금고 결국 승객들을 살리는 길을 택한다. 다리를 내리는 스위치를 누른 후 절규한다. 열차 안의 승객들은 아무 일도 없었다는 듯 무심히 다리를 통과하는데, 예전에 굉장히 방탕하게 살던 한 여인만이, 이 일의 진실을 알게 된다. 그래서 예전의 방탕한 생활을 딱 끊고 결혼도 하고 바른 생활로 돌아오더라는 내용.


이 영화는 기독교적인 메시지를 의도하고 만들어졌다. 그 다리 관리인이 자기 아들을 희생시켜서 수백 명의 승객들을 살렸듯이 인간을 지으신 하나님도 자신의 아들을 십자가에 죽게 하셔서... 이하 생략이다.

영화 제작자의 의도는 알겠으나, 설정이 좀 억지스러운 면모가 있긴 하다. 오늘날 철도에 구비되어 있는 기본 중의 기본 시스템인 ATS 하나만 있어도 적색 신호를 무시하고 가는 열차는 얄짤없이 자동으로 멈춰 서게 된다. 하지만 저 때는 아예 증기 기관차가 다니던 시절이니 기관사의 시력과 재량이 철도 안전에 직접적인 영향을 끼칠 수도 있었겠다.

요즘은 그런 원시적인 후진국형 철도 사고는 근무 기강이 빠질 대로 다 빠진 막장이거나, 진짜 철도 인프라가 100년 전이나 지금이나 변한 게 없는 곳에서나 난다.
아무튼 철도는 디테일을 알면 알수록 더욱 재미있다.

Posted by 사무엘

2012/05/27 08:24 2012/05/27 08:24
, ,
Response
No Trackback , No Comment
RSS :
http://moogi.new21.org/tc/rss/response/687

C++11의 람다 함수

프로그래밍을 하다 보면, 어떤 컨테이너 자료구조의 내부에 있는 모든 원소들을 순회하면서 각 원소에 대해 뭔가 동일한 처리를 하고 싶은 때가 빈번히 발생한다.
그 절차를 추상화하기 위해 C++ 라이브러리에는 algorithm이라는 헤더에 for_each라는 템플릿 함수가 있다. 다음은 이 함수의 로직을 나타낸 C++ 코드이다. 딱히 로직이라 할 것도 없이 아주 직관적이고 간단하다.

template<typename T, typename F>
void For_Each_Counterfeit(T a, T b, F& c)
{
    for(T i=a; i!=b; ++i) c(*i);
}

C++은 템플릿과 연산자 오버로딩을 통해 자료구조에 대한 상당 수준의 추상화를 달성했다.
iterator에 해당하는 a와 b는 그렇다 치더라도, 여기서 핵심은 c이다.
F가 무엇인지는 모르겠지만, 어쨌든 c는 함수 호출 연산자 ()를 적용할 수가 있는 대상이어야 한다.
그럼 무엇이 가능할까? 여러 후보들이 있다.

일단 C언어라면 함수 포인터가 떠오를 것이다. 함수 포인터는 코드를 추상화하는 데 지금까지 고전적으로 쓰여 온 기법이다.

void foo(char p);

char t[]="Hello, world!";
For_Each_Counterfeit(t, t+strlen(t), foo);

C++에서는 클래스가 존재하는 덕분에 더 다양한 카드가 생겼다. 클래스가 자체적으로 함수 호출을 흉내 내는 연산자를 갖출 수 있기 때문이다.

class MyObject {
public:
    void operator()(char x);
};

For_Each_Counterfeit(t, t+strlen(t), MyObject());

그리고 더욱 기괴한 경우이지만, 클래스 자신이 함수의 포인터로 형변환이 가능해도 된다.

class MyObject {
public:
    typedef void (*FUNC)(char);
    operator FUNC();
};

For_Each_Counterfeit(t, t+strlen(t), MyObject());

C++ 라이브러리에는 functor 등 다양한 개념들이 존재하지만, 그 밑바닥은 결국은 C++ 언어의 이런 특성들을 사용해서 구현되어 있다.
여기서 재미있는 점이 있다. 다른 자료형과는 달리 함수 포인터로 형변환하는 연산자 오버로드 함수는, 자신이 가리키는 함수의 prototype을 typedef로 미리 만들어 놓고 반드시 typedef된 명칭으로 선언되어야 한다는 제약이 있다. 이것은 C++ 표준에도 공식적으로 명시되어 있는 제약이라 한다.

이런 어정쩡한 제약이 존재하는 이유는 아마도 함수 선언문에다가 다른 함수를 선언하는 문법까지 덧붙이려다 보니, 토큰의 나열이 너무 지저분해지고 컴파일러를 만들기도 힘들어서인 것 같다. 이 부분에서는 아마 C++ 위원회에서도 꽤 고민을 하지 않았을까.
안 그랬으면 형변환 연산자 함수의 prototype은 아래와 비슷한 괴상한 모양이 됐을 것이다. 실제로 이 함수의 full name을 undecorate한 결과는 이것처럼 나온다.

    operator void (*)(char)();

비주얼 C++에서는 함수를 저렇게 선언하면 그냥 * 부분에서 '문법 에러'라는 불친절한 말만 반복할 뿐이지만, xcode에 기본 내장되어 있는 최신형 llvm 컴파일러는 놀랍게도 나의 의도를 간파하더이다. “함수 포인터로 형변환하려면 반드시 typedef를 써야 합니다”라는 권고를 딱 하는 걸 보고 적지 않게 놀랐다. 이런 차이도 맥북을 안 쓰고 오로지 비주얼 C++ 안에서만 틀어박혀 지냈다면 경험하기 쉽지 않았을 것이다. 우왕~

() 연산자 오버로딩은 this 포인터가 존재하는 C++ 클래스 멤버 함수이며 static 형태가 있을 수 없다.
그러나 함수 포인터로의 형변환 연산자 오버로딩은 this가 없으며 C 스타일의 static 함수와 같은 위상이라는 차이가 존재한다.
두 오버로딩이 모두 존재하면 어떻게 될까? 혹시 모호성 오류라도 나는 걸까?

그런 개체에 함수 호출 ()가 적용되는 경우, () 연산자가 먼저 선택되며, 그게 없을 때에 한해서 함수 포인터 형변환이 차선책으로 선택된다. 모호성 오류가 나지는 않는다.
포인터 형변환 연산자와 [] 연산자가 같이 있을 때 개체에 배열 첨자 참조 []가 적용되는 경우, 역시 [] 가 먼저 선택되고 그게 없을 때 포인터 형변환이 차선으로 선택되는 것과 비슷한 맥락이라 볼 수 있다.

그래서 클래스와 연산자 오버로딩 덕분에 저런 문법이 가능해졌는데, C++11에서는 그걸로도 모자라 또 새로운 문법이 추가되었다. 이른바 람다 함수.

For_Each_Counterfeit(t, t+strlen(t), [](char x) { /* TODO: add your code here */ } );

람다 함수는 코드가 들어가야 할 곳에 함수나 클래스의 작명 따위를 신경쓰지 않고 코드 자체만을 직관적으로 곧장 집어넣기 위해 고안되었다. 세상에 C++에서 OCaml 같은 데서나 볼 수 있을 법한 개념이 들어가는 날이 오다니, 신기하지 않은가?

덕분에 C++은 C언어 같은 저수준 하드웨어 지향성에다가 성능과 이념을 적당히 절충한 수준의 객체지향을 가미했고, 90년대 중반에는 템플릿 메타프로그래밍 개념을 집어넣더니, 이제는 함수형 언어의 개념까지 맛보기로 도입한 가히 멀티 패러다임 짬뽕 언어가 되었다.

함수를 값처럼 표현하기 위해서 lambda 같은 예약어가 별도로 추가된 게 아니다. C/C++은 태생상 예약어를 함부로 추가하는 걸 별로 안 좋아하는 언어이다. (그 대신 문법에 혼동이 생기지 않는 한도 내에서 기호 짬뽕을 좋아하며 그래서 사람이나 컴파일러나 코드를 파싱하는 난이도도 덩달아 상승-_-) 보아하니 타입을 선언하는 부분에서는 배열 첨자가 먼저 오는 일이 결코 없기 때문에 []를 람다 함수 선언부로 사용했다.

람다 함수는 다른 변수에 대입되어서 두고두고 재활용이 가능하다. 그래서 C/C++에서는 전통적으로 가능하지 않은 걸로 여겨지는 함수 내부에서의 함수 중첩 선언을 이걸로 대체할 수 있다.

어떤 함수 안에서 특정 코드가 반복적으로 쓰이긴 하지만 별도의 함수로 떼어내기는 싫을 때가 있다. 굳이 함수 호출 오버헤드 때문이 아니더라도, 해당 코드가 그 함수 내부의 지역변수를 많이 쓰기 때문에 그걸 일일이 함수의 매개변수로 떼어내기가 귀찮아서 그런 것일 수도 있다.
이때 흔히 사용되는 방법은 그냥 #define 매크로 함수밖에 없었는데 이때도 람다 함수가 더 깔끔하고 좋은 해결책이 될 수 있다. 람다 함수는 선언할 때 캡처라 하여 주변의 다른 변수들을 참조하는 메커니즘도 언어 차원에서 제공하기 때문이다.

그렇다면 의문이 생긴다.
람다 함수는 그럼 완전히 새로운 type인가?
기존 C/C++에 존재하는 함수 포인터와는 어떤 관계일까?
정답부터 말하자면 이렇다. 람다 함수는 비록 어쩌다 보니 () 연산을 받아 주고 함수 포인터가 하는 일과 비슷한 일을 하게 됐지만, 활용 형태는 함수 포인터하고 아무 관련이 없으며 그보다 더 상위 계층의 개념이다.

템플릿과 연동해서 쓰인다는 점에서 알 수 있듯, 람다 함수는 함수 포인터와는 달리 calling convension (_stdcall, _cdecl, _pascal 나부랭이 기억하시는가?)이고 리턴값이 나발이고간에 아무 상관이 없다. 그저 코드상에서 함수를 값처럼 다루는 걸 돕기 위해 존재하는 추상적인 개념일 뿐이다. 뭔가 새로운 type이 아니기 때문에 람다 함수를 변수에다 지정할 때는 auto만을 쓸 수 있다. 즉, 다른 자료형이 아닌 람다에 대해서는 auto가 선택이 아니라 필수라는 뜻이다.

auto square=[](int x) { return x*x; };
int n = square(9); //81

square는 템플릿 같은 함수가 아니다. 이 함수의 리턴값은 x*x로부터 자동으로 int라고 유추되었을 뿐이다. [](int x) -> int 라고 명시적으로 리턴 타입을 지정해 줄 수도 있다. 구조체 포인터의 멤버 참조 연산자이던 -> 가 여기서 또 화려하게 변신을 한 셈임. 우와!

또한, sizeof(square)을 한다고 해서 포인터의 크기가 나오는 게 아니다. 사실, 람다 함수에다가 sizeof를 하는 건 void에다가 sizeof를 하는 것만큼이나 에러가 나와야 정상이 아닌가 싶다. 그런 개념하고는 아무 관계가 없기 때문이다.

람다는 함수 포인터가 아니기 때문에, square에다가 자신과 프로토타입이 같은 다른 람다 함수를 대입할 수 있는 건 아니다. 함수 포인터의 역할과 개념을 대체할 뿐, 그 직접적인 디테일한 기능을 대체하지는 못한다. 그렇기 때문에 콜백 함수를 받는 문맥에서

qsort(n, arrsize, sizeof(int), [](const void *a, const void *b) { return *((int*)a) - *((int*)b); } );

구닥다리 C 함수에다가 최신 C++11 문법이라니, 내가 생각해도 정말 변태 같은 극단적인 예이다만,
이런 식으로 람다 함수를 집어넣을 수도 없다.

요컨대 람다 함수는 코드의 추상화에 도움을 주고 종전의 함수 포인터 내지 #define, 콜백 함수 등의 역할을 대체할 수 있는 획기적인 개념이다. C++ 철학대로 디자인된 여타 C++ 라이브러리와 함께 사용하면 굉장한 활용 가능성이 있다. 그러나 이것은 함수 포인터에 대한 syntatic sugar는 절대 아니라는 걸 유의하면 되겠다.

Posted by 사무엘

2012/05/24 08:38 2012/05/24 08:38
, , ,
Response
No Trackback , 15 Comments
RSS :
http://moogi.new21.org/tc/rss/response/686

나의 신앙 자가진단

※ 나는 왜 예수님을 믿는가 -- 크게 작용한 요인들
  • 세상 그 어느 종교도 창조주가 피조물에게 죽임을 당했다고 가르치지 않으며, 교주가 부활했다고 가르치지 않고, 또 이 정도로 역사적으로 방대한 증거와 증인들을 갖추고 있지 않으므로
  • 인간이 자기 노력과 근성으로 신을 찾아가는 게 아니라, 신이 먼저 인간을 찾아주고 은혜와 사랑을 베풀었다고 가르치므로
  • 없어졌으면 애시당초 진작에 씨가 말라 버렸을 정도로 황당하고 믿어지지 않는 교리를 갖고 있는데, 아직까지 당당히 존속해 있다는 것만으로도 최소한 무시할 수는 없고 한번 살펴볼 가치가 있다고 여겨졌으므로
  • 이 정도로 무수히 많은 이단들이 압도적으로 집착할 정도이면, 웬지 이 바닥에 분명 진리가 있을 거라는 예감이 들어서
  • 성경은 그 논조와 내용을 볼 때 인간이 쓸 만한 책이 절대 아니라는 확신이 들어서 (가령, 정치적으로 치우침이 없음. 인간 자신에게 절대 이롭지 않은 내용이 지나치게 장황하게-_- 많이 들어있음)
  • 그래도 몇몇 증명 불가능하고 이해가 안 되는 사항들만 일단 믿고 나면, 이를 바탕으로 전개되는 각종 교리와 윤리관은 아주 논리적이고 이성적이고 합리적이고 인간에게 건전하다는 게 너무 분명하게 확 느껴져서
  • 죄 문제라는 인간에 대한 상태 진단과, 그 해결책에 너무나 공감이 가서. 최소한 줘도 못 먹는 사람이 되지는 말아야지?
  • 차라리 예수 그리스도라는 절대적인 의의 기준이 온갖 상대주의· 다원주의보다는 훨씬 더 명확하고 깔끔하고 건전하고 뒤끝이 없다는 생각이 들어서 (다 사회 구조 탓이다, 그 상황에서는 누구나 그럴 수밖에 없다 등등)

그래서 내가 지금 어떻게 되었는지에 대해서는 이 글을 참고할 것.

※ 나는 왜 예수님을 믿는가 -- 조금 작용한 요인들

  • 개독안티들의 무례하고 표독스러운 말투에, 사실 여부를 떠나 괜히 반발심과 환멸을 느껴서 (다른 건 몰라도 저놈들 말은 절대로 듣지 말아야겠다는 식)
  • 역사적으로 기독교의 과오라고 알려진 것들이 상당수가 기독교와는 아무 관계가 없고, 사실은 크리스천들도 오히려 피해자라는 걸 알게 되어서
  • 파스칼의 팡세에 나오는 수준의 간단한 변증론. 가령,
    “지금 예수 믿었는데 나중에 알고 보니 사실 없는 게, 지금 안 믿었는데 진짜로 지옥이 있어서 낭패 보는 것보다 더 안전하고 리스크가 적다.”
    “신이 없다고 단정짓기엔 인간의 지식은 너무 좁고 빈약하다” 같은 식.
  • 내세와 심판이 있을 거라는 양심의 자극. 죽음에 대한 두려움
  • 성경이 과학적으로도 옳다는 걸 뒷받침하는 몇몇 자료들
  • 이 정도 교리면, 정말 만에 하나 성경의 내용이 다 거짓이고 허구이고 설령 근거 없이 맹목적으로 믿는다 해도, 크게 손해 볼 게 없다고 생각되어서. 성경은 최소한 날 골탕먹이려고가 아니라 날 '위해서' 기록된 책이라는 느낌이 와서

※ 내 신앙관에 영향을 거의 끼치지 않은 것들

  • 좋든  싫든, 주변 교회 사람들의 행동과 평판
  • 잘한 것이든 못한 것이든, 해당 종교계에서 유명한 사람들의 언행 (그 사람들이랑 나랑 도대체 무슨 상관이냐? 나는 베르테르 효과 같은 것과는 담을 쌓고 지냄)
  • 세상 불신자들로부터의 평판, 매스미디어에 묘사된 이미지
  • 육신을 들뜨게 하거나 흥분시키거나 만족시키는 종교심. 나는 그런 부류의 종교심은 이미 철도교로 다 충족하고 있기 때문에 그런 종교에다 내 영원을 걸지는 않는다.
  • 기복신앙

하지만 현실에서는 저런 것들을 보고 교회를 나가거나 종교를 선택하는 사람들이 무진장 많다. ㅜㅜ

※ 지금은 발현되지 않고 있지만, 언젠가 깊은 시험에 들고 신앙 면역 체계가 무너졌을 때 큰 위험이 될 수 있는 잠재적인 암적 요소들

  • 성경에서 여전히 잘 이해되지 않고 해결이 안 된 의문이나 논리적 모순(처럼 보이는 것들) 몇 군데. 목사님에게 여쭈거나 주석서를 봐도 알 수 없는 것들
  • 성경이 밥 먹여 주냐... 같은 부류의 유치하지만, 좁은 길을 가는 성도에게 결코 무시할 수 없는 시험. 현실의 염려 (눅 8:14)
  • 신앙생활이 매너리즘으로 변질돼 가는 것
  • 하나님의 뜻을 도무지 알 수 없을 때. 이것도 하지 말고 저것도 안 하면 도대체 뭘 하라는 건지 알 수 없는 상황이 들이닥치는 것

Posted by 사무엘

2012/05/21 19:28 2012/05/21 19:28
, , , ,
Response
No Trackback , 4 Comments
RSS :
http://moogi.new21.org/tc/rss/response/685

1.

옛날에 폰 노이만(폰 노이만 구조라는 컴퓨터 근간을 닦은 사람)이라는 사람은 기계어로 직접 컴퓨터에다 코딩을 하는 기계어 매니아였다. 기계어가 너무 불편하다고 어느 제자가 어셈블리 비슷한 상위 계층 언어를 만들려 하자 “귀한 컴퓨터 자원으로 쓸데없는 짓이나 한다”고 그를 나무랐다.;;
이거 마치 희대의 저격수인 시모 하이하가 조준경 그딴 걸 왜 쓰냐고 나무란 것과 비슷한 맥락 같다.;;
 
그 반면, 데이크스트라(다익스트라. 그래프 탐색 알고리즘을 고안한 그 사람)는 어셈블리/기계어 같은 언어를 비생산적이고 삽질스럽다고 아주 강하게 디스한 것으로 잘 알려져 있다. 그도 그럴 것이, 구조화 프로그래밍을 주장하면서 GOTO문을 배격한 사람이 기계스러운 BRANCH 따위가 난무하는 저급 언어를 좋아할 리가 없겠다.
 
둘 다 우주괴수급의 천재 수학자 및 전산학자이다만, 이런 식의 관점의 차이가 존재하는가 보다. 재미있는 일이다.
 
2.

밸브 코퍼레이션의 창립자 게이브 뉴웰 (카운터 스트라이크, 하프 라이프, 포탈 등의 게임 개발사)
페이스북의 창립자인 마크 주커버그 (나보다 더 어림..)
마이크로소프트의 창립자인 빌 게이츠 (설명 불필요)
 
억만장자 IT 기업인인 이들은 모두 하버드 대학 중퇴자라는 공통점이 있다. 다 미국인이기도 하고.

3.

개발자가 소프트웨어를 팔아서 먹고 살려면

(1) 관공서나 기업에서 구입하지 않을 수 없는 핵심적인 프로그램을 개발 (교육이나 업무 분야)
(2) 하드웨어에 같이 들어가는 프로그램을 개발해서 하드웨어와 함께 판매
(3) 온라인 게임 개발 (늘 서버 접속을 하기 때문에 이용료 징수 가능)
(4) 아니면 개인을 대상으로도 유료 판매가 가능한 유통 경로(앱스토어, 스마트폰 등)를 거치는 프로그램 개발

중 하나로는 가야 할 것 같다. 저 네 가지 말고 혹시 다른 방법이 있을까?

4.

내가 맥 OS에 매력을 느끼는 큰 이유 중 하나는.. 폰트 래스터라이저가 정말 짱이라는 점.
똑같은 글꼴을 화면에 찍어 내는 퀄리티가 서로 게임이 안 되는 수준이니...

사용자 삽입 이미지
위는 Windows, 아래는 맥이다.
Windows는 ClearType을 시키면 맑은 고딕처럼 전용 힌팅이 들어간 글꼴이 아니면 그냥 안티알리어싱이 없는 것보다 약간 나은 정도로만 찍히는 반면.
Mac은 힌팅이 없다시피한 글꼴도 Adobe Reader 이상의 퀄리티로 찍어 준다!

5.

그나저나 맥 OS는 Finder (윈도우로 치면 탐색기)에서 파일이나 디렉터리의 이름을 바꾸는 게 엔터이고, 실행하거나 여는 게 Cmd+아래라니 참 희한하다. 윈도우라면 이름 바꾸는 건 F2이고, 여는 게 응당 엔터인데 말이다.

6.

과거에 MS 오피스가 2003에서 2007로 버전업되었을 때 비주얼이 화려해지고 좋아진 기능이 분명 적지 않았지만, 내게는 굉장히 마음에 안 드는 변화도 있었다. 그것 중 하나는 파워포인트에서 '컬러 타자기' 애니메이션 효과가 굉장히 느려져서 랙이 심해지고 프레임 수가 감소한 것이었다. 글자가 말 그대로 타자기로 찍듯이 한 글자씩 천천히 나타나는 것 말이다. 그렇게 현란하거나 CPU의 부하가 심한 효과도 아니다.

그랬는데 2010을 나중에 써 보니, 마치 2003처럼 애니메이션이 다시 매끄러워져 있었다.
혹시 컴퓨터가 빨라지고 화면 해상도가 낮아져서 그런 게 아닌가 싶어서 컴퓨터를 바꿔서 확인해 보았다.
그랬더니 같은 1280*1024 화면이라도 역시 2010에서는 Core2 duo급 컴에서도 매끄럽게 나오는 반면, 2007에서는 쿼드코어 i5급 컴에서도 버벅거렸다.

그래서 이것은 소프트웨어적인 알고리즘 개선 덕분이라는 결론을 내리게 됐다. 2007과 2010 사이엔 이런 차이도 존재하는가 보다.

7.

근래엔 <날개셋> 한글 입력기의 구성 파일들에 대해서 바이러스 및 악성 코드 진단 문의가 부쩍 늘었다. 그래서 그에 대한 개발자의 공식 입장을 내 홈페이지에다가도 게시할 필요를 느끼게 됐다.

결론부터 말하자면 당연히 “바이러스 아님”이다. 모든 프로그램들은 바이러스도, 안티바이러스(일명 백신)도 알지 못하는 100% 청정 컴퓨터에서 개발되며, 개발 환경에서 갓 빌드된 직후의 실행 파일들이 곧바로 설치 패키지로 포장된다. 바이러스 같은 게 들어갈 일이란 없다. 이 일 때문에 본인에게 문의하면 언제나 동일한 대답밖에 돌아올 게 없으며, 그 외에 더 할 말이 없음을 이 자리에서 밝히는 바이다.

더 근본적으로는 실행 파일과 MSI 패키지가 디지털 서명을 받지 못한 관계로, 웹브라우저부터가 빨간 경고와 함께 <날개셋> 프로그램의 다운로드를 저지(discourage)하는 것도 좀 아쉬운 점이다. 이건 훗날 프로그램이 더 나은 수익원과 배포 통로를 확보했을 때에나 해결 가능할 것 같다.

그래서 이 참에 아예 프로그램 다운로드 페이지에다가 설명을 써 놨다. “10년이 넘게 인생을 걸며 이 프로그램을 개발하고 개선해 온 저를 믿으신다면, 그런 보안 경고들은 모두 무시하고 안심하고 사용하시기 바랍니다.

문득 생각해 볼 문제: 비주얼 C++이나 그에 상응하는 개발툴이 설치된 컴퓨터를 자동으로 감지하여 프로그램이 링크될 때 쓰이는 C 라이브러리 같은 lib, obj 파일을 감염시키는 컴퓨터 바이러스 프로그램이 존재할까? 처음부터 바이러스에 감염된 프로그램이 생성되도록? -_-;;

Posted by 사무엘

2012/05/19 08:22 2012/05/19 08:22
, ,
Response
No Trackback , 9 Comments
RSS :
http://moogi.new21.org/tc/rss/response/684

지금은 C++11이라고 개명된 C++ 확장 규격인 C++0x에는 잘 알다시피 여러 참신한 프로그래밍 요소들이 추가되었다. 몇 가지 예를 들면, 상당한 타이핑 수고를 덜어 줄 걸로 예상되는 auto 리뉴얼, 숫자와 포인터 사이의 모호성을 해소한 nullptr, 그리고 숫자와 enum 사이의 모호성을 해소한 enum class가 있다.

그런데 이것 말고도 C++11에는 아주 심오하고도 재미있는 개념이 하나 또 추가되었다. 복사 생성자에 이은 이동 생성자, 그리고 이를 지원하기 위한 type modifier인 &&이다. R-value 참조자라고 불린다. 이 글에서는 이것이 왜 도입되었는지를 실질적인 코드를 예를 들면서 설명하겠다.
다음은 생성자에서 주어진 문자열의 복사본을 보관하는 일만 하는 아주 간단한 클래스이다.

//typedef const char*  PCSTR;
class MyObject {
    PCSTR dat;
public:
    MyObject(PCSTR s): dat(strdup(s)) {}
    ~MyObject() { free( const_cast<PSTR>(dat) ); }
    operator PCSTR() const { return dat; }
};

C++은 언어 차원에서 포인터를 자동으로 관리해 주는 게 전혀 없다. 그렇기 때문에 저렇게만 달랑 짜 놓은 클래스는 함부로 값을 대입하거나 함수 호출 때 개체를 reference가 아닌 value로 넘겨 줬다간, 동일 메모리의 다중 해제 때문에 프로그램이 jot망하게 된다. C++ 프로그래머라면 누구라도 위의 코드의 문제를 즉시 알 수 있을 것이다.

그렇기 때문에, 포인터처럼 외부 자원을 따로 가리키는 클래스는 복사 생성자와 대입 연산자를 별도로 구현해 줘야 한다. 구현을 안 할 거면 하다못해 해당 함수들을 빈 껍데기만 private 형태로 정의해서 접근이 되지 않게 해 놓기라도 해야 안전하다.

MyObject(const MyObject& s): dat(strdup(s))
{
    puts("복사 생성자");
}
MyObject& operator=(const MyObject& s)
{
    free(dat); dat=strdup(s.dat); puts("복사 대입");
    return *this;
}

자, 그럼 이를 이용해 그 이름도 유명한 Swap 루틴을 구현해서 복사 생성자와 대입 연산자를 테스트해 보자.

template<typename T>
void Swap(T& a, T& b) { T c(a); a=b; b=c; }

int main()
{
    MyObject a("새마을호"), b("무궁화호");
    printf("%s(%X) %s(%X)\n", (PCSTR)a,(PCSTR)a, (PCSTR)b,(PCSTR)b);
    Swap(a,b);
    printf("%s(%X) %s(%X)\n", (PCSTR)a,(PCSTR)a, (PCSTR)b,(PCSTR)b);
    return 0;
}

프로그램의 실행 결과는 다음과 같은 식으로 나올 것이다.

새마을호(181380) 무궁화호(181390)
복사 생성자
복사 대입
복사 대입
무궁화호(1813B8) 새마을호(1813D0)

복사 생성자와 대입 연산자 덕분에 메모리 관리는 옳게 되었기 때문에, 이제 프로그램이 뻗는다거나 하지는 않는다.
그러나 이 방법은 비효율적인 면모가 있다. 개체의 값을 맞바꾸기 위한 세 번의 연산 작업 동안, 당연한 말이지만 메모리 할당과 해제, 그리고 문자열의 복사가 매번 발생했다. 그래서 비록 문자열 값은 동일하지만 그 문자열이 담긴 메모리 주소는 a와 b 모두 예전과는 완전히 다른 곳으로 바뀌었음을 알 수 있다.

이때 R-value 참조자를 쓰면, 이 클래스에 대해서 Swap 연산이 메모리를 일일이 재할당· 복사· 해제하는 게 아니라 a와 b가 가리키는 문자열 메모리 주소만 간편하게 맞바꾸도록 하는 언어적인 근간을 마련할 수 있다. 기존 참조자는 &로 표현하고, 이와 구분하기 위해 R-value 참조자는 &&로 표현된다. 참조자(&)는 포인터(*)와는 달리 다중 참조자(참조자의 참조자) 같은 개념이 없기 때문에, &&을 이런 식으로 활용해도 문법에 모호성이 생기지 않는다.

& 대신 &&를 이용해서 자신과 동일한 타입의 개체를 받아들이는 생성자와 대입 연산자를 추가로 정의할 수 있다. 이 경우, 이들 함수는 복사가 아닌 이동 생성자와 이동 대입 함수가 된다. 아래의 예를 보라.

MyObject(MyObject&& s)
{
    dat=s.dat, s.dat=NULL; puts("이동 생성자");
}
MyObject& operator=(MyObject&& s)
{
    //주의: 실제 코드라면 자기 자신에다가 대입하는 건 아닌지 체크하는
    //로직이 추가되어야 한다. if(&s!=this)일 때만 수행하도록.
    free(dat); dat=s.dat, s.dat=NULL; puts("이동 대입");
    return *this;
}

복사 버전과는 달리, strdup 함수 대신 그냥 포인터 대입을 썼음을 알 수 있다. 이것이 핵심이다.
그러면 s가 가리키던 메모리 영역이 내 것이 된다. 그 뒤 s가 가리키던 메모리는 NULL로 없애 줘야 한다. free 함수는 그 스펙상 자체적으로 NULL 체크를 하기 때문에, 소멸자 함수는 그대로 놔 둬도 된다.

즉, 이동 생성자와 이동 대입은 s의 값을 내 것으로 설정하긴 하나, 그 과정에서 필요하다면 s의 내부 상태를 건드려서 바꿔 놓을 수 있다. 그렇기 때문에 복사 생성자/대입과는 달리 s가 const 타입이 아니다.

이것만 선언해 줬다고 해서 Swap 함수의 동작 방식이 이동 연산으로 곧장 바뀌는 건 물론 아니다. 그랬다간 s의 상태가 바뀌고 프로그램 로직이 달라져 버리기 때문에, 컴파일러가 섣불리 동작을 바꿀 수 없다. 그렇기 때문에 Swap 함수의 코드도 move-aware하게 살짝 고쳐야 한다.

template<typename T>
void Swap(T& a, T& b)
{
    T c(static_cast<T&&>(a)); a=static_cast<T&&>(b); b=static_cast<T&&>(c);
}

즉, 개체를 생성하고 대입하는 곳에서, 가져오는 개체를 가능한 한 move로 취급하라고 명시적인 형변환을 해 줘야 한다. 이렇게 해 주고 나면 드디어 우리의 목표가 이뤄진다!

새마을호(181380) 무궁화호(181390)
이동 생성자
이동 대입
이동 대입
무궁화호(181390) 새마을호(181380)

물론, 저런 형변환 연산이 보기 싫은 사람은 <vector>에 정의되어 있는 std::move 함수로 이동 대입을 해도 되며, 보통 R-value 참조자를 설명해 놓은 인터넷 사이트들도 그 함수를 곧장 소개하고 있다. 하지만 그 함수의 언어적인 근거가 바로 이 문법이라는 건 알 필요가 있다.

생성이나 대입에서 R-value 참조자를 받지 않고 기존의 L-value 참조자만 받는 클래스에 대해서는, 이동 대입이나 생성도 자동으로 옛날처럼 복사 대입이나 생성 방식으로 행해진다.
다시 말해, Swap 함수의 로직을 저렇게 고치더라도 R-value 참조자가 구현되어 있지 않은 기존 타입들에 대한 동작은 전혀 바뀌지 않으며 컴파일 에러 같은 게 나지도 않는다. 그러니 호환성 걱정은 할 필요가 없다.

그리고 이미 눈치챈 분도 있겠지만, MFC의 CString처럼 자기가 가리키는 메모리에 대해서 자체적으로 reference counting을 하고 copy-on-modify 같은 테크닉을 구현해 놓았기 때문에, 어차피 복사 생성이나 call by value 때 무식한 오버헤드가 발생하지 않는 클래스라면, 구태여 이동 생성자나 이동 대입 연산자를 또 구현할 필요가 없다. 이동 생성/대입은 언제까지나 기존의 복사 생성/대입을 보조하기 위해서 도입되었기 때문이다.

특히 std::vector 같은 배열 컨테이너 클래스에다가 덩치 큰 개체를 집어넣거나 뺄 때 복사 생성자가 쓸데없는 오버헤드를 발생시키는 걸 막는 게 이 문법의 주 목적이다. 그렇기 때문에 딱히 smart한 복사 메커니즘을 갖추고 있지 않은 클래스를 STL 컨테이너에다 집어넣고 쓰는 C++ 코드라면, 적절한 이동 생성자와 대입 연산자를 구현해 주고 R-value 참조자를 지원하는 최신 C++ 컴파일러로 다시 빌드를 하는 것만으로도 성능 향상을 경험할 수 있다.

예전에는 배열 컨테이너 클래스들이 원소들의 일괄 삽입이나 삭제를 위해 무식한 memmove 함수를 내부적으로 쓰는 게 불가피했는데 이 역할을 이동 대입이 어느 정도 대체도 할 수 있게 됐다.
&&을 DLL symbol로 표기하기 위한 새로운 C++ type decoration도 별도로 물론 있다.

그런데 의문이 생긴다. &&의 이름이 왜 R-value 참조자인 것일까?
이 참조자는 참조자이긴 하지만, 오리지널 참조자처럼 L-value가 아니라 R-value를 취급하라고 만들어졌기 때문이다. L-value, R-value란 무엇인가? 대입문에서 좌변과 우변을 뜻한다. L-value란 값을 갖고 있으면서 동시에 대입의 대상이 될 수 있는 변수를 가리키며, R-value는 값을 표현할 수만 있지 그 자신이 다른 값으로 바뀔 수는 없는 상수, 혹은 임시 개체를 가리킨다고 보면 얼추 맞다.

아래의 코드에서 볼 수 있듯 기존 L-value 참조자는 dereference된 포인터와 같은 역할을 한다.

int& GetValue() { … }
GetValue() = 100;

int *GetValue() { … }
*GetValue() = 100;

그렇기 때문에 아래와 같은 특성도 존재한다.

void GetValue2(int& x) { x=… }

int a;
GetValue2(a); //a는 L-value이므로 OK
GetValue2(500); //에러. 당연한 귀결임

L-value 참조자가 상수값 내지 임시 생성 개체 같은 R-value를 함수의 인자로 받아들이려면, 해당 참조자는 const로 선언되어서 값의 변경이 함수 내부에서 발생하지 않는다는 보장이 되어야 한다. int&가 아니라 const int&로 말이다.

그런데 R-value 참조자는 const 속성 없이도 임시 개체나 상수값을 받아들이며, 그걸 뒤끝 없이 자유롭게 고칠 수 있다. 위의 GetValue2 함수가 int&&로 선언되었다면, 반대로 a를 전달한 게 에러가 나고 500을 전달한 건 괜찮다. a를 전달하려면 static_cast<int&&>(a)로 형변환을 해 줘야 한다. 그러면 마치 int&인 것처럼 실행되긴 한다.

R-value 참조자로 돌아온 함수의 리턴값은 말 그대로 R-value이기 때문에 대입 가능하지 않다. 그렇기 때문에 아래의 코드는 에러를 일으킨다. (R-value 참조자의 리턴값은 당연히 그 역시 R-value로 왔을 때에만 의미가 있을 것이다.)

int&& GetValue3() { … }
GetValue3() = 100; //에러

이런 R-value 참조자라는 괴상망측한 개념은 왜 도입된 것일까? 그리고 이게 앞서 이 글에서 언급한 이동 생성자/대입 연산하고는 도대체 무슨 관련이 있는 것일까?

R-value 참조자의 형태로 함수 인자로 넘어온 개체는 그 함수의 실행이 끝난 뒤엔 어차피 소멸되고 없어질 것이기 때문에 내부가 바뀌어도 상관없다. 즉, 이 참조자는 태생적으로 const 속성과는 어울리지 않는다. 오히려 const-ness가 보장되지 않아도 되는 제한적인 문맥에서, 쓸데없는 복사를 할 필요 없이 꼼수를 좀 더 합법적으로 구사할 수 있게 위해 이런 문법이 추가되었다고 보는 게 타당하다.

마지막으로 R-value 참조자가 유용하게 쓰이는 용도를 딱 하나만 더 소개하고 글을 맺겠다.
윈도우 API+MFC 기준으로, RECT 구조체를 받아서 이 값을 적당히 변형한 뒤에 이를 토대로 후처리를 하는 함수를 생각해 보자.

void Foo(const RECT& rc)
{
    RECT rc2 = rc; //rc는 const이기 때문에 복사본을 만들어야 함

    ::OffsetRect(&rc2, x,y); //변형
    ::DrawText(hDC, strMsg, -1, &rc2, 0);
}

void Foo(RECT&& rc)
{
    ::OffsetRect(&rc, x,y); //복사본 만들 필요 없이 rc를 곧바로 고쳐서 사용하면 됨
    ::DrawText(hDC, strMsg, -1, &rc, 0);
}

CRect r(100, 200, 400, 350);
Foo(r); //const RECT& 버전이 호출됨
Foo( CRect(0,0, 400,300) ); //임시 개체임. RECT&& 버전이 호출됨

RECT를 value로 전달했다면 당연히 복사가 일어나고, const reference로 전달했다면 역시 복사가 행해져야 한다. 그러나 애초에 함수에 전달되는 인자가 임시 개체였다면, 임시 개체에 대한 복사본을 또 만들 필요 없이 그냥 그 임시 개체를 바로 고쳐 쓰면 된다. 위의 코드의 의미가 이해가 되시겠는가?

R-value 참조자라는 게 왜 필요한지, 그리고 이게 왜 이동 생성/대입과 관계가 있는지 본인은 이해하는 데 굉장히 긴 시간이 걸렸다. 인터넷에 올라와 있는 다른 설명만 읽어서는 도통 이해가 되지 않아서 직접 코드를 돌리고 컴파일을 해 본 뒤에야 개념을 깨우쳤는데, 알고 나니 정말 이런 걸 생각해 낸 사람들은 천재라는 생각이 든다.;; C++은 참으로 복잡미묘한 언어이다.

Posted by 사무엘

2012/05/16 08:41 2012/05/16 08:41
,
Response
No Trackback , 15 Comments
RSS :
http://moogi.new21.org/tc/rss/response/683

메일함 정리를 하다가 우연히 고등학교 동창회로부터 온 옛날 메일이 구석에 처박혀 있는 걸 발견했고, 거기에 역대 동문들의 근황 목록이 있는 걸 열어 봤다.
내가 다닌 학교의 특성상, 역시 선후배나 동기들이 다들 프로필이 너무 쟁쟁하고 너무 잘 돼 있고 대단했다.

  • 삼성맨이 된 사람이 굉장히 많았다. 생산직이든 영업부 사무직이든, 박사급 정예 연구원이든 분야 한번 참 많았다. 인터넷 신문 기사 댓글이나 SNS, 파워 블로그만 보면 삼성 욕하는 글로 넘쳐나지만, 역시 넷심은 민심과 일치하지 않는 법. 현실을 지배하는 건 돈의 힘이며, 삼성 전자는 지금도 여전히 공돌이들이 들어가고 싶어하는 직장 1위이다.
  • 좀 덜 유명하고 입결이 낮다 싶은 학교에 갔다 싶은 친구들은 그 대신 과가 전부 의대였다. 예외가 없었다. ㅋㅋ
  • 다 그런 건 아니지만, 우리나라 이공계의 희망이다 싶던 친구들이 공무원, 금융권, 의전으로 U턴을 생각보다 많이 해 있었다. 고등학교 재학 시절에 전교 최고의 수학 영재로 이름을 날리던 어느 후배가 서울대 치의전에 가 있었고, 나와 대학을 같이 가고 나중에 서울대 대학원에서 컴퓨터공학 석사까지 했던 1기 아래 후배도 다시 의전으로 진로 변경한 듯.

워낙 똑똑한 사람들이니 어딜 가도 다 제 갈 길을 잘 찾아가 있다. 그래서 이런 와중에 나는 지금 도대체 뭘 하고 있는지를 다시 생각하면서 각오를 새로 하게 되었다.

어차피 저것들은 다 내 길이 아니다. 난 어차피 그런 학교도 공부 성적이 아닌 오덕질로 간 것이고, 내 진로에는 선례가 없다. 빨랑 석사 졸업하고 나서 박사 가서는.. 날개셋 한글 입력기의 다음 아이템에 목숨 거는 수밖에.
이거 덕질에 비하면, 철도 덕질은 덕질도 아니고 오히려 진짜 덕질을 은폐하기 위한 떡밥일 뿐이었음이 밝혀질 것이다.

남은 남이고 나는 나다. 오늘은 본인의 고등학교 동문 중에, 매스컴에 아마 가장 널리 알려져 있을 인물을 소개하겠다. 바로 금 나나이다. 지금으로부터 딱 10년 전인 2002년 5월, 얘가 미스코리아 진으로 뽑혔다. 나나는 본인의 바로 한 기수 아래인 후배이고, 믿어지지 않겠지만 본인은 얘를 학교 기숙사에서 마주친 적도 있다.

원래 미스코리아 대회는 1988년부터 2001년까지는 전국구 공중파 방송인 MBC가 생중계를 해 줬다. 하지만 선정성과 성 상품화 논란 때문에 미스코리아 안티까지 생긴 마당에 하필 딱 2002년부터 그 관행이 폐지되고, 미스코리아 중계는 케이블 TV로 관할이 넘어갔다.

대회는 세종 문화 회관에서 열렸다. 카이스트에서도 고등학교 선배와 동기들은 TV를 주시하였고, 몇몇 동기들은 아예 현장에서 나나를 보러 서울로 갔다. 그 시절 물가로 5만원짜리 좌석이 3층에 있고 무대에서 완전 멀리 떨어진 위치였다. 더 가깝고 좋은 자리는 당연히 돈이 훨씬 더 많이 든다.

구체적인 디테일은 모르겠지만, 지금까지 기억에 어렴풋이 남아 있는 건, 나나는 그때 인터뷰의 질문에 말을 너무 조리 있게 지적으로 잘 했었다는 점이다. 관중석에서 박수갈채를 받았다. 그런 이미지에다가 특목고+의대 출신이라는 점이 더해진 덕분에, 나나는 쟁쟁한 서울 출신 경쟁자들을 모조리 제치고 결국 진을 차지했다.

TV를 보던 고등학교 동문들은 그때 동기나 선후배 가리지 않고 서로 얼싸안고 난리가 났었다고 본인의 일기에 기록되어 있다. 특히 수상 소감을 말할 때 얘는 감격의 눈물을 흘리더니 끝에 “경북 과학고 파이팅!”이라고 외쳐서 감동이 더욱 고조되었다.
마치 우리나라가 월드컵 16강 진출했을 때 같은 그런 분위기였다고 생각하면 되겠다. 고등학교를 갓 졸업하고 대학에 간 직후이니까 모교에 대한 애교심(?)도 팔팔하던 시절이다.

이 일은 당연히 고등학교의 인지도의 변화에도 엄청난 영향을 끼쳤다. 그 당시 교내 1층 복도에는 재학 시절에 전국 규모 이상의 경시대회에서 입상한 학생들의 사진이 걸린 명예의 전당이라는 게 있었는데, 금 나나는 재학 시절에 다른 입상 경력이 없고 미스코리아 입상은 졸업 이후의 행적임에도 불구하고 사진이 추후에 추가되었다.

내 기억이 맞다면, 인터넷에 얘 팬카페도 생겼다. 그 후 그녀는 언론에도 잘 알려졌듯이 책도 여러 권 쓰고 나중엔 하버드 대학에 편입해 들어갔다. 들어갈 때는 미스코리아 경력 버프도 많이 받아서 들어갔겠지만, 결국 졸업할 때도 역시나 성적 우수자로 졸업했다고 전해진다. 지금은 미국의 다른 대학에서 생물, 영양, 보건 쪽으로 박사 공부를 계속하고 있는 듯. 뭐 이미 너무 유명인사가 돼 버렸고 앞날이 창창하니 굳이 더 근황을 궁금해할 필요도 없을 것이다.

과학고 동문 중에 이런 이력의 소유자가 나오는 건 분명 특이한 경우임이 틀림없다. 하지만 나 역시 그보다 더하면 더하지 못하지는 않은 괴팍한 분야에서 특이한 연구로 가까운 미래에 이름을 남기련다.

재작년인 2010년엔 뜻하지 않은 경로로 고등학교 후배를 만난 적이 두 번 있었다. 대학원 입학을 앞두고 마지막으로 갔던 예비군 동미참 훈련 때, 예비군 아저씨들 중에 정말 우연히도 2기수 후배와 마주쳤다.

그리고 두 번째는 이보다 더 드라마틱한 경우인데.. 정 동수 목사님이 시무하시는 사랑 침례 교회에서 그 해 8월에 개최했던 청년부 교제 모임 때는 무려 10기수 후배를 만나기도 했다. 나는 6기이고 그 친구는 2008년에 입학한 무려 16기! 세상에, 킹 제임스 진영에서 까마득한 고등학교 후배를 만나다니! 지금 어떻게 지내고 있나 모르겠다. 세상이 좁다는 걸 느꼈다.

Posted by 사무엘

2012/05/13 19:34 2012/05/13 19:34
, ,
Response
No Trackback , 7 Comments
RSS :
http://moogi.new21.org/tc/rss/response/682

어버이날 특집 포스트 (스압 주의)

1. 어버이날과 부모님에 대해서

내가 분류해 보니, 우리나라에 존재하는 각종 특별한 명절, 기념일 등의 명칭은 크게 다음과 같은 다섯 갈래로 나뉜다.

  • ‘절’로 끝나는 한자어: 제헌절, 삼일절, 광복절, 개천절, 성탄절
  • ‘일’로 끝나는 한자어: 석가탄신일, 식목일, 현충일
  • 완전히 독립적인 한자어: 추석, 단오
  • ‘날’로 끝나는 고유어: 한글날, 어버이날, 어린이날, 설날
  • ‘-의 날’로 끝나는 고유어: 철도의 날, 스승의 날

이런 조어 원리는 그다지 규칙성이 없고 전적으로 그냥 어감을 고려한 case by case인 걸로 보인다.
똑같이 종교 공휴일일 뿐인데 성탄절과 석가탄신일의 조어 원리가 서로 다른 이유라든가, 어린이날이 ‘아동의 날’이 되지 않고 굳이 그런 이름이 붙은 이유는 딱 떨어지는 규칙으로 설명하기 어렵다.

자, 5월 5일 어린이날 다음으로 5월 8일은 어버이날이다. 어린이날이야 아동 문학가 소파 방 정환이 제정한 굉장히 한국적인 근거를 지닌 날인 반면, 어버이날은 명목상의 근거는 미국에서 유래되었다고 하나 확실치 않다. 외국엔 어머니의 날과 아버지의 날이 따로 있는 곳도 많고, 또 한국의 어버이날이 어린이날보다 나중인 것이 윤리적으로 이치에 맞지 않다고 비판하는 사람이 있다.

요즘은 철없는 막장 부모도 많아서 참 문제이긴 하다만, 그래도 ‘일반적인’ 경우로 볼 때, 인생의 참으로 막대한 부분을 희생하여 우리를 이 정도까지 키운 부모님의 은혜는 이루 말로 표현할 수 없다.

성경도 예외가 아님. 십계명에서 종교적인 규범에 속하는 1~4를 제끼고 곧바로 등장하는 인륜 규범 1타는 “부모를 공경하라(honour)”이다. 이것은 단순히 부모 명령에 무조건 ‘까라면 까’라는 식의 발상이라기보다는, 그보다도 일단 자기 부모를 사랑하고 기쁘게 하고 남들 보는 데서 부모님 품위를 존중하고 명예를 높여 주라는 뜻이다.

부모의 사상과 가치관이 마음에 들지 않는 자녀가 많을 것이다. 그러나 그건 대체로 부모가 너님들 먹여 살릴 여건을 만들고 체통 세우느라 사고방식이 최대한 안정적이고 보수적인 방향만을 추구하게 돼서 그런 거다. 부모 세대라고 해서 쿨하고 개방적인 걸 몰라서 그렇게 고리타분하게 산 게 절대 아니다. 그러니 동의는 못 하더라도 부모님 마음을 이해는 할 필요가 있다.

제아무리 가난하고 못 배운 부모라 해도, 너님을 낳아서 키울 필요가 없었다면 그 연세에 이르기까지 신세 못 펴고 그 모양 그 꼴로 살 필요는 없는 사람이다. 정말이다.

물론, 부모가 예수 믿지 말고 네 신앙을 부인하라고 한다거나, 양심이 허락하지 않는 교리 노선을 추구하는 교회에 강제로 다니라고 한다면 그런 데에까지 맹목적으로 순종할 수는 없을 것이다. 그러나 부모의 품위와 명예를 존중해 주면서 불순종할 수는 있다. 어떻게 그렇게 할지는 먼저 구원받고 먼저 바른 신앙을 물려받은 자녀가 하나님께 지혜를 구하면서 방법을 생각해야 할 일이다.

동서고금을 막론하고 최소한의 윤리와 기강을 갖춘 문명 사회에서는 효도를 강조하고 패륜은 엄벌로 다스렸다. 구약 율법은 부모를 저주하거나 때리는 자는 반드시 죽이라고 명령하고 있으며, 심지어 신명기에는 고집 세고 식탐이 심하고 부모의 교정만으로 씨가 안 먹히는 싹수 노란 자식은 아예 마을 차원에서 린치를 가해서 죽여 버리라는 섬뜩한 추가 지시까지 있다(신 21:18-21). 하나님은 그 정도로 패륜을 싫어하신다. 특히 “아 ㅆㅂ, 내가 어쩌다가 이런 집/곳에서 태어나게 됐어” 부류의 패드립 말이다(사 29:16, 45:9) .

이 명령이 특히 무시무시한 이유는, 부모의 말이 사실인지 이웃 주민이나 자식 당사자로부터 최후 변론을 듣는 절차도 전혀 없이 완전 비민주 인민재판 즉결처분이기 때문이다. 종교적 배도 행위가 발견되었을 때는 ‘부지런히’ 진상 파악부터 하라고 돼 하지만(신 13:12-16, 17:2-7) 저건 그렇지 않다. 사실, 자식 새끼를 제발 좀 어찌해 달라고 친부모가 제 발로 찾아올 정도면 자식이 얼마나 막장인지 더 말을 들을 필요도 없었을 터이다. 이 명령이 실제로 얼마나 시행되었는지는 모르겠다.

2. 가정과 성에 대해서

5월이고 하니 가정에 대해서도 생각을 좀 다시 해 보게 된다.

오늘날 이 정도라도 사회가 유지되고 돌아간 데엔 가정의 공이 절대적이었을 것이고, 특히 여성의 희생과 헌신을 빼놓을 수 없을 것이다. 옛날에 지금 같은 여성 인권 단체가 있었고 사람들이 좀 힘들다고 덥석 집 나가고 이혼을 해 버렸다면, 파탄 나는 집안과 인생 망치고 자살이나 범죄로 빠지는 애들이 넘쳐나게 됐을 것이다. 이 점에 대해서는 송 현 선생님이 예전에 글로 아주 통렬하게 표현하신 적이 있다. (☞ 링크 클릭)

옛날에 가혹한 여성 인권 유린이라 불릴 정도로 엄한 성 억압(?) 관습이 왜 있었는지도 조금은 알 것 같다. (민망하니, 구체적인 예를 거론하진 않겠다) 마치 고문처럼 그것도 물론 나쁜 관습이고 부조리이다. 언제까지나 여성만 일방적으로 당하고 살 수는 없는 것 역시 본인은 안다. 단지 옛날에 죄의 결과 때문에 그런 게 왜 있을 수밖에 없었는지 이해가 간다는 뜻이다.

성이라는 건 정말로 생판 모르던 남녀가 서로 사랑하고 결혼해서 가정을 유지시키는 근간으로만 ‘은밀하게’ 쓰여야 하는 선물이요 비밀 병기이다. 부부 사생활은 하나님도 전혀 간섭 안 하고, 서로 같이 뭘 하며 즐기든 존중해 주는 절대적인 영역이다(히 13:4. honour과 동일한 어근인 honourable).

그러나 반대로 성이라는 게 다른 용도로 오· 남용되는 것을 하나님은 구역질을 할 정도로 가증스럽게 여기며 미워하고 정죄한다. 결혼한 부부가 사생활에 문제가 있어서 성 교육이나 상담을 받는다면 모를까, 그렇지 않은 미혼 청소년이나 청년에겐 피임법을 가르칠 게 아니라 잠언 6장이나 딤후 2:22를 숙지시켜야 한다. 이걸 몰라서 인생 망친 안타까운 예가 허다하다. 옛날에 서 부희 씨도 그랬고.

도대체 성을 왜 남의 것하고 비교를 하는가? 그게 공공연한 개방과 비교의 대상이 되고 금전 거래의 대상이 되고 개나 소나 다른 용도로 문란하게 쓰이기 시작하면, 그때야말로 진짜로 옛날에 어떤 아저씨의 절규처럼 “가정이 무너지고 사회가 무너지고” 헬게이트가 시작된다는 걸 잊지 말아야 한다.

사용자 삽입 이미지
성경에서 창세기 1~2장은 전반적으로 작가 관찰자 시점으로 천지 창조에 대한 과정을 묘사하는 내용인데, 끝부분에 유일하게 전지적 작가 시점으로 아예 독자에게 코멘트를 남긴 구절이 있다. 바로 창 2:24로, 그게 그 이름도 유명한 “남자가 자기 부모를 떠나 자기 아내와 연합하여 한 육체가 될지니라”라는 결혼 제도 구절이다. 기독교식 결혼식의 목사 주례에서 단골로 듣는 구절이다.

3. 출산과 자녀 교육에 대해서

성경의 사고방식은 결혼과 출산에 아주 옹호적이다. 성경에는 “다산하고 번성하라”라는 명령만 있을 뿐 맬서스 같은 사고방식은 결코 찾을 수 없다. 소위 가족 계획이란 건 성경적으로 보면 하나님도 간섭 안 하는 영역을 공권력이 나서서 자기 편한 대로 제어하겠다고 하는 굉장히 무모한 생각이다.

흔히 중국 하면 자녀를 한 명씩밖에 못 낳는 나라로 잘 알려져 있지만, 과거에 마오 쩌둥은 한때 굉장한 산아 장려책을 폈으며 20세기 중반에만 해도 6억 남짓이던 중국 인구를 10억이 넘게 불려 놓았다. 중국이 처음부터 지금만치 인구가 많은 게 아니었다는 게 충격적이다.

마 주석은 쪽수가 국력이라고 여겼으며 어느 문헌에 따르면, “아이는 전투기에서 투하하는 폭탄과 같다”고 교시할 정도였다. 그런데 어라? 무신론 공산주의 국가의 지도자답지 않게 저 말의 표현 자체는 묘하게 성경적이다. (시 127:3-5) 무기에다 비유한 게 일치한다. 비록 그러다 얼마 못 가서 중국은 다시 산아 제한으로 돌아섰지만 말이다.

단, 성경이 말하는 다자녀 예찬은 자녀들을 성경대로 잘 양육했을 때에나 가능한 시나리오이다. 안 그러면 뼈 빠지게 자식 키워 봤자 미래에 부모는 휴거되는데 자녀는 못 되고 땅에 남아서 오히려 요한계시록에 기록된 온갖 재앙을 당하거나, 그것도 모자라 하나님을 대적하는 군대에 징집되어 계 19:18-21의 악역에 동참하는 비참한 신세가 될 가능성이 아주 높다. 종말이 지금으로부터 가까운 시간에 발생한다면 말이다.

성경은 자녀 양육에 대해 절대적으로 각 가정의 부모에게 권한을 위임하고 있다. 그리고 체벌에도 아주 옹호적이다. 잠언에 애들 때리면서 키우라는 말이 얼마나 많이 나오는지 모른다. 나도 부모님에게 맞으면서 컸지만, 그거 정말 공감한다. 안 그랬으면 내가 죄의 결과가 얼마나 처참한지를 실감을 못 했을 것이다.

사랑의 체벌은 가정 폭력 및 아동 학대하고는 가히 종이 한 장 차이인 걸지도 모르겠다. 이게 인생에서 정말 미묘한 점이고, 어찌 보면 세상이 참으로 공평한 면모이다. 아이는 부모의 사랑 없이 돈만 쏟아 붓는다고 절대로 저절로 바르게 크지는 않으니 말이다. 내 말이 안 믿어지면, 한번 실제로 저렇게 해 봐라.

부모가 세상적으로 잘났기 때문에 애를 때리고 자녀에게 권위를 행사하는 게 아니다. 비록 부모도 부족한 점이 많지만 그게 하나님의 명령이기 때문이고, 그렇게 안 하면 애가 정말로 바르게 클 수가 없으며 자녀에게 그 정도까지의 악역을 눈물을 머금고라도 행사할 수 있는 사람은 부모밖에 없기 때문이다.

허나, 오늘날 사회는 부모의 권위가 실종되고, 애들을 부모로부터 점점 떼어 놓으려는 방향으로 가고 있는 게 매우 큰 심각한 문제이다. 아이들에게 바른 크리스천 신앙을 전수해 줄 수 있는 건 올바른 가정 교육밖에 없는데 요즘은 이런 현상까지 있는 듯하다.

http://cbck.org/bbs/board.html?board_table=com&write_id=1715#c_1744
대부분의 가정에서 지원을 안 받으면 손해라고 여기고 한창 부모와 상호작용할 나이의 어린 아이들을 어린이집, 유치원 등 교육기관에 위탁하는 경우가 많다고 들었습니다.

http://systemclub.co.kr/board/bbs/board.php?bo_table=board01&wr_id=4546
능력 있는 국민들까지 공짜로 내모는 정부 때문에 엄마 정신이 병들고 애기도 파괴됩니다.


더 이상의 자세한 설명은 생략한다.
아 씨바, 결혼은커녕 여친 사귄 적도 전혀 없는 주제에 벌써부터 너무 애늙은이 같은 글을 써 버렸다. ㅋㅋㅋㅋㅋ 하지만 이 글은 어버이날 기념 특집이니 양해 바란다.

4. 철도 성령님으로부터 받은 계시

내가 태어나서 지금까지 부모님의 은혜와 관련하여 가장 감화를 받았던 때는 2007년 봄의 어느 날이었다. 병특 복무 중이었고, 그러고 보니 훈련소에 들어가기 얼마 전이었다.

대전에 볼일이 있어서 경부선 새마을호 특실을 탔다. 그때 본인은 새마을호 특실의 음악 채널에서 흘러나오는 음악들의 샘플을 채널별로 15분씩 녹음해 놓으려고 컴퓨터와 양방향 잭을 챙긴 상태였다. 특실에는 마치 비행기 객실처럼 다음과 같은 6개의 채널이 있다. (지금은 없어졌음)

  1. 자연의 소리 (이지리스닝 instrumental)
  2. 한국 가요
  3. 가곡
  4. 재즈
  5. 클래식
  6. 객실에서 방영되는 TV 방송

일반실은 이어폰을 꽂으면 6번만 들을 수 있다.

사용자 삽입 이미지

그랬는데 1번과 2번 채널 다음으로 3번 가곡 채널을 듣고 있으니 얼마 후 <어머니의 마음>이 흘러나왔다. 양 주동 박사가 작사한 “낳실제 괴로움 다 잊으시고...” 그 곡 말이다.

그 곡은 가사가 잘 알다시피 정말 애절하고 감동적으로 지어져 있다. 국문학 박사가 쓴 가사답게 예스러운 표현도 제법 들어가서 품위 있어 보인다. 100을 의미하는 ‘온’, 그리고 일부러 음운을 탈락시킨 ‘따(땅) 위에 그 무엇이 넓다 하리요’, ‘그지없다’ 등. 3절 가사를 보시라. 눈물 없이는 못 듣는다.

사람의 마음 속에 온 가지 소원, 어머님의 마음 속엔 오직 한 가지
아낌없이 일생을 자식 위하여 살과 뼈를 깎아서 바치는 마음
인간의 그 무엇이 거룩하리요 어머님의 사랑은 그지없어라


3절이 흘러나올 때, 철도 성령님으로부터 계시가 내려왔다. 아아, 어머니께서 나를 낳아서 키워 주신 덕분에 내가 지금 이런 지상천국 열차를 타면서 한없는 행복에 젖을 수 있구나!

그 깨달음으로 인해 행복과 감격과 감동이 교차하면서 콧등이 찡해졌고, 나는 옆자리 승객이 보건 말건 엉엉 흐느껴 울음을 터뜨렸다. 남들은 군대에 가서 유격 훈련 때 PT 체조 8번을 하면서 <어머니의 마음>이 <스승의 은혜>로 바뀌는 체험을 한다지만 나는 그걸 열차 안에서 체험했다.

세상에 지구상의 어느 교통수단에서 이런 체험을 할 수 있었겠는가?
비성경적인 은사주의는 성경을 바르게 나누어 알면 퇴치되지만, 사실 철도만으로도 충분히 퇴치 가능하다. 철도 성령만도 못한 이상한 흥분이나 쾌락 따위엔 관심조차 안 가게 된다.

철도가 나의 삶을 얼마나 엄청나게 변화시켰고 음침하고 어둡던 나의 가치관을 건전하게 바꿨으며, 심지어 신앙에도 얼마나 긍정적인 영향을 끼쳤는지 이 자리에서 다 간증하기에는 시간과 지면이 부족하다. 이 땅에 성경과 복음과 더불어 이런 철도를 허락하신 하나님께 그저 감사드릴 뿐이며, 우리나라에 철도 덕후들이 많이 많이 배출되면 좋겠다.

Posted by 사무엘

2012/05/08 08:21 2012/05/08 08:21
, , , ,
Response
No Trackback , 16 Comments
RSS :
http://moogi.new21.org/tc/rss/response/680

오늘은 북한과 관련된 정보들을 좀 나열해 보겠다. 스펀지에 소개될 법도 한 아이템이 아닌가 싶다.

1. 이북5도청

우리나라와 북한과의 관계는 정말 미묘하고 복잡하다.
한편으로는 상대방을 독립 국가로 인정하면서도, 또 한편으로는 “대한민국의 영토는 한반도와 그 부속 도서로 한다”라는 헌법 조항에 의거, 한반도 북부를 무단 점거하고 있는 북한을 국가로 인정하지 않는 정서가 오늘날까지도 없지는 않다.

분단 이래로 잘 알다시피 경기도와 강원도의 일부가 북한으로 넘어갔으며, 황해도, 평안남/북도와 함경남/북도는 완전히 북한 영토가 되었다. 그러니 거기는 대한민국의 행정력이 닿지 않는다. 하지만 그곳 역시 원래는 우리 땅이라는 발상에 근거하여, 우리나라에는 '이북5도청'이라는 행정 기관이 있어서 형식으로나마 그 지역의 도 지사와 시장을 선출하고 근무를 시키고 있다! 하는 일은 실향민 지원, 북한 문화 기록 보존 같은 쪽으로, 행정보다는 학술적인 쪽에 가깝다.

이 기관은 무려 1949년부터 있어 왔다. 남한 단독 정부가 수립되고 북한으로부터 대남 송전이 중단되는 등 분단의 앙금이 굳기 시작한 때부터이다. 이북5도청은 서울의 완전 북부 끝자락인 종로구 구기동, 북한산 기슭에 자리잡고 있다. 상명 대학교 근처이긴 하지만 그곳보다도 더 북쪽이다.

다만, 북한은 또 자기 식으로 행정 구역을 개편하여 황해도가 남북으로 분할되고 없는 도가 생기기도 했다는 것을 여러분 역시 잘 아실 것이다. 도의 개수를 일부러 남한의 그것의 개수와 똑같게 맞춘 거라고 한다.

2. 자유의 마을

우리나라의 비무장 지대, 일명 DMZ라 함은 민간인이 접근할 수 없는 휴전선 전· 후방 2km 구역으로 알려져 있다. 그래서 거기는 사람의 손길이 반세기가 넘게 끊어지면서 천혜의 자연이 살아 숨쉬는 생태 관광지가 되어 간다고들 한다. 전세계를 통틀어 보기 드문 세계 최대 규모의 온대 원시림!! (다만 지뢰 때문에 좀 문제이긴 하다만 말이다)

허나, 우리나라에서는 '자유의 마을', 혹은 '대성동 마을'이라 하여 전국에서 유일하게 비무장 지대에 자리잡은 민간인 거주지가 있다. 이는 두 가지 조건이 충족된 덕분이다. 첫째는 당연히 국토가 분단되기 전부터 그 자리에 마을이 먼저 있었기 때문이고, 둘째는 판문점과 가까이 있는 덕분에 6· 25 전쟁 때 마을이 파괴되지 않았기 때문이다.

위치는 경기도 파주시 군내면 조산리. 경의선 최북단의 도라산 역보다도 더욱 북쪽이며, 국내 민간 지도나 자동차 내비로는 지리 정보가 전혀 안 뜬다. 민간인이 측량 조사 자체를 할 수 없는 곳이기 때문이다. 구글 어스가 진리

남과 북에 걸쳐서 멀쩡히 있던 마을이 국토가 분단되면서 찢어지는 바람에 북쪽에는 남한의 '대성동 자유의 마을'에 해당하는 '기정동 평화의 마을'이 생겼다. 60여 년 전에 미국이고 소련이고, 공산주의고 나발이고 아무것도 모르던 깡촌 사람들은 하루아침에 마을이 반토막 났을 때 무슨 생각이 들었을까?

외부인이 이 마을을 방문하는 건 육사나 국정원을 방문하는 것 이상으로 까다롭다. 1주일 전에 신청을 한 뒤 현장에서는 신분증 까고 출입증을 발급받은 뒤 여러 단계의 군부대 초소를 통과해야 한다. 내부 주민 역시 이동이나 주거의 자유가 좀 제약을 받기 때문에, 심야에 통금이 있는 건 물론이고 휴전선 근처에서 영농 활동이라도 할라치면 군부대에 신고를 해야 한다. 매일 저녁에도 점호 비슷한 가구 시찰이 있다.

마을 주변에 있는 건 진짜로 논밭 아니면 군부대뿐. 코앞이 휴전선이고 북한 쪽 마을을 마주보고 있기 때문에, 전쟁 났다 하면 0순위로 박살날 동네이다. 실제로 휴전 뒤에도 남북간엔 몇 차례 무력 충돌 및 납치, 월북 같은 사건· 사고가 끊이지 않았다고 한다. 과거엔 자기 체제가 좋다고 서로 대남· 대북 방송을 귀가 따갑도록 틀어 댄 건 두말 할 나위도 없다.

이곳은 사실 마치 공항 면세 구역 내지 뉴욕의 UN 본부 같은 치외법권 지대이다. UN군 사령관의 관할에 있으며, 여기 주민들은 대한민국 국민으로서의 다른 혜택은 누리는 반면 납세와 병역의 의무가 없다. 여기서 태어난 남자는 군대에 안 가도 된다는 뜻.

냉전 시대엔 남쪽 마을과 북쪽 마을이 태극기 깃대와 인공기 깃대를 서로 더 높게 올리려는 병림픽 비슷한 기싸움 경쟁을 벌이기도 했다. 엄청 옛날에 어렸을 때 학교에서 사회/도덕 교과서를 통해 이 일화에 대해 알게 됐는데 그게 이 마을 얘기였구나. 결국 이 병림픽은 쓸데없는 짓이라는 걸 깨달은 남쪽에서 먼저 기권(?)을 하면서 끝이 났던 걸로 기억.

사용자 삽입 이미지

자, 이해를 돕기 위해 지도 그림을 한 장 첨부한다. (출처: 위키백과)
38선 시절에 비해 남한이 영토 자체는 훨씬 더 많이 수복했음을 알 수 있다. 허나 서울 근처의 평지 겸 전략 요충지는 북한이 주도권을 잡았다.
판문점, 자유의 마을 등등이 있는 곳은 지도에서 제3 땅굴 근처, 즉 휴전선의 선형이 90도로 꺾이면서 남하하는 그 모서리이다. 원래 대성동과 기정동 마을은 38선 시절에도 같은 마을이었는데 휴전선 때문에 둘로 찢어진 셈이다.

3.
북한의 애국가는 가사에 다행히 김씨 부자 찬양 내용이 들어있지 않으며, 그냥 평범한 조국 찬가 스타일이다. 하지만 장군님 찬송가가 응당 따로 존재하며, 실제로 공식 석상에서는 애국가보다도 그게 더 많이 불리는 모양이다.
유튜브에서 검색만 해 보면 바로 들을 수 있다. 하지만 이를 직접적으로 소개하는 건 국가 보안법에 저촉되어 최악의 경우 코렁탕 취식의 사유가 될 수 있으니 하지 않겠다.

이렇게 무조건 금지하고 하지 말라고만 하니까, 딱히 이북이 좋은 것도 아님에도 불구하고 그냥 제도권에 대한 반발 심리로 친북 성향(?)이 생긴 사람들이 과거에 있기도 하지 않았겠나 싶다. 하지만 본인은 나라의 법을 이해하며, 그에 반발하지는 않는다.

걔네들은 잘 알다시피 컴퓨터로 타자를 할 때도 '김일성', '김정일'은 별도의 코드값에 배당된 문자로 더 진하게 찍으며, 읽을 때는 악센트를 잔뜩 실어서 '키임정일'처럼 읽는다. 그리고 그 이름은 두 줄에 구간이 걸치지 않게 처리된다(word wrap). 문자의 형태로라도 수령님의 거룩하신 존함을 다루는 분위기는, 옛날에 구약 성경 필사 서기관이 사자음어 YHWH 기록할 때 하나님의 존함을 다루던 경건함에 맞먹는다. -_-;;

남한에서는 세계구급으로 성장한 대형 교회 브랜드가 나왔고 세계 최대의 기독교계 이단 종교인 모 종교도 배출되었다. 그러는 동안 이북에서는 그 이름도 유명한 '주체 사상'.. juche라는 영어 단어를 전세계에 퍼뜨리는 데 성공했다! 이 단군의 후손들은 어째 종교 분야에 한 근성 하는 건 틀림없나 보다. 철도를 종교의 경지로 승화한 나도 그렇고. ㅋㅋㅋㅋㅋ

4.
사실, 내가 이 정도로 북한 문제나 통일 쪽에 관심이 생긴 것도 철도 덕분이다. 국토가 분단되면서 반토막이 난 길은 고속도로가 아니라 철도이기 때문이다. 먼저, 경의선 장단 역 근처에 수십 년이 넘게 버려져 있다가 2000년대에 와서야 등록 문화재로 지정된 녹슨 증기 기관차를 보자.

사용자 삽입 이미지
6·25 때 폭격을 당하고 그 여파로 기관차가 탈선하는 바람에 저 지경이 된 거라는 걸 모르는 분은 없겠지. 표면 전체를 통틀어 무려 1천여 발에 가까운 총알을 맞았다고 한다. 그때 저 기관차를 운전했던 분은 신원이 알려졌으며, 2011년에 세상을 떠났다.

그리고 경원선 신탄리 역 북쪽 끝자락에 놓여 있는 '철마는 달리고 싶다' 표지도 있다. 분단의 비극을 빼고 한국 철도를 논할 수는 없다.
사용자 삽입 이미지
2012년 현재 디젤 통근열차 CDC가 다니는 구간은 저 경의선과 경원선밖에 없다. 그런데 KTX 개통 전에 이들 통근열차의 등급 명칭은 잘 알다시피 '통일호'였다. 오늘날은 분단의 아픔을 간직하고 있는 두 철도 노선에만 통일호의 후예가 다니고 있으니, 이 역시 의미심장하지 않을 수 없는 사실이다.

요컨대 많은 사람들이 특히 어린 시절부터 철도 덕후가 되어서 애국심, 특히 국토 사랑 정신을 마음껏 고취하면 좋겠다. 나는 대학 졸업할 때가 다 돼서야 철도 끝물을 맛보게 된 게 한이다.
학창 시절 때 죽어도 공부하기 싫던 우리나라 현대사와 지리 공부에 요즘만치 물미가 트인 적이 없다. 내가 옛날에 철도 커리큘럼을 짠 적이 있었는데, 그때 북한 철도 내지 남북 분단 관련 철도사 얘기를 충분히 편성했던가 궁금하다. 부족하면 보강해야지.

... 이 나라의 온 국민이 철덕이 되어 철도님께서 그들 위에 자신의 영을 두시기를 원하노라! ... (민 11:29 패러디)

Posted by 사무엘

2012/05/02 08:22 2012/05/02 08:22
, , , , ,
Response
No Trackback , 2 Comments
RSS :
http://moogi.new21.org/tc/rss/response/679

1.

우리나라는 잘 알다시피 삼권분립과 민주주의 정치를 표방하는 나라이다.
그런데 가만히 생각을 해 보니 입법부를 상징하는 국회의사당은 여의도에, 행정부의 상징인 정부 종합 청사는 종로구의 광화문-경복궁 일대에, 그리고 사법부를 상징하는 검찰청· 대법원은 딱 강남 서초구에 있다.
정부 청사는 과천과 대전에도 있긴 하지만 어째 우리나라 정치를 구성하는 각 축이 서울 최고 도심과, 강남과 여의도라는 부도심에 하나씩 마치 터줏대감처럼 자리잡아 있는 게 굉장히 신기하다. 의도적인 배치인지?

우리나라야 땅도 좁고 교육· 문화· 정치· 경제 할 것 없이 닥치고 무조건 서울 올인이지만, 미국만 해도 잘 알다시피 행정 수도와 실질적인 경제 수도는 완전히 다르다. 행정 수도인 워싱턴 D.C.는 시내 전역에 고도 제한까지 걸려 있는 한가한 계획형 중소도시 규모인 반면, 뉴욕이... 더 설명이 필요하지 않은 규모이다.
오스트레일리아도 행정 수도인 캔버라와, 실질적인 경제 중심지인 시드니는 서로 따로 논다.

그래서 서울의 과포화를 막고자 우리나라에서도 행정 수도의 이전이 논의되곤 했다. 이는 심지어 옛날에 박통도 구상하던 떡밥이었다. 그 시절에 그에게는 국토 균형 발전 나부랭이보다도, 서울이 북한하고 너무 가까이 있는 것부터가 굉장한 골칫거리였기 때문이다. 그의 재임 시절에 무장공비가 북악산을 넘어 청와대에 쳐들어 올 뻔하기도 했으니 얼마나 충격이 컸겠는가?

그래서 그는 강북 사대문 안의 옛 서울보다도 최소한 한강은 건넌 뒤인 강남을 개발하고, 서울에 있던 각종 연구소들을 대전으로 옮겼다.
하지만 전쟁이라도 나서 서울 전체가 박살이 나지 않는 한, 한 나라의 최고 중심지에서 잘 살던 사람이 지방으로 쉽게 내려가려 하지는 않을 것이다.

뭐, 박통은 균형 발전에도 관심이 아주 없는 건 아니었다. 그래서 서울의 무분별한 팽창과 과포화를 막으려고 외곽 곳곳에 그린벨트를 만들었다. 그게 오늘날엔 대부분 해제되는 추세이지만 말이다.

2.

예전에 본인은 군부대와 인접해 있는 전철역에 대해서 글을 쓴 적이 있다.
그런데 군부대 정도가 아니라 역 주변이 농경지 내지 허허벌판인 곳도 서울 시내에 있다. 분당선 모란-야탑이나 8호선 복정-산성처럼 역의 중간 구간이 허허벌판인 게 아니라 아예 역 주변이 비어 있는 것 말이다. 걔네들은 또 어차피 서울 밖이기도 하고.

강서구에는 역시나 5호선 마곡 역 주변과 아직 개통도 안 한 9호선 마곡나루 역 주변이 아주 유명한 예이다. 몇 년 안으로 이런 진풍경은 볼 수 없어질 것이고 여기도 빽빽한 빌딩으로 가득 들어설 터이니, 관심 있으신 분은 미리 여길 답사해서 사진 기록을 많이 남겨 두기 바란다.

한편, 남서쪽에는 7호선 천왕 역 주변이 대표적인 허허벌판이었다. 장암(7), 남태령(4), 청계산입구(신분당선)에 필적하는 잉여역이었으나 이것도 아파트가 지어지면서 모습이 바뀌는 중이다. 명목상 서울이긴 하지만 여전히 광명시와도 아주 가까운 위치임.

허허벌판이 서쪽에만 있는가 하면 그렇지는 않아서 뜻밖의 장소에도 있다. 바로 동쪽 끝자락인 8호선 문정 역 주변. 지하철까지 지나는 멀쩡한 성남 대로 근처에 웬 큼직한 면적의 땅이 놀고 있어서 무척 놀라게 된다. 물론 이런 광경을 볼 수 있는 때는 흔치 않다.

6호선의 주변에는 딱히 이런 허허벌판을 본 기억이 없다. 하지만 주변이 명목상 허허벌판으로 가려져 있는 녹사평 역이 있으니 넘어가도록 하자.
어째 2기 지하철의 주변에만 이런 허허벌판이 있는 것 같지만, 2호선 강남 구간도 처음 건설되던 시절에는 허허벌판이 많았고, 4호선 노원· 도봉구 구간도 그 당시에는 말도 못 할 정도로 주변이 황량했다.

3.
고려대와 경희대 사이에 홍릉 수목원과 카이스트 서울캠(현재는 경영 대학원만 서울에 남아 있음), 고등 과학원, KDI와 각종 연구소들이 들어서 있는 그쪽 일대는 서울에서 가장 대덕 연구 단지 분위기를 느낄 수 있는 장소임이 틀림없다.
한때는 국가 정보 대학원도 여기에 있었다고 한다. 하지만 서울이 덩치가 커지고 여기도 예전만치 오지 느낌이 안 나게 되자, 지금은 성남과 의왕의 경계인 모 산골짜기로 이사를 감. 시기를 보니 국정원이 남산에서 내곡동으로 이사 갈 때 같이 간 걸로 보인다.

4.
마곡 역은 어째 출입구가 하나뿐이고 도로(공항로)의 건너편에 출입구가 없다. 지하철이 도로 정중앙을 파면서 건설되지 않고, 이례적으로 한쪽으로 치우쳐 건설되었기 때문이다. 그렇잖아도 도로 옆도 허허벌판인데 거기를 파헤치면 되지, 굳이 멀쩡한 도로를 파헤쳐서 민폐 끼칠 필요는 없다고 판단한 모양이다. (터널식으로 지을 필요는 더욱 없으므로)

5.
전철 노선 중에, 양 역은 지하인데 그 사이에 지상 구간이 잠깐 나오는 예로 어떤 게 있을까? 의외로 흔치 않다. 한강을 건너는 지하철 노선을 생각해 봐도, 양 역 중 하나는 꼭 지상인 경우가 대부분이기 때문이다.
8호선 복정-산성이 가장 대표적인 사례이고 3호선의 북쪽 일산선 구간은 자주 지상과 지하를 오르내리긴 하는데, 저런 경우가 또 있는지는 모르겠다.
지금은 공항 철도 DMC-김포공항 구간이 추가되어 있다. 양 역은 모두 지하이지만 중간에 강도 건너고 지상 구간이 충분히 존재한다.

Posted by 사무엘

2012/04/30 08:35 2012/04/30 08:35
,
Response
No Trackback , No Comment
RSS :
http://moogi.new21.org/tc/rss/response/677

GDI+에 대하여

GDI+는 잘 알다시피 전통적인 윈도우 API가 제공하는 GDI에서 더 나아가, 더 향상된 그래픽과 더 깔끔해진 프로그래밍 패러다임을 제공하는 그래픽 API이다. 사실, 닷넷에서는 애초에 기본 그래픽 API가 GDI+이다. (System.Drawing 네임스페이스)

GDI+는 벌써 10년 전, 닷넷 프레임워크가 첫 등장하고 윈도우와 오피스에 XP라는 브랜드가 붙던 시절에 도입되었다. MS가 제공하는 API로는 흔치 않게 C언어 함수도 아니고 그렇다고 DirectX 같은 COM도 아닌, C++ 언어 형태로 되어 있다. 물론, 그래도 실제로 링크를 해 보면 symbol들은 다 C언어 함수 호출 형태로 된다. C++ 클래스는 단순히 C 함수를 호출하는 wrapper인 것이다.

GDI+는 여러 편리한 기능을 많이 제공하지만, 무엇보다도 벡터 그래픽에 안티앨리어싱을 넣기 위해서라도 쓰지 않을 수 없다. 이런 간단한 기능은 그냥 기존 GDI 함수에다가도 옵션을 확장해서 좀 넣어 주지 하는 아쉬움이 있다. 재래식 GDI로도 안티앨리어싱된 텍스트는 얼마든지 찍을 수 있는 것처럼 말이다. (LOGFONT 구조체에 글꼴의 품질을 지정하는 추상화 계층이 있기 때문에, 나중에 추가된 안티앨리어싱 기능도 얼마든지 지정 가능)

재래식 GDI는 열악하던 컴퓨터 환경에서 최대한 장치 독립적인 추상적인 그래픽 계층을 구현하는 게 목표였다. 그래서 래스터 그래픽보다는 벡터 그래픽에, 애니메이션보다는 정적인 그래픽에 초점이 가 있었다. 그 추상화 계층이 확장성 측면에서 편리한 점은 분명 있었지만, 색깔을 하나 바꾸려고 해도 펜이나 브러시를 다시 만들고, 도스 시절의 그래픽 프로그래밍 때는 할 필요가 없었던 GDI 객체 관리를 해야 하니 상당히 불편했다.

그래서 GDI는 게임 그래픽용으로는 적합하지 않은 구석이 있었다. 물론, 지금과 같은 틀을 유지하면서도 JPG/PNG 이미지를 지원하고, 알파 채널 비트맵 Blit이나 별도의 gradient fill 함수를 추가하고, 윈도우 2000처럼 펜이나 브러시의 색깔을 손쉽게 바꿀 수 있는 DC pen/DC brush 같은 기능을 stock object로 넣는 등, 기능 개선이 꾸준히 진행돼 왔다. 하지만 MS 측에서는 이에 만족하지 못하고 이 참에 API를 근본적으로 갈아엎고 싶다는 욕망을 느꼈던 모양이다.

GDI+는 모든 API가 자신만의 별도의 namespace 안에 선언되어 있으며, POINT 같은 간단한 자료형도 자신만의 것을 재정의하여 쓸 정도로 기존 윈도우 API와는 거리를 두고 만들어졌다. 그리고 C++답게 같은 함수도 다양한 overload 버전이 존재하며, 좌표는 정수뿐만이 아니라 실수로도 받기 때문에 편리하다.

사소한 것이다만, 글자를 찍을 때 null-terminated string에 대해서 글자 길이 지정을 생략해도 되는 것 역시 마음에 든다.
전통적으로 윈도우의 GDI 함수들은 글자를 찍는 함수들은 문자열 길이를 반드시 지정해 주게 되어 있다. 왜냐하면 한 null-terminated string을 부분적으로 여러 줄에 걸쳐 찍어야 할 일도 있기 때문이다.

그러니 그런 API 디자인이 수긍은 가지만, 어차피 한 줄밖에 찍을 일이 없는 문자열을 매번 _wcslen 해 주는 것도 귀찮지 않은가. 예전에는 gdi가 아니라 user 계층에 있는 DrawText 같은 고수준 함수나 문자열 길이 지정을 -1로 생략이 가능했던 반면, GDI+는 이 정책이 좀 더 확대되었다.

GDI+는 GDI에 비해서 state machine으로서의 의미가 크게 퇴색했다. 그래서 그리기에 필요한 모든 정보들을 함수 호출 때 매개변수로 일일이 전달해 줘야 하는 경우가 많다. 가령, current position이라는 개념이 없기 때문에 MoveTo와 LineTo 따로가 아니며, SelectOjbect라는 개념도 없어져서 그리기 함수 때 매번 펜이나 브러시에 해당하는 개체를 따로 공급해 줘야 한다.

이런 디자인은 편리한 점도 있지만, 당장 화면에 뭔가를 찍는 드로잉 말고 벡터 path를 기록한다거나 메타파일 같은 걸 만들 때는, 내가 보기에 좀 불편하게 작용하는 점도 있는 것 같다. 가령, GDI에서는 똑같이 HDC이고 여기에다가 BeginPath를 해 주면 그때부터 path 그리기 모드로 GDI가 상태 관리를 하면서 동작한다. 그러던 것이 GDI+에서는 Graphics와 GraphicsPath라고 클래스가 아예 갈라졌다. 두 개체를 상태별로 분리한 건 분명 잘한 디자인이라는 거 인정한다.

하지만 Graphics 말고 GraphicsPath는 어차피 예전 위치에서 계속해서 이어서 그래픽을 기술하는 게 많은 만큼, 재래식 GDI처럼 current position이 있는 게 편리하지 않을까 싶다. 지금 API 체계에서는 직전 위치에 대한 정보를 응용 프로그램이 계속 공급해 줘야 한다.

또한, 복잡한 path를 화면에다 그릴 때, 예전 GDI는 지금 DC가 가지고 있는 펜과 브러시로 윤곽선을 그리고 내부를 채우는 것을 함수 호출 한 번으로 동시에 할 수 있었다. 그러나 GDI+는 선을 그리는 것과 내부를 채우는 것을 따로 해야 한다. path의 경계를 추출하여 래스터라이즈하는 것은 상당히 복잡한 계산이 필요한 작업인데, 동일한 작업이 비효율적으로 중복 적용되는 건 아닌지 우려된다.

즉, 본인은 GDI+에 대해서 참신한 기능은 분명 마음에 든다. 이 글에서 언급된 것 말고도 여러 고급 기능들이 있다. 윈도우 비스타 Aero와 연동하는 일부 드로잉 기능(가령, 클라이언트 영역에도 반투명 Aero 효과를 추가하고, 거기에다 글자를 찍는 것)은 오로지 GDI+로만 접근해야 하는 것도 있다.

하지만 (1) 그냥 재래식 GDI API에다가 옵션을 추가하는 형태로 구현했어도 충분해 보이는 것, (2) GDI+가 바꿔 놓은 API 디자인이 오히려 좀 불편하고 비효율적일 수도 있겠다 싶은 것에 대해 비판적인 안목을 갖고 있다. 속도가 재래식 GDI보다 꽤 느린 건 차치하고라도 말이다.

Posted by 사무엘

2012/04/28 08:39 2012/04/28 08:39
, ,
Response
No Trackback , 4 Comments
RSS :
http://moogi.new21.org/tc/rss/response/675

« Previous : 1 : ... 152 : 153 : 154 : 155 : 156 : 157 : 158 : 159 : 160 : ... 215 : Next »

블로그 이미지

그런즉 이제 애호박, 단호박, 늙은호박 이 셋은 항상 있으나, 그 중에 제일은 늙은호박이니라.

- 사무엘

Archives

Authors

  1. 사무엘

Calendar

«   2024/04   »
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30        

Site Stats

Total hits:
2675542
Today:
110
Yesterday:
2124