잊지 않겠습니다.

상속보다는 interface를 정의하고 구현하는 것이 좋다.
  • 상위 클래스는 클래스의 계층 구조에서 공통의 원형을 제공한다.
  • Interface는 특정 타잎이 구현해야지 되는 동작에 대해서 묘사한다.  
    • 기능 명세
    • 기능에 대한 계약
    • 상속 관계를 가지지 않은 서로 다른 타잎들이 동일한 interface를 구현해서 코드의 재활용을 높인다.
  • 클래스와 Interface의 선택 
    • 어떤 방법으로 추상화를 제공하는가에 대한 문제 
      • Interface : 특정 타잎이 반드시 구현해야지 되는 계약
      • Base Class : 언제든 필요시에 변경되고 확장이 가능
    • 서로간에 연관이 없는 class간의 공통동작에 대한 확장 
interface의 구분과 virtual method의 overriding의 구분
  • Base class의 interface는 virtual이 될 수 없다  : interface는 직접 사용되는 동작으로 구분되어야지 된다
  • Type이 구현되는 계약으로 인식
delegate를 이용해서 CallBack을 표현하라
  • class간의 상호통신을 수행하는데에, 결합도를 낮추기 위한 방법으로 delegate가 좋다
  • runtime 시에 callback을 구상하는 .NET Framework에서의 최고의 방법
event를 이용해서 외부로 노출할 interface를 구분하라
  •  다수의 다른 객체와 통신을 해야지 될 때에 이벤트를 사용
  • delegate와 event는 다르지만, 사용에 있어서 같다고 봐도 무방하다.
class 내부 객체에 대한 reference 반환을 피하라.
  • reference 변환은 class의 내부의 값을 변환시킬 수 있다.
  • 모든 reference의 값을 get 등의 값으로 외부에 노출시킬 때는 copy()를 시켜서 복사본을 내보내는 것이 좋다.
명령적 프로그래밍보다 선언적 프로그래밍이 더 좋다.
  • Attribute를 자주 사용하고, method에 대한 명시를 정확하게 구현하라.
  • 가독성이 매우 뛰어나다.
Serializable Type이 더 좋다.
  • Serialize가 제공되지 않는 타잎을 맴버로 삼는 class의 Serialize가 불가능하기 때문에 처음부터 모든 class에서 Serializable 상태로 만들어준다.
  • 다음을 제외한 class는 Serializable type이 되어야지 된다.
    • UI
    • WinForm
    • UI 전용 Contorl
IComparable과 IComparer를 이용해서 순차관계를 구현하라.
  •  검색과 정렬을 위한 상호간의 순차관계를 표현 가능해야지 된다
  • CompareTo() : 현재 객체가 비교할 객체보다 작은 경우, 0보다 작은 값을. 클 경우에 0보다 큰 값을 반환하도록 구현 
ICloneable의 구현을 피해라
Posted by Y2K
,

상속관계인 Class를 Derived Class, Base Class라고 할때, DerivedClass를 생성할 때 생성자의 순서는 다음과 같다.

  • Derived class의 초기화된 변수들
  • Base class의 초기화된 변수들
  • Base class의 생성자
  • Derived class의 생성자

 

따라서, override 된 함수들을 Base class의 생성자에 넣게 되는 경우에는 Derived class의 생성자에서 호출이 될 수 없다.

이때에는 Init() 또는 Initialized() 함수를 따로 구성시켜서, 생성 이후에 재초기화를 시켜줘야지 된다.

이런 경우를 two-phase construction 이라고 부른다.

Posted by Y2K
,

    COM class와 통신하는 방법에서 사용되었던 Interface를 C#에서 옮겨온 방법

  • C++에서는 pure virtual 함수를 이용한 interface의 구현으로 되었다.
  • C#에서는 Interface를 이용하는 방법이 프로그램의 디자인적 방법으로 구현되었다.
Interface의 특성
  • 암시적으로 Public
  • 암시적으로 Abstract
  • ALL OR NONE 명제를 따르게 된다.
  • 여러개의 interface를 상속가능하기 때문에, C++의 특징인 다중 상속과 비슷한 방법으로 구현이 가능하다.
