사이드바 영역으로 건너뛰기

게시물에서 찾기2007/01

2개의 게시물을 찾았습니다.

  1. 2007/01/30
    친구랑 잠깐 했던 얘기..
    로이쿤
  2. 2007/01/24
    삼항연산자와 TypeCasting
    로이쿤

친구랑 잠깐 했던 얘기..


친구랑 점심을 먹으면서 했던 이야기가 있다..
이야기의 시초는 그 친구가 앞으로는 정품만 사용하겠다고 한 것이다.
나는 뭐든 들으면 일단 반감을 가지고 다루는 재주(?)가 있어서..
역시 그 이야기를 흘려듣지 않았다.

소유에 있어서 배타적이지 않은 지식기반의 상품들을 팔아먹는 것에 반대하고..
불법소프트웨어도 사실 불법이 아닌데 불법으로 만든 거다..
개인적인 복제는 원래 법에서도 인정했던 것이다..
등등등...

그런 여러가지 것들을 늘어놓으면서 이야기를 하는 와중에..
그 친구는 이렇게 말했다..

"그래도 법은 지키면서 그런 얘기를 해야하는거 아니냐?"



그러면서 여러가지 기준이 헷갈리기 시작했다..
내 머리속에 있던 생각들은 이러했다..

잘못된 법이고 그에 의하여 당장 피해를 입는데..
그 피해를 고스란히 입으면서 법을 지킬 필요가 없다..
예를 들어 집시법을 어겼다고 해도 집회를 할 필요가 있는 것처럼..
안그러면 당장 누가 이런 피해를 알아주겠어?
일단 이런 생각이 들었고..

그럼 일단 생존에 깊은 연관이 없는 경우에는
어느 정도 지키면서  반대해야하는 것 아닌가?
그렇지 않는다면 세상의 법을 자의적으로 해석한 사람들이..
각각 법을 어기면서 생활해도 뭐라 할 수 없는 것이다..
어차피 법에 대한 생각은 다들 상대적일 것이고..
그들에게도 지금 내입장 또한 상대적으로 보일 것이다..

결국 결론은 '나는 내 멋대로 살거다' 로 맺어지긴 했으나..
찝찝한 결론이 아닐 수 없다..

내 방패막이는 이랬다..
어차피 내가 그렇게 해도 누군가에게 피해를 주지 않는다.
그렇지만 나는 불법소프트웨어를 사용하지 않는다면..
금전적인 지출이 많이 커지게 되고..
리눅스를 쓰거나 컴퓨터를 사용하지 못하게 되는 것이다.
법에 대한 정당성에도 동의하지 않고..
나도 피해를 입고..
허나 누군가에게 피해를 주진 않으니까.. 괜찮은거 아닐까? 라고..

강력하게 잘못된 법을 왜 지켜? 라고 했어야 할까?
아님 적당히 때에 따라서 어겨주면 돼.. 라고 했어야 할까?
일단 자존심에..
"법을 지키는 것보다 그것을 고치려는 노력을 더 많이해야 하지 않겠냐?"
라고 쐐기를 박았지만..
어찌 되었든 찝찝하긴 하다..

그동안 정말 쉽게쉽게 불법 소프트웨어를 사용해왔다..
내 스스로에 대한 정당성이 분명 있지만..
법에는 분명 불법인 행위이다..
법이란 족쇄가 아무렇지도 않아보였는데..
이렇게 뒤에서 내 발목을 잡을지 몰랐다..

결론적으로 저작권법 개악은 반드시 막아야 한다.;;
진보블로그 공감 버튼트위터로 리트윗하기페이스북에 공유하기딜리셔스에 북마크

삼항연산자와 TypeCasting

이 글은 http://j.strane.net/dokuwiki/doku.php/blog:2007:c_labyrinth_1 에서 제시된 문제에 제가 조금 더 생각해 본 것입니다.

#include "StdAfx.h"
#include
#include
using namespace std;

class B;

class A
{
public:
    A (){}
    A (const B& temp){}

    operator string() { return "It's A!"; };
};
 
class B
{
public:
    B (){}
    B (const A& temp){}
 
    operator string() { return "It's B!"; };
};
 
int main()
{
    A a;
    B b;

    string tTemp = (true ? a : b);
    cout << "Result : " << tTemp << endl;
    return 0;
}

위 예제를 다음과 같이 돌려 보았습니다.

1. A와 B에서 casting을 위한 생성자를 모두 제거합니다.
->  complie error!! : B를 A로 casting할 수가 없다는 error

2. B에서 A로의 생성자만 있는 경우

-> "It's A!"


3. A에서 B로의 생성자만 있는 경우
->
"It's B!"

4. 둘다 있는 경우
-> "It's A!"


삼항연산자 ? : 은 (이걸 뭐라하지;;)
Compile 시간에 결과인 두 항을 서로 Type casting이 가능한지 살핀다.
먼저 왼쪽의 항을 오른쪽으로 바꿀 수 있는 지 살펴본다. 가능하면 컴파일 성공!
이게 불가능하면 두번째로 오른쪽 항을 왼쪽항으로 바꿀 수 있는 지 살펴본다.
만일 이거마저 불가능하면 컴파일 error! 내용은 두번째가 불가능하다는 내용..

왜 이런 일을 하는 것일까요?
C++와 같은 언어는 Strongly-typed 언어이기 때문에...
컴파일러는 Type에 관한 checking을 수행해야 하는데..
이런 Check과정은 보통 Expression( a= b 따위의..) 단위로 이루어지게 됩니다.

대부분의 Expression은 한번의 TypeChecking으로 끝나게 되므로..
삼항연산자가 있는 Expression의 Type을 check할때..
이것을 예외적으로 처리할 수가 없어서..
컴파일러 단에서 일단 Type Cast를 시켜서
하나의 Type으로 맞추어 놓고 Check를 수행하기 때문으로 보입니다.

그 와중에 Casting을 위한 코드를 삽입하게 되고..
만일 이에 대한 생성자가 정의되어 있지 않다면..
Compile error가 날 수 밖에 없는 것이죠.

따라서 왠간히 복잡한 형태를 다루고 있다면..
이런 암묵적 casting은 위험할 수도 있으며..
쓸데없는 생성자까지 만들어줘야하는 불편함이 있으니..
복잡하지 않은 곳에만 삼항연산자를 쓰도록 하는 것이 좋겠습니다.

삼항연산자는 코드를 간결하게는 할 수 있지만 readability가 떨어지게 되니..
가급적 간단한 곳에만 사용하는게 좋겠습니다.


진보블로그 공감 버튼트위터로 리트윗하기페이스북에 공유하기딜리셔스에 북마크