개발자 면접 문제 중...

2008/06/27 11:15
Find three ways to change one character in the following code so that the resulting
code will print exactly 20 minus signs

Remember: for each solution you can only change "one" character from this original code:

int
i, n=20;
for(i =0 ; i < n ; i--)
  printf
("-");

: 인텔 개발자 인터뷰에서 나온 문제랍니다!^^ 자신은 과연 몇 개나 생각했나요?ㅋ

more..


출처: http://theeye.pe.kr/
크리에이티브 커먼즈 라이센스
Creative Commons License
TAG ,

Trackback

Trackback Address :: http://www.nohungry.net/tt1/trackback/130

Comments

  1. 하늘바다 2008/06/27 17:06

    난 두개~ 으앗.... 첫번째 걸 놓치다니.... -_-

    perm. |  mod/del. |  reply.

What's on your mind?

댓글 입력 폼
[로그인][오픈아이디란?]

소프트웨어 디자인 패턴에 대해 공부하기 위해 웹을 헤매던 중.. Exception Handling에 대한 내용을 다룬 Article을 읽었다. 거기에 소개된 내용이 바로 RAII란 개념이다.

쉽게 얘기하면, Stack-based 변수Heap-based 변수와 관련 있는 얘기다.
다음과 같은 코드를 생각해보자.
<Example #1>
CSomething something("Stack");                                 // Stack-based 변수
CSomething* pSomething = new CSomething("Heap");   // Heap-based 변수

// 생략 ...

delete pSomething;
pSomething = NULL;

<Example#1>에서 알 수 있듯이, Stack-based 변수는 소멸자 해제를 Runtime이 관리해주고, Heap-based 변수는 프로그래머 자신이 관리해야된다. (다 아는 얘기지만.. new를 했으면, delete를 해줘야 하는 법...)

이걸 깜빡하면, 결국 메모리 누수(Memory Leak)이란 재앙을 만나게 된다.

근데, 이렇게 다 아는 얘기를 왜?! 하고 싶은 얘기는 지금 부터다.
학교 숙제를 할 때 우리는 예외 처리(Exception Handling)에 대한 중요성을 소홀히 할 때가 많다.
물론, 조환규 교수님께서는 늘 프로그램의 가장 중요한 덕목은 땐땐함(Robust)이라고 하셨지만..ㅎ 숙제 마감에 시달리게 되다보면, 그걸 지키지 못하는 경우가 허다하다.

<Example #1>을 다음과 같이 수정해보자.
<Example #2>
CSomething something("Stack");                                 // Stack-based 변수
CSomething* pSomething = new CSomething("Heap");   // Heap-based 변수

try{
// 생략 ...
}
catch(int exception_code)
{
     cout << "Exception Occured." << endl;
     delete pSomething;
     pSomething = NULL;
}

delete pSomething;
pSomething = NULL;

자, 예외 처리가 들어가면서, 코드가 뒤죽박죽이 되어버렸다. 동일한 코드가 반복적으로 사용되었고, 예외처리 부분과 자료구조 부분도 섞여버렸다. 이런 부분이 꼭 나중에 문제를 일으키기 쉽다.

깜빡하고, delete를 안해줘서 메모리 누수가 발생하거나, 아니면, 나중에 코드를 유지보수해야할 때도 골치아프게 된다.

이렇게, 골치가 아프게 되는 원인은, Heap-based 변수에 있다. Heap-based 변수는 바로 프로그래머가 관리해줘야 하기 때문이다. 그래서 가급적이면 Heap-based 변수를 사용하지 말자. (포인터를 쓰지 않겠다는 말이냐고?!)

당근, 그건 아니다. 그래서, 필요한 것이 바로 Smart Pointer~!
다음과 같은 코드를 만들어보자.
<Example #3>
class CSomethingPtr
{
public:
CSomethingPtr(CSomething* pSomething);
~CSomethingPtr();

private:
CSomething* m_pSomething;
};

CSomethingPtr::CSomethingPtr(CSomething* pSomething)
: m_pSomething(pSomething)
{
}

CSomethingPtr::~CSomethingPtr()
{
delete pSomething;
pSomething = NULL;
}

그럼, <Example #3>를 이용해 <Example #2>를 수정해보자.
<Example #4>
CSomething something("Stack");                                           // Stack-based 변수
CSomethingPtr pSomethingPtr(new CSomething("Stack"));       // Stack-based 변수

try{
// 생략 ...
}
catch(int exception_code)
{
     cout << "Exception." << endl;
}

이런 식의 기법을 바로 Smart Pointer(포인터처럼 동작하는 객체)라고 한다.
바로 지역객체(Stack-based 변수)를 사용하여 자원을 관리한다고 해서 이를 RAII라고 한다.

RAII에 대해서 공부하면서, 문득 생각난.. 왜 DirectShow SDK에서 Pointer 대신 CComPtr과 같은 형식의 클래스가 많은지 이제 깨달았다. (그 때는 별 생각없이 썼는데.. 돌이켜보면 바로 이런 관점에서 작성한 것이었으리라..)
아무튼, 앞으로도 이런 내용을 보다 열심히 공부할 필요가 있겠다.


보다 자세한 내용은 고형호님의 블로그(http://www.innosigma.com)에 가시면 찾아볼 수 있습니다..^^

크리에이티브 커먼즈 라이센스
Creative Commons License
TAG

Trackback

Trackback Address :: http://www.nohungry.net/tt1/trackback/92

Comments

  1. acaran 2007/07/04 22:45

    저렇게 스마트 포인터를 사용할 경우, 그냥 포인터 참조할때 보다 속도에 있어서 손해볼건 없는가?

    perm. |  mod/del. |  reply.
    • NOhungry 2007/07/05 09:08

      나도 전문을 다 읽어보지 못하여 퍼포먼스에 대한 정확한 판단을 내리긴 힘드네.

      하지만, 이 업계 최고수 중 하나로 불리는 Effective C++의 저자인 스캇 마이어스가 추천하는 기법이니, 퍼포먼스 면에서 크게 차이가 없을거라 보네.

      설사 퍼포먼스 면에서 약간의 손해가 있더라도 예외처리가 많이 포함되어야 하는 다소 큰 규모의 프로젝트에서는 이 방식을 쓰는게 코딩의 효율성 측면에서 좋지 않을까 생각되는구려.

What's on your mind?

댓글 입력 폼
[로그인][오픈아이디란?]