'분류 전체보기'에 해당되는 글 170건

  1. 2008.11.23 ego_Test 8
  2. 2008.11.22 디지털 카메라를 사면 하고 싶은 두 가지 10
  3. 2008.11.22 지겨운 병신레이스.. 4
  4. 2008.11.22 리뷰어들에 대한 쓴소리 5
  5. 2008.11.20 첫눈왔다!! 4
  6. 2008.11.16 미칠듯한 공허함. 6
  7. 2008.11.16 개발방식의 모습에서 본 C#과 RAD 툴 이야기. 8
  8. 2008.11.12 수능이네 4
  9. 2008.10.24 동적 할당 이야기 - 3 1
  10. 2008.10.22 동적할당 이야기 - 2 1
나의 이야기/Note2008. 11. 23. 18:56
AABBA
사회의 모범생 타입
▷ 성격
세상 사람들로부터는 극찬을 받으며 일을 떠맡지만 정작 본인은 생활을 그다지 즐기지 못해 매우 손해를 보는 운명이라 할 수 있습니다. 또 이런 사람들은 세간의 눈을 지나치게 의식합니다. 높은 이상, 강한 책임감, 의리와 인정, 바람직한 행동 등 사회인의 모범이 될만한 언동을 지향하기 때문에 결국 스스로 자신의 행동을 얽어매게 됩니다. 일상 생활을 마음 편히 즐기지 못하기 때문에 스트레스를 가장 주의해야 합니다. 높은 정신적 에너지가 강한 목적의식에 휘둘리기 때문에 스스로 큰 부담을 느끼게 됩니다. 그리고 그것이 심신을 억눌러 결국에는 모든 것을 잃게 될 가능성이 있습니다.
▷ 대인관계 (상대방이 이 타입일 경우 어떻게 하연 좋을까?)

연인, 배우자-사회의 모범생이라는 단면에만 이끌릴 위험이 있습니다. 이런 타입에게 딱맞는 상대는 똑같이 성실하고 노력파인 타입이겠죠.

거래처(고객)-약속을 엄수하고 타인에게 무리하게 강요하는 일이 없다는 점에서 매우 좋은 파트너입니다. 그러나 융통성이 좀 부족합니다.

상사-완벽하게 신뢰할 수 있는 상사입니다. 그러나 점점 갑갑함을 느끼게 되는 타입이죠. 결국 당신은 퇴근 후 철저히 개인으로 돌아가 스트레스를 해소할 수 밖에 없습니다.

동료, 부하직뭔-일에 대해서는 혼신의 힘을 다해 노력하는 타입입니다. 그러나 창조력이 없어 아이디어를 요구하는 일에는 적합하지 않습니다. 놀이를 함께해도 재미없는 사람입니다.

흠.. 좀 비슷한가?

종휘 블로그 갔다가 재밌는 글을 봐서 트랙백으로 써 본다.

테스트는 http://byule.com/board/?mid=ego_start 에서 했습니다.
Posted by 머리
나의 이야기/Note2008. 11. 22. 16:22
  아쉽게도... 디지털 카메라가 보급화 된지가 언젠데 난 아직도 디지털 카메라가 없다!! 그러다 보니 여기 저기 다니다 보면 "아 이럴 때 디카가 있으면 좋았을텐데" 하는 때가 많다.
  그래서 여기에서나마 한번 해보고 싶은 것들을 적어 보련다.

1. 사진기와 함께 하는 기차여행
  개인적으로 기차 타는것을 정말 좋아한다. 자동차나 비행기 같은건 멀미도 하고 왠지 답답해서 별로 좋아하지는 않는데, 기차타고 밖을 보면서 움직이는건 정말 좋아한다. 그런것 치고 기차 여행은 몇번 안해봤는데, 디카가 생기고 여유가 생긴다면 한번 나가 보고 싶다. (특히 새벽여행!)