추상 메서드 vs interface

  • interface는 순수한 프로토컬만의 기능을 가지고 있다.
  • 또 다른 방법의 다형적 동작이 가능한 프로그래밍이 가능하다.
  • 언제나 public이기 때문에 구현에 대해서 생각을 해줘야지 된다. : 객체내에서만 사용이 되는 것을 interface로 구현해줄 필요는 전혀 없다.
    • interface의 범위를 제한하기 위한 방법 : 언제나 공개적이고, 구현이 되어야지 된다.
인터페이스의 참조
  • as : 해당되는 interface의 구현 여부를 알아본다.
  • is : 인터페이스를 얻어낼 수 있다. (실패하면 null이 반환된다.)
Posted by Y2K
,

4. Variance

.NET Framework 2009. 1. 7. 12:57

IEnumerable interface의 변경 

  1. public interface IEnumerable<out T> : IEnumerable  
  2. {  
  3.     IEnumerator<T> GetEnumerator();  
  4. }  
  5.   
  6. public interface IEnumerator<out T> : IEnumerator  
  7. {  
  8.     bool MoveNext();  
  9.     T Current { get; }  
  10. }  

 : out의 추가. 모든 결과의 output만이 가능한 상태로 interface의 변경

 

IComparer interface의 변경

  1. public interface IComparer<in T>  
  2. {  
  3.     public int Compare(T left, T right);  
  4. }  

각 Interface에서의 in, out의 명시적 사용이 된 형태로 interface 변경

Posted by Y2K
,

Dynamic import

: Dynamic lookup과 같이 사용되어서 COM에 대한 명시적 선언이 없이 COM 객체에 대한 접근 및 사용이 가능하다.

IDispatch의 이용과 거의 동일하게 사용 가능하다.

  1. //old code  
  2. ((Excel.Range)excel.Cells[1,1]).value2 = "Hello";  
  3.   
  4. //New Code  
  5. excel.Cells[1,1].Value = "Hello";  

 

Omitting ref

: COM에서는 input parameter가 output으로 이용되는 경우가 아주 많다. 대부분이 LRESULT를 반환하고, 나머지 결과들을 대부분 Input Parameter에서 reference 형태로 관리가 되는 경우가 대부분이다. 기존의 C#에서 COM object를 사용할 때에는 ref를 지원하였으나, 이제는 자동으로 형태를 구현 할 수 있게 변경된다.

: COM 객체에 대한 지원은 .NET Framework가 올라가면 올라갈수록 계속해서 변경되는 사항인 것 같다.;;
Posted by Y2K
,

Optional parameters

  1. public void Method1(int x, int y = 3, int z = 7);   
  2.   
  3. Method1(10, 11, 12); //ordinary call of Method1  
  4. Method1(10, 11); // x = 10, y = 11, z = 7  
  5. Method1(10); // x = 10, y = 3, z = 7  

: 가장 바라던 기능. 수많은 overload 함수들을 제거할 수 있게 된다. 다른 .NET Framework API들에서도 많은 변화가 있을 것 같다는 생각이 든다.

 

Named and optional arguments

  1. public void Method1(int x, int y = 3, int z = 7);   
  2.   
  3. Method1(10, 11, 12); //ordinary call of Method1  
  4. Method1(x : 1, z : 10); // x = 1, y = 3, z = 10  
  5. Method1(z : 10, x : 1); // x = 1, y = 3, z = 10 : reversing the order of arguments  
: 놀라운 변화중 하나. Ruby나 Python에서 제공되는 Named Arguments를 사용가능하다.
Posted by Y2K
,

1. Dynamic Lookup

.NET Framework 2009. 1. 7. 12:56


method나 instance를 동적으로 가능하도록 변경.

COM, IronPython, HTML DOM 또는 Reflection을 통해 얻어진 객체에 대한 동적인 접근이 가능.

 

The Dynamic Type

C# 4.0에서는 "dynamic" 으로 지정된 Type의 경우에는 runtime 시에 객체의 Byte code를 생성하게 된다.

 

  1. dynamic d = GetDynamicObject(....);  
  2. d.M(7)  

C# compiler에서 Compile시에 dynamic으로 지정된 Instance의 경우에는 Compile시에 넘어가게 되고, runtime시에 method를 각 parameter의 type에 따라서 구현, 실행하게 된다. 

이는 Type에서만 구현되는 것이 아닌, Method, Property 에서도 역시 같이 구현되게 된다.

 