2. 릴레이 인터뷰
  음.. 이건 좀 비현실적(?)인 일인듯하다. 뭐냐면 한가지 주제를 정해서 그 주제에 대해서 계속 취재를 해 나가는 것이다. 예를 들어 맛집을 한다 하면 맛집을 계속 조사해 나가면서 사진도 찍고 먹고 기사도 쓰고 한다던지, 인물 인터뷰를 한다고 하면 지인 하나와 인터뷰를 한번 하고 그 지인에게서 추천인을 받아서 또 인터뷰 하고 추천 받고 하는 식으로.. '릴레이'와 '인터뷰'에 모두 각각 의미가 있다. 물론 포스팅도 연재 형식으로 계속 하고. 이럴때 카메라 하나 없이 가는건 이상하지 않은가? 그런데 그걸 떠나서 모르는 이에게 막 달라붙어서 인터뷰 하는건 현실적으로 좀 그렇다.

  지금은 현실적인 제약이 너무나많이 따르지만 언젠가는 해보고 싶네. 흑.. 디지털 카메라.. 갖고 싶어~!
Posted by 머리
나의 이야기/Note2008. 11. 22. 15:06

짧게 쓴다.
정말 요즘은 병신레이스밖에 안보이는구나

질린다 질려

어느새 나도

병신 레이스를 하고 있을 때가 있더라.

이겨도 병신 져도 병신..

이겨도 병신 져도 병신이라면 이기는 병신이 되겠다...

그냥.. 써봤다.

Posted by 머리
나의 이야기/Note2008. 11. 22. 14:56

  어느 분야를 막론하고 새로 나온것이나 기존 것들에 대한 리뷰는 항상 있게 마련이다. 예전에는 주로 전문 기자들이 신문이나 잡지 등의 매체를 이용해서 리뷰가 나왔고 대중도 이것을 통해서 세상의 여러가지 것들에 대한 정보를 얻고 하였다. 그리고 지금은 각종 매체의 발달로 신문,잡지뿐만 아니라 각종 다양한 방식의 리뷰가 나오고 있고 리뷰어도 전문 지식을 갖춘 사람들을 넘어서서 일반인들도 블로그,미니홈피 등을 통해서 각종 글을 올리고 있다. 이로 인해 예전에 비해서 얻을 수 있는 양이 엄청나게 늘어났다.
  하지만 이렇게 리뷰어의 범위가 넓어지고 하다 보니 정보의 양이 늘어난건 좋지만 그 질에 대한 문제도 발생하고 있다. 가장 큰 문제는 리뷰를 자기 마음대로 평가하고 자기 마음대로 표현하면 다인줄 아는 인식이다. 무슨 말이냐면 충분한 사전 지식 없이 장님 코끼리 만지듯 자기가 본것만으로 이건 어떻다 저건 저렇다를 멋대로 평가해 버린다는 이야기이다. IT쪽에서의 리뷰를 통해 본인이 겪은 몇가지 사례를 이야기 해 보겠다.
  내가  자주 가는 프로그래밍 커뮤니티에서 한 유저가 국산 인코딩 프로그램 A와 외산 프로그램 B를 비교하는 글을 썼는데, A에 대한 안좋은 감정이 있는지 아주 일방적으로 성능 테스트에서 B에 비하여 A가 떨어지는 부분만을 강조하면서 맹비난을 하는 글을 보았다. "B는 A에 비해 CPU 점유를 반밖에 차지하지 않는데 속도는 많이 뒤지지 않는다.","A는 왜이렇게 용량이 많냐" 이런 식으로의 비난밖에 없는 글이였다. 웃긴 것은 성능비교표를 보여주면서 글을 썼었는데 표에는 서로 장단점이 보이는데 글에는 장점에 대한 사항은 없었다는 것이다. 그저 B가 A보다 나은 이유만을 고집하고 있었다. 뭐 글의 주제가 그렇다면 할 수 없겠지만 기가 막힌것은 이런 언급이 있었다."A는 멀티 스레딩을 하고 겨우 그정도고 B는 안하고 해서 이렇게 나왔다면 멀티 스레딩을 하게 만들어서 2배의 성능을 내게 만들었으면 어쩔거냐"
  기가 막혔다. 당시 리뷰어는 프로그래밍적 지식이 아무것도 없는 사람이있는데 단순히 어디서 '멀티'라는 말만 줏어 듣고 하는 말이였다. 거기다 멀티 스레딩을 하고 2배 성능이라니.. 어이가 없는 글이였다. 
  다른 사례를 들자면 게임에서 자주 나오는 '게임 엔진'에 대한 언급을 하고 싶다. 잡지나 인터넷 등의 리뷰에서 게임을 평가할때 그 게임이 유명한 게임엔진을 사용한 게임이라면 그에 대한 말을 자주 볼 수 있다. 그런데 'A엔진을 제대로 살리지 못한 게임','B엔진답지 않은 게임' 이런 식의 문장을 볼때마다 좀 신경쓰인다. 과연 그런 문장을 쓰는 사람은 게임 엔진이 어떤 것이고 어떤식으로 살린 것이 가장 잘 살린 것이라는 것을 알고 그런 말을 하는 것일까? 단순히 게임 그래픽이 좋고 나쁘고 또는 느리고 빠르고 그런 것만 보고 하는 말은 아닐까? 하는 생각이 자꾸만 들게 된다. "같은 엔진을 사용한 다른 게임과 비교해서 아쉬운 점이 있다"이런식의 표현이 좀더 객관적이지 않을까? 하는 것이 나의 생각이다.
  조금 주제를 바꿔서 게임 매니아가 우리나라 게임 산업에 대하여 평가한 글도 본적이 있는데 주제가 우리 나라 게임 프로그래머가 문제라는 것이였다. 아이디어나 그래픽 수준 그런것은 충분히 뛰어난데 개발자가 프로그래밍을 못해서 그렇다는 식의 글이였다.(이후 그 글이 실린 블로그는 수많은 비난 리플로 폐쇄되었었다.)
  내 말이 무조건 옳다는 건 아니지만, 리뷰를 쓰면서 그 리뷰를 읽는 사람이 아무것도 모르는 일반인 뿐만 아니라 그것을 만든 사람과 관련 분야에 있는 사람도 있다는 것을 알고 글을 쓰면 안될까? 위에서 말한 것 같은 글을 볼 때마다 난 "쥐뿔도 모르면서","당신이 만들어 보지" 이런 생각을 하게 된다. 리뷰는 사실 정보는 최대한 객관적이게, 그리고 평가는 주관적이지만 최대한 공정하고 정확한 사전 지식을 바탕으로 해야 한다는 것이 내 지론이다. 개인적인 생각이지만 리뷰를 쓰게 된다면 서로 상처 안받게 좀더 정확하고 공정한 평가를 보여 주는 것이 더 좋은 리뷰가 아닐까 하는 생각이 든다.