: 상당히 멋진 기능이라고 생각되긴 하는데.. C#이 가진 선언적 언어 특성을 많이 버리는 느낌이 든다. 일단 백서에도 나와있듯이 안정성과 속도를 조금은 버리는 작업이기 때문에 사용하는 것에 있어서 많은 생각을 해봐야지 될것 같다. 무엇보다 Python이 아닌 IronPython의 객체를 얻어오는 것이라서, MS 가 아닌 다른 언어의 객체에 대한 구현은 조금 후에 알아봐야지 될것 같다. (분명히 Python도 되게 하는 방법이 생길것이다.)

 

: 그리고, 이미 사용되고 있는 곳은 매우 많다. Reflection을 통한 invoke와 너무나도 유사한 기능으로 Reflection의 확장으로 보이는 것은 나만의 착각인것일까? 

 

: 생각하지 못했던 내용이 있었다. JSON 데이터 포멧의 경우에는 자유롭게 확장들이 가능해진다. 사용되는 Class의 Property가 무엇인지만 알면 dynamic으로 선언해서 데이터를 얻어오고, 데이터에 대한 객체화가 매우 자유롭게 바뀌게 된다. 

  1. string jsonText = "{ xyz: 123, items: [ 10, 100, 1000 ] }";  
  2.   
  3. JsonReader jsonReader = new JsonReader(jsonText);  
  4. dynamic jsonObject = jsonReader.ReadValue();  
  5.   
  6. dynamic items = jsonObject.items;  
  7. items.Item(2, 1001);  
  8.   
  9. dynamic bar = new JsonObject();  
  10. bar.name = "c#";  
  11. jsonObject.bar = bar;  
  12.   
  13. JsonWriter writer = new JsonWriter();  
  14. writer.WriteValue((object)jsonObject);  
  15.   
  16. string newJsonText = writer.Json;  

 


Runtime Lookup

1. COM objects

: IDispatch를 통한 COM object의 이용. 

2. Dynamic objects

: IDynamicObject interface를 상속한 Class 

3. Plain objects 

: Standard .NET Object

위의 3가지 경우에서 Runtime lookup을 사용가능하다.  

 

  1. dynamic d1 = new Foo();  
  2. dynamic d2 = new Bar();  
  3. string s;  
  4.   
  5. d1.M(s, d2, 3, null);  

 

The Dynamic Langauage Runtime(DLR)

New API in .NET 4.0: DLR은 C#만이 아닌 .NET 기반의 다른 언어들에 대한 변환을 제공 

 

Open Issues

  • Extendted Method에 대한 지원을 할 수 없다. Dynamic으로 선언된 Instance에 대한 Extented Method를 구현하는 것은 불가능하다.
  • Anonymous functions은 dynamic method call에서 지원할 수 없다. 아래와 같은 코드는 사용 불가능하다.
  1. dynamic collection = ....;  
  2. var result = collection.Select(e=>e+5); //사용 불가능하다.  

 

 

Posted by Y2K
,

Visual Studio 2010과 더불어서 같이 준비중인 C# 4.0에서의 새로운 기능들을 간단히 알아보려고 생각중. 

참고 자료 사이트는

http://code.msdn.microsoft.com/csharpfuture


기본 테마

C# 4.0은 Dynamic programming을 기본 Theme로 가지고 있다.

Dynamic Programming언어라고 할 수 있는 Python이나 Ruby정도까지는 아니지만, Compile 할때가 아닌 Runtime시에 자신의 type을 결정할 수 있는 방법으로 구현되고자 한다.  이러한 Dynamic의 예는 다음과 같은 수 있다. 

1. Python이나 Ruby와 같은 Dynamic Programming language에서 생성된 object

2. IDispatch를 통해 구현된 COM objects

3. refrection을 통해 구현된 .NET framework의 객체들

4. 구조체가 변경된 object. (HTML DOM object)

    

C# 4.0의 주요한 기능은 다음과 같다.

1. Dynamic lookup

:  C#의 runtime시에 object의 type이 결정되게 된다.

2. Named and optional parameters

: C#에서의 각 parameter들은 각각의 기본값을 가질수 있다.

  ( C++에서의 기능과 동일하게 생각하면 된다. 왜 이제서야 구현이 되었는지 모르겠는 아주 편한 기능. 이 기능 하나로 많은 overload를 없애는 것이 가능하다.)

: C#에서의 각 parameter들은 각각의 이름을 가지고 값의 입력이 가능하다.

  ( python이나 javascript에서 간간히 나오는 dictionary 입력과 비슷한 함수의 호출이 가능하다. ) 

3. COM specific interop feature

: .NET Framework에서의 COM object의 interop의 개선 및 향상 

4. Variance 

: IEnumerable의 Interface 변경이 이루어졌다. (이건 좀 큰문제가 발생할 수 도 있을것 같은 생각이 든다. List<object> 등 IEnumerable의 Interface는 너무나 많은 곳에서 사용되고 있는데.. 이 부분은 어찌 해결이 될지..;)



Posted by Y2K
,

Visual Studio 2008에서는 Targeting을 정해줄 수 있다 : .NET Framework의 종류를 지정해서 compile을 시킬 수 있다.

1. Auto-implemented property

  • Property에서 간단히 값을 저장하는 형식이라면 private 변수들을 선언하거나 property의 구현을 하지 않더라도, 구현이 가능하다.
  • Code가 매우 간단해지고, 간단한 수행에서의 가독성을 높여준다.
  • 기존의 get/set에서의 특별한 행동을 해주는 경우에는 전과 같이 안의 코드를 만들어줘야지 된다.        
    class AutoImplementedClass
    {
        public string Name
        {
            get; set;
        }
        public string Customer
        {
            get;
            private set;
        }
    }

  

2. Object / Collection Initializer

  • Class의 선언과 동시에 private 변수를 초기화 시키는 것이 가능하다.
  • Object / Collection Initialize에서는 {}를 사용하는 것을 유념할것.
  • Public 변수들만 된다.    
    List<int> powers = new List<int>{ 1, 2, 3, 4, 5, 6, 7 };    
    class Point
    {
        public int x, y;        
    }
    Point point = new Point{x = 0, y = 1};

  

3. Local Variable Type Inference

  • Type 명을 적지 않더라도, compiler에서 선언 대치해줄수 있다.
  • 'var' keyword를 이용해서 사용가능하다.
  • 주의할 점은 var에서 type을 변화시킬 수 없는 경우에서는 에러가 나타난다.
  • Type이 동적으로 되는 것이 아니라, 초기화 될때 Type은 결정되어 고정된다.

  

4. Anonymous Type

  • 익명 Type Class
  • 프로그램에서 참조할 수 없다.
  • 복잡한 임시 테이블에 사용하는 것이 좋다. 
    static void Main(string[] args)
    {
        var x = new {a =3 , b = 5, c ="some text"}
        assert.AreEqual(3, x.a)
        assert.AreEqual(5, x.b)
        assert.AreEqual("some text", x.c)        
    }

  

5. Lamda Expression

  • Delegate와 매우 연관이 높다.
  • Lamda expression에서 input/output에서 type을 명확히 넣어주고 싶은 경우에는 type을 결정해서 넣어주면 된다.
  • Func<T> : return 값이 존재하는 경우에 기본적으로 사용되는 delegate type (new delegate로 만들어줘도 상관이 없지만, 기왕에 있는 녀석이면 사용하자.)
  • Action<T> : return 값이 존재하지 않는 경우에 사용되는 delegate type (new delegate로 만들어줘도 상관이 없지만, 기왕에 있는 녀석이면 사용하자.)
    SomeDelegate d3 = s => s.ToUpper();
    SomeDelegate d4 = (string s) => {return s.ToUpper()}
    string a = d3("abcde")

  

6. Extension Methods

  • 기존 Class에 새로운 기능을 추가한다.
  • 상속을 받지 않고도 가능하다.
  • 실행 우선 순위가 Instance method보다 낮다.
  • "this string s" 라는 구문으로 string class에 대한 확장 class를 구현 가능하다.
  • 특정한 API를 만드는 것은 좋지만, 가독성에 심각한 문제를 초래할 수도 있다. 
    public static class Extensions
    {
        public static int ToInt32(this string s)    
        {
            return 0;
        }
    }

  

7. Partial Methods

  • Prital Method는 Partial Class안에 선언되어야지 된다.
  • 반드시 Return type은 void가 되어야지 된다.
  • 반드시 private 한정자에서만 가능하다.
  • C++에서의 함수 선언을 header에서 하는 것과 비슷하게 생각하면 쉽다.
  • 구현부가 없는 경우에는 compiler가 연관된 모든 code를 삭제할 수 있다.

  

8. Query Expressions [LINQ]

  • var = contacts = from c in customers where c.City == "London" SELECT new {c.Customer.ID, c.City}
  • Where 문을 Extension Method를 이용해서 만들어주고, Lamda Expression을 이용해서 내부적으로 code를 작성시켜주게 된다.
    class Customer
    {
        public string CustomerID { get; set; }
        public string ContactName { get; set; }
        public string City { get; set; }
    }
    public class Program
    {
        static void Main(string[] args)
        {
            List<Customers> customers = LoadCustomers();
            var query = from c in customers
                                where c.City == "London"
                                select (new {c.CustomerID, c.ContactName} );
            foreach (var item in query)
            {
                Console.WriteLine(item);
            }                
        }
    }

../C# 3.0/LINQ.png

Posted by Y2K
,

황우석 '거짓말'의 끝은?

[이형기 교수의 참담한 심정 토로] "무슨 염치로 또 난자를 달라 하십니까"


- "대마초는 피웠지만, 연기는 들이 마시지 않았습니다." (클린턴 미국 전 대통령)
- "술 마시고 운전했지만, 음주 운전은 아닙니다." (익명의 음주 운전자)
- "앞뒤가 안 맞는 얘기는 했지만, 거짓말은 안 했습니다." (황우석, 이병천 교수)


황우석 '거짓말'의 끝은 어디인가

황우석 교수의 줄기세포 진위 논쟁이 점입가경이다. 사실 이러한 논쟁이 엄정한 검증 절차를 생략한 채 한 쪽의 일방적인 주장만을 양산하는 기자회견이라는 형식을 빌려 이뤄지고 있는 현실 자체가 몹시 못마땅하다.

노성일 이사장의 급작스러운 기자회견도 그러려니와, 지금까지는 들끓는 국민의 의혹에도 아랑곳없이 편 가르기로 헤진 상처가 벌어질 대로 벌어질 때까지 소 닭 보듯 하며 일절 언급도 없던 황 교수가 다시 언론을 상대로 '믿어주십사' 읍소를 하는 것은 더욱 희극적이다.

먼저 분명히 짚고 넘어갈 게 있다. 본인이 의도하든 의도하지 않았든 황우석 교수는 이미 여러 차례 거짓말을 하고 이를 나중에 번복한 분이다.

'연구원 난자 제공은 없었다'고 1년 반을 버티다 결국 사실을 실토한 것도 그렇고, 줄기세포 논란이 불거지던 와중에도 '줄기세포는 있다(현재형)'고 하다가, 이제는 기자회견에서 '줄기세포는 있었지만(과거형), 지금은 다 죽었다'라고 식언을 일삼는 것을 도대체 어떤 식으로 이해해야 할까?

줄기세포 '유무'는 문제의 핵심 아니다

더 우스운 것은, 과학자로서는 절대 용납이 안 되는 연구결과의 조작 사실 앞에서도 '봐, 있었대잖아?'라며 짐짓 황우석 교수를 옹호하고 나서는 이들이다. 이해하기 힘든 이러한 거짓 조장 또는 관용의 정서는, '원천기술이 있으니 기회를 주면 보여 주겠다'는 황 교수의 기자회견문 마지막 문장에 진하게 배어 있다.

도대체 이분들은 이 사태의 본질과 심각성이 어디에 있는지 알고나 계신 걸까? 황우석 교수의 일성이다. "저희가 이미 2004년 논문이 있는데, 2005년 논문에 11개가 아니고 1개면 어떻습니까? 3개면 어떻겠습니까? 그리고 1년 뒤에 논문이 나오면 또 어떻습니까?"

누군가 둔기로 머리를 심하게 내려치는 통증을 느낀 것은 필자만일까? 11개 중에 단 하나만 거짓으로 보고했다고 하더라도, 그 자체로 이미 과학자로서는 회복 불가능한 신뢰성의 손상을 입었다는 사실을 얼마나 더 말해 주어야 이분들이 들은 척이라도 할까?

황우석 교수가 거짓말을 아무렇지도 않게 생각한다는 이 부끄러운 사실은, 주요 연구자 중의 1명인 이병천 교수의 말에서도 그대로 드러난다. 모 신문과의 전화 통화에서 이 교수는 "올 초 오염된 6개의 줄기세포 대신 6개를 다시 만들고 3월 전까지 3개를 더 만들어 총 9개를 만들었는데, 논문 게재 후 2개가 더 만들어져 총 11개의 줄기세포가 만들어진 것"이라고 해명했단다. 다시 말해, 논문을 〈사이언스〉에 제출한 2005년 3월 15일에는 9개의 줄기세포밖에 없었으면서도, 버젓이 논문에는 11개라고 속였다는 것이다.

명색이 한국 최고 명문대학의 교수요 첨단 과학자라는 사람이 어떻게 이런 말을 해명이라고 늘어놓으면서 자신들의 조작 또는 거짓 방조 행위를 정당화하려고 할 수 있는가? 어수룩한 일반인들이야 '그런가 봐' 하며 넘어갈지 모르나, 이런 거짓말이 과학계에서도 통할 것이라고 언감생심 기대한다면 정말 오산이다.

황우석 '부정행위'는 용서 받을 수 없어

더욱이 올 초부터 3월 15일 논문 제출 시점까지 다시 만들었다던 줄기세포가 진짜 분화 기능이 있는지 테라토마를 통해 살폈다고 돼 있는데, 과연 이것이 물리적으로 가능한 시간인가? 과학 논문을 한번이라도 써 본 경험이 있는 사람이라면, 초고부터 최종 원고 작성까지 검토에 재검토를 거쳐야 하고, 이 과정에서 족히 수 개월이 걸린다는 것은 기본인데 말이다. 그뿐만 아니라, 황우석 교수팀은 영어가 안 돼 제럴드 섀튼 교수가 대필해 주었다는데, 어떻게 영어도 잘 안되는 사람이 결과도 나오지 않은 상태에서 그 내용을 일일이 설명하면서 최종 논문을 그야말로 순식간에 쓸 수 있었을까?

필자가 〈프레시안〉 기고문에서 밝힌 것처럼, 이미 드러난 사실만으로도 황우석 교수의 연구 부정행위는 부인을 할 수 없다. 미국의 경우 이런 연구자에게 다시 연구비를 주는 단체는 어느 곳도 없다. 심한 경우는 지금까지 거짓 논문 만드는 데 사용한 연구비도 도로 내 놓아야 할 판이다.

원천기술이 있으니 줄기세포 생산을 재현할 수 있도록 기회를 달라구요? 그러면 그 난자는 도대체 어디에서 구하시렵니까? 한 걸음 양보해 어렵사리 난자를 구해 드렸다고 하더라도, 그 결과는 어디에다 발표도 못할 텐데요? 황우석 교수님 한 분의 명예를 회복하자고, 또 다시 많은 성녀(聖女)들을 위험에 빠뜨리라고요?

황우석 교수님 말고도 이 일 할 수 있는 사람 많이 있습니다. 이제 좀 그만하십시오. 무슨 염치로 또 난자를 달라고 하십니까?

추신 : 필자는 이전 〈프레시안〉 기고문에서 역할이 끝났다고 밝혔다. 그런데, 아닌 것 같다. 이것도 필자로서는 분명 식언이었다. 필자의 체면이 구겨지는 것을 알지만, 이거는 정말 아니다.  
  
이형기/피츠버그의대 교수 

영권군 생각 : 스프링 노트에 다시 정리하면서 느낀 점이 너무나도 많다. 특히 아직도 끝이 안난 이 황박사의 일은 우리사회에 과연 무엇을 가져다 준것일까.. 라는 의문이 계속해서 생기는것이 사실이다. 과연 이 일에서 우리는 배운것이 있는가?

단지, 하나 알게 된것은 우리나라가 상당히 파시즘적인 생각을 많이 가지고 있다는 것을 알게 되었다. 특히, 민족주의와 국익에 대해서 같이 얽히면 정말 '종교'가 탄생한다는 느낌이 들정도의 엄청난 일이 벌어지는 것을 눈으로 보고 난 이후에.. 이제는 사람의 '이성'이라는 것에 대해서 많은 회의가 드는 것이 사실이다. 사람은 모두다 이성적이다. 그렇기 때문에 옳은 판단을 할 수 있다 라는 생각을 가지고 있었지만.. 지금은...... 민주주의라는 방식 자체부터 회의감이 든다. 차라리 왕정이나 절대자가 하나 통치하는 것이 옳은 방향으로 가는 것이 아닌가. 하는 생각마져 든다. 과연 무엇이 옳은 것일까?

황박 사태. 아직도 끝나지 않았고.. 아직도 ing.. 상태로 가는 것이 사실이지만, 정말로 순진한 사람들이 당하고 있다는 생각을 하면 연민도 느껴지는 그런일이 되어서 참 씁쓸하다.

   

Posted by Y2K
,