Posted by 머리
나의 이야기/Diary2008. 11. 20. 19:47
2008.11.20 맑다 눈오다 다시 맑음

  교육받으러 왔다가 쉬는시간에 후임이 담배피러 갔다 오더니 하는말, "눈오고 있습니다"
  밖에 보니.. 정말 진눈깨비처럼 눈이 오고 있더라.
  부산같았으면 "와~ 눈오는구나!!" 하고 좋아했겠지만 나도 모르게 보자마자 덜컥 걱정이 앞섰다. "큰일났네.."

  다행이 잠깐 오다 말았다. 덕분에 차량 통제 걸려서 복귀 못할뻔 했지만.
  동생 생일에 첫눈이라.. 좋구만.

  겨울아 얼른 가라~
Posted by 머리
나의 이야기/Diary2008. 11. 16. 15:26
  2008.11.16 일요일 맑음.

  무슨 말을 써야 할지도 모르겠다. 한두마디로 표현을 못하겠다. 그냥 주저리 주저리 써볼까 한다. 무슨 글을 쓴다는 것이 아니라 주저리 주저리 말하듯이.
  난 컴퓨터를 좋아했다. 그래서 어릴때부터 컴퓨터에 미쳐 살았었다. 게임이나 그런것도 좋아했었지만 그것보다 프로그래밍 공부를 좋아했었고 그러느라 친구들하고 많이 어울리지 않았었다. 컴퓨터를 접한게 교통사고 당하고 나서였는데 그 전에는 밖에서 놀기를 좋아해서 친구들도 많았다고 한다. 지금은 어릴때 다 뿔뿔이 흩어졌지만. 아무튼 그렇게 자라면서 내 나이 또래의 애들이 좋아하는 것이 무엇인지 난 몰랐고 관심도 없었다. 그저 내가 좋아하는것만 하고 살았다. 공부할땐 공부하고 그게 아니면 게임방가서 게임하고 프로그래밍 공부하고 그랬다.
  난 영화관이나 노래방 그런 곳이 정말 가끔 날잡아서 가는 곳인줄 알았지 그렇게 막 "갈까?","가자"하면 되는 곳인줄을 대학교 와서 알았다. 그정도였다. 그래도 괜찮았다. 그냥 '난 프로그래밍 공부가 좋다.'라는 생각으로 내가 하고 싶은것을 하고 있으니까 그것으로 된다는 것을 신념으로 삼고 그저 컴퓨터 앞에만 앉아왔다.
  그런데.. 이젠 아니라는 생각이 든다. 이건 아닌데.. 주위를 둘러 보았다. 내가 할 줄 아는 것은 무엇인가? 남들처럼 한창 움직일 나이에 세상에 부딛혀 보았는가? 정말로 '잘' 놀아 보았는가? 그렇다고 정말로 '공부만'했는가? 그 결과는 어떤가? 아무것도 자신있게 말 못하겠다. 친구들과 모이면 컴퓨터 이야기 말고는 할 이야기를 모르는 내가 부끄럽다. 컴퓨터 실력? 본인은 천재는 커녕 범인도 아니라고 본다. 남들이 쉽게 이해하고 쉽게 외우고 하는 것을 익히는데 시간이 좀 더 걸리는 편이라서. 10여년의 세월을 투자한 것 치고는 아는 것이 너무 미약하고 부끄럽다. 더 가봤자 허세만 나올 뿐이다.
  차라리 내 나이에 맞게 컴퓨터 공부 보다는 놀게 될 때는 놀고, 공부할 때는 공부하고 다른 것을 할때는 또 그것을 하고 하면서 살아 왔으면 좋았을 것을... 컴퓨터 공부로 인해서 모든 것이 이도 저도 안되게 되어 버렸다.
  이런 생각까지 가다 보니 그동안 내가 해온 모든것이 송두리째 흔들리는 느낌이다. 컴퓨터에 대한 신념을 버리고 싶지는 않다. 아직까지도 공부하고 싶으니까. 그러나 이제까지의 나의 모습을 보고 컴퓨터를 포기하고자 한다면 지난 나의 모습들은? 어떻게 되는 거지? 이제까지의 나를 부정하게 된다는것이 이렇게 무서운 일일 줄은 몰랐다. 질려버렸으면서도 버리질 못하다니. 그리고 미칠듯한 공허함도 느껴진다. 과연 내가 지금 남기고 있는것은 무엇인가?
  난 내가 내가 믿는 신념을 가지고 흔들리지 않고 공부하면서도 주위에 어울리는 그런 사람이 되고 싶었다. 하지만 이도 저도 아닌 내 모습을 어떻게 해야 할까? 

  우리 과에 내가 개인적으로 멋있다고 생각하는 선배가 있다. 그 선배를 보고 있으면 참 대단하다. 학점도 좋고 자기가 하고자 하는 것이 무엇인지 알고 그것을 나름 잘 해 나가고 있고 또 주위의 평판도 좋고 잘 어울린다. 그런 사람이 되고 싶었는데.. 지금은 내 모습은 뭐라고 해야 하는가? 복잡하다.. 내가 이제까지 해온 것이 무엇인지 궁금하다. 생각해보면 단순히 컴퓨터 공부가 재밌으니까 컴퓨터 공부를 하고 싶다는 생각으로 여기까지 오긴 했는데 '내 꿈은 무엇인가?'라는 질문에 답을 못하고 있었다.
Posted by 머리
Study - Programming/C#2008. 11. 16. 14:46

※이 글은 본인의 지극히 얄팍한 지식과 경험을 통해서 생각한 주관적인 글입니다. 이 포스팅의 기술적인 내용은 본인의 지식에서 나온 것이라 실제와 다를 가능성도 있습니다. 이에 대한 수정과 비판은 환영이나 비난은 자제해 주시면 감사하겠습니다.


  내가 처음 프로그래밍이란 것을 접한건 초등학교 3학년때 Visual Basic 5.0을 통해서였다. 일반적으로 프로그래밍을 배울 때는 C같은 언어를 통해서 변수,루프,함수 같은 기본 문법을 배우고 거기서 세세한 사항 및 기술 등을 배우고 다른 언어로 넘어가던지 윈도우 프로그래밍 같은걸 배우던지 할텐데, 난 바로 윈도우 프로그래밍부터 시작하다 보니 기본적인 문법 같은것도 대충 대충배우고 그랬었다.(C를 조금 하긴 했었지만 그때도 포인터나 구조체같은건 신경도 안썼다. 결정적으로 그런 개념들에 대한 중요성을 인식하지 못했었다. 독학이다 보니.) 실제로 함수 등의 문법 사항을 이해하기 시작한건 본격적으로 C를 공부하기 시작한 대학 1학년때 미친듯이 프로그래밍 공부 할 때였다.
  아무튼 이런식으로 약간 역순(말은 이렇지만 역순이라고는 생각하지 않는다. 대세가 위의 방식이지 내 방식이 정석이 아니다 뭐다 그런건 없다는 것이 본인의 생각이다.)으로 배우다 보니 편리한 RAD방식에서 딱딱한 콘솔 기반의 프로그래밍 그리고 거기서 윈도우 프로그래밍으로 넘어갈 때는 정말 힘들었었다. 그리고 좀더 편리한 방식이 없나 종종 생각하기도 했다. VB의 편리함은 충분히 좋은 장점이지만 그에 비해 언어적 약점이 많이 아쉬웠다. 그리고 C나 C++, JAVA같은 언어는 강력한 언어적 지원과 갈수록 좋은 개발환경을 제공해 주었지만 역시 VB의 편리함과 비교해서는 아쉬운 점이 많았다.
  그러다 접한 것이 C#이다. C#은 위 두가지의 장단점을 잘 조합한 좋은 언어라고 생각한다. 엄청나게 강력한 언어적 기능 그리고 윈폼을 활용한 강력한 개발 환경. 분명 기존 언어들과 비교해서 한발자국 나가긴 나간 언어이다. 예전에 RAD툴 관련 글들을 보면서 현재는 VB 등의 RAD툴이 강력한 생산성에도 불구하고 부실한 언어적 기능 때문에 빛을 못받고 있지만 갈수록 RAD툴은 대세가 될 것이라는 글을 많이 봤다. C#은 이 말이 실현되고 있음을 보여 주는 한가지 예라고 할 수 있다. 
  그러나 이 C#도 치명적인 약점이 있다. 바로 .NET Framework라는 것. 조그마한 프로그램을 만들었는데도 20MB 가까이 되는 .NET Framework 을 설치해야 한다는 것과 이것이 현재 닷넷의 큰 약점 중의 하나라는 것은 잘 알려진 사실이다.  .NET Framework위에서 돌아가는 방식은 분명 장점도 있겠지만 현재는 이 배보다 배꼽이 큰 문제가 심각할 수밖에 없다. Windows XP가 보급되기 전에 이 .NET Framework가 좀더 기반을 다지고 Windows XP에 .NET Framework가 함께 나왔다면 어떻게 되었을지 모르겠지만 현재로서는 아무리 Windows Vista에 이것을 넣고 Windows Update에 추가하고 하더라도 충분히 보급되기까지는 상당한 시간이 걸릴 것이다.
  그리고 Microsoft에서 만들다 보니 강력한 기능에도 불구하고 .NET Framework가 Windows기반에서만 돌아갈 수 있는 불상사(?)가 발생하여 JAVA와 비교해 아직은 부족하다.(Mono가 있지만 이것이 완전한 .NET Framwork라고 할 수 있을까?)
  이런 C#의 약점을 가지고 있지 않은 다른 언어는 없을까? 최근에 2009버전이 나온 Delphi가 있겠다. 어떠한 프레임워크 위에서 돌아가지 않으면서도 엄청나게 편리한 개발 환경과 최근 2009버전에서도 나타나는 강력한 언어적 기능 그리고 C,C++같은 어느 특정한 곳에서 독점하지 않는 것이 아니라 한 기업에서 독자적으로 밀고 있는 방식이라 그 발전 가능성과 발전 속도도 상당히 높다고 할 수 있다. 그러나 이 Delphi도 왠지 모를 비인기(상대적인 이야기이다.)와 처음 접하는 개발자는 좀 거북할 수 있는 문법 그리고 Windows개발쪽에서만 나타나는 강력함에서 완전하다고는 이야기 할 수 없다.
  아직까지는 RAD툴이 개발 방식의 대세라고는 이야기 할 수 없겠다. 그러나 언젠가는 이런 방식이 주류가 될 것이라고 난 믿는다. 완전하지는 않지만 분명 변화는 일고 있다. 강력한 언어 위의 강력한 개발 환경. 그런 변화가 언제쯤이면 일어날까 기대하며 이 글을 마친다.
Posted by 머리
나의 이야기/Note2008. 11. 12. 19:10
  드디어.. 2009년 대학수학능력시험이 내일로 다가왔다.
  내 수능때보다 더 떨리네. 이유인즉슨 내일이 내가 정말정말 사랑하는 동생 수능날인걸..
  수시 붙어놔서 최저등급(아무거나 2등급 2개)만 나오면 서울대 붙는단다.. 와.. 정말 내동생이지만 대단하다.
  항상 뭐든 잘하던 동생이라 되게 자랑스러워했는데, 지금 전화해보니까 되게 떨려 하더라. 그런 동생 목소리 처음 들어봤다.
  희준아, 넌 할수 있다. 응원 열심히 할게. 힘내고 화이팅!
Posted by 머리
Study- MSC/Computer2008. 10. 24. 19:48
  이번 포스팅에서는 동적할당을 객체의 생성쪽으로 확장해 보고자 한다. 먼저 말해두지만 이 포스팅은 포인터나 객체, 클래스를 설명하기 위한 포스팅이 아니다. 어디까지나 이런 사항에 대한 기본적인 지식은 알고 있다고 가정하고 진행하겠다. 우선 C++에서 Example이라는 클래스가 있고, 그것에 대한 객체를 생성해 보자.

Example ex;

  자. ex라는 객체가 생성되었다. 아마 특별한 문제 없이 제대로 돌아갈 것이다. 그리고 파괴도 잘 될 것이다. 하지만 이런 방식의 객체 생성은 권하고 싶지 않다. 대신 이런 객체의 생성을 권한다.

Example* pEx = new Example();

  위 방식은  Example라는 클래스 형식으로 메모리 공간에 할당을 한 후 그 주소를 pEx 포인터 변수에 넣어서 사용하게 하는 방식이다. 앞선 포스팅에서, 메모리의 어딘가에(HEAP) 공간을 할당한다고 했는데 위 방식도 바로 이런 방식이다. 이렇게 해 놓으면 이어서 이렇게도 가능하다

Example *pEx = new Example();
pEx = new Example();

  잘 이해가 가지 않을것이다. 무슨 이야기냐면 한 객체를 메모리에 생성하여 한 포인터에 주소를 기억시켰는데, 그 포인터를 재사용하여 또다른 객체를 또 생성하여 그 주소를 넣을 수 있다는 이야기이다. 물론 위 코드는 첫 객체의 해제에서 문제가 발생하지만 이런식으로 좀 더 코드에 유연성을 줄 수 있다. 그렇지 않으면 Example ex1,ex2; 등의 방식으로 객체를 생성해야 하는 문제가 발생한다.
  앞서 말한 유연성 외에도 이런 방식의 동적 할당을 통한 객체 생성은 맨 처음 말한 동적할당의 장점을 최대한 살릴 수가 있게 된다. 객체는 일반 변수보다 여기 저기서 사용될 가능성이 많다. 무슨 말이냐면 지역 변수 이상의 용도로 사용될 가능성이 많다는 이야기이다. 만약에 게임을 만들때 적을 표현하는 클래스가 있고 그 객체를 생성한다고 하면 상황에 따라 계속해서 적을 만들어 내야 하므로 동적 할당이 필요 할 수 밖에 없다.(int형으로 적을 표현할수는 없지 않은가?)
  이제까지는 객체를 동적할당 할 때 포인터를 이용하였다. 그 이유는 C++은 기본적으로 Call by Value 방식이기 때문이기 때문인데 이는 변수 및 객체의 사용을 한정적인 위치에서만 사용할 수 밖에 없게 만든다. 이 틀을 극복하기 위해서 메모리상의 주소로 읽기 위한 포인터가 사용되는데, 여기서 한단계 더 나가서 레퍼런스라는 개념이 나온다. 적어도 여기서는 Call by Reference와 Call by Address의 개념을 다르게 두자. Call by Address는 결론적으로는 포인터의 값을 이용한 Call by Value로 볼 수 있다. 엄밀하게 말하면 Call by Reference와는 다르다.(물론 내부적으로 이놈도 포인터를 쓰긴 쓴다.)
  말이 샜는데, C++ 이후의 객체 지향 언어는 기본 참조 방식을 Call by Value가 아니라 Call by Reference를 채택한 경우가 많다. JAVA가 그렇고, C#이 그러며, 심지어 Visual Basic도 Call by Reference가 기본이다.
  무슨 말이냐면 만약에

Example ex;

라는 코드가 있으면 C++에서는 ex가 객체 그 자체이지만 JAVA나 C#등에서는 저것은 그냥 참조를 위한 레퍼런스에 불과하지 객체 자체는 아니다. 즉 아무것도 못한다. 레퍼런스는 포인터처럼 메모리 상의 어떤 것을 가리켜야 그 의미가 있다. 즉

Example ex = new Example();

  와 같이 객체를 생성하고 그것을 참조하여야 한다.
  말이 많았다. 정작 하고 싶은 말은 '동적할당은 메모리 어딘가에 공간을 할당하고 포인터를 이용하여 그것을 참조한다, 그리고 이는 객체에서도 마찬가지이며 좀더 나아가 레퍼런스는 참조 없이는 아무런 의미가 없다'였는데 이것을 표현하기 위해 쓸데없는 말이 너무 많았던 것 같다.
  아무쪼록 이 글을 읽고 뭔가 '아!'하고 깨달음(?)을 얻는 프로그래머 지망생이 있으면 좋겠다. 그렇게 기원하면서 이상 3회에 걸친 포스팅을 마치고자 한다.
Posted by 머리
Study- MSC/Computer2008. 10. 22. 19:52
  앞선 포스팅에서 잠깐 배열의 고정성을 대체하는 방법으로 동적 할당이 있다는 이야기를 하였다. 이번 포스팅에서는 동적할당을 어떤식으로 사용하게 되는가에 대해서 이야기할 것인데, 그 전에 잠깐 포인터에 대하여 짚고 넘어가자.
  포인터는 크게 두 가지의 의미를 가지고 있다. 첫째, 메모리 주소 그 자체. 둘째, 그 메모리 주소를 가리키는 포인터 변수. 결국은 같은 용도이다. 일반적으로 int a와 같은 방식으로 변수를 선언하면 그 메모리 주소에 대해서는 관심을 가질 필요가 없다. 그냥 변수 이름만 알고 있으면 얼마든지 그 공간에 접근 할 수 있기 때문이다. 하지만 변수의 지역성 등의 문제로 외부 블록에서 한 변수의 공간에 접근하고 싶다면 그 공간의 주소, 즉 포인터를 사용할 수 밖에 없다.(이는 포인터의 사용의 한 예에 불과하다.) 이렇게 어느 메모리의 주소를 얻고 사용할 필요가 있게 된다면 포인터 변수를 이용해서 원하는 곳의 포인터를 얻어서 사용 할 수 있다.(포인터에 관한 자세한 설명은 하지 않겠다. 문법책을 참고하자.)
  자, 위에서 중요한 말을 하였다. '어느 메모리의 주소를 얻고 사용하려면 포인터 변수가 필요하다.' 그런데 분명 일반적인 변수를 생성하면 그 주소에는 관심이 없어도 된다고 하였는데 왜 굳이 주소가 필요한 것일까? 맞는 말이다. 분명 그렇게 따지만 필요할 경우는 외부 블록에서의 필요성을 제외하면 굳이 필요가 없다. 이런 방식이 가능한 이유는 일반적인 변수를 만들 때에는 어느 상황에서든 항상 일정한 '규칙에 맞게' 메모리 주소에 접근하기 때문에 그 규칙만 알면 접근이 가능하기 때문이다.(Stack 이야기를 하는 것이다.) 예를 들어 a라는 주소를 가진 곳에서부터 시작해서 10개의 정수형 배열을 만든다면 a부터 a + sizeof(int)*10 까지 메모리 공간을 주어주면 된다. 우리가 '그 크기'와 '언제 변수를 선언하는지' 알기 때문에 이런 식이 가능한 것이다.
  그러나 '언제' 변수를 만들지 모르고 '얼마나'크기를 설정 할 지 모른다면? 이런 경우에는 어쩔수 없이 메모리 중 빈 공간에(HEAP) 메모리를 할당 할 수 밖에 없다. 그런데 문제는 메모리 공간을 할당해 놓고 어디다 해 놓았는지 모른다는 것이다. 이럴 때 포인터를 이용 할 수 있다. 말이 조금 복잡해졌다. 다음 코드를 분석하면서 한번 정리해 보자.

int score[10];
printf("10명의 점수를 입력해 주세요 : ");
for(int i = 0 ; i < 9 ; i++) scanf("%d",&score[i]);

  자 위 코드는 '10개'라는 고정된 점수를 저장하는 변수를 배열로 만들어 놓고 10번 점수를 입력받는 것이다. 이런 경우에는 10개 이상으로는 받을 수 없게 되고 10개보다 적은 갯수를 받게 되면 나머지 공간은 낭비하게 된다. 우리는 이런 경우를 별로 원하지 않을 것이다. '몇 개를 입력받을지 입력받고 그 갯수만큼만 받는 것은 어떨까?' 다음 코드를 보자.

int num;
int *score;
printf("몇 명을 입력받으시겠습니까? : ");
scanf("%d",&num);
score = malloc(sizeof(int) * num);
printf("%d명의 점수를 입력해 주세요 : ",num);
for(int i = 0 ; i < num ; i++) scanf("%d",&score[i]);

  달라진 것은 몇명을 받을 것인지 저장하는 num변수를 만들고, 그 num만큼 공간을 할당한 후 그 공간만큼만 입력을 받은 것이다. 중요한 것은 malloc라는 함수로 원하는 크기만큼 메모리를 할당받았다는 것이다. 그런데 문제는 이 malloc으로 할당한것은 좋은데 어디다가 해 놓았는지 모른다. 그래서 malloc 함수는 할당 한 후 그 메모리 주소를 리턴하고, score라는 포인터 변수는 그 변수를 받는다. 
  이렇게 생각하자. 동적할당을 했다면 메모리 어딘가의 빈 곳(실제로는 방식이 있지만 이 포스팅의 범위를 벗어나므로 언급하지 않겠다.)에다가 할당해 버린다. 그 곳이 어디인지 즉 어느 메모리 주소인지는 알 수 없다. 다만 할당하는 순간에는 어디인지 알 수 있기 때문에 그 주소를 변수에다 넣게 되는 것이다. 이 변수가 바로 '포인터'변수이다. 포인터는 아까 메모리 주소라고도 이야기 했다. 이것은 일반 변수가 아닌 포인터 변수에만 넣을 수 있기 때문에 score라는 포인터 변수가 필요한 것이다.
  조금 이해가 가는가? score = malloc(sizeof(int) * num);에서 score = malloc();라는 부분을 잘 관찰하자. malloc로 어딘가에 메모리를 잡아 놓고 그 주소를 score에다가 넣어 놓았다. 이렇게 해 놓지 않으면 그 이후에는 절대 어디다 잡아 놓았는지 알 수 없다.
  말이 복잡해졌다. 언제 시간 내서 다시 한번 더 이해하기 쉽도록 포스팅을 수정해 보아야 겠다.(원래 진리일수록 간단할텐데 말이다.) 다음 포스팅에서는 이 동적할당의 개념을 확장시켜서 레퍼런스와 객체의 생성에 대해서 이야기 해 보겠다.
Posted by 머리