PGR21.com
- 자유 주제로 사용할 수 있는 게시판입니다.
- 토론 게시판의 용도를 겸합니다.
Date 2010/11/05 14:05:49
Name 아이온
Subject [일반] [IT 계층글] C 언어의 추억
먼저 계층글을 쓰는 점을 양해 부탁드립니다.

보통 C가 어렵다는 분들이 많은 것 같습니다. 저도 그랬던 것 같고요. 저의 과는 컴퓨터만 다루는 게 아니지만, 컴퓨터도 중요한 일부고 해서 C 언어 강의가 1학년에 배우는 전공 필수였습니다. 전 이 과목을 스킵하다가 졸업 직전에 들었습니다.

초수강은 1학년에 했지만 F였고요. 이후에 마음 먹고 전공 공부 시작한 다음에, 다른 것들은 대체로 그냥 수학 과목이었는데, 컴퓨터는 아니더군요. 남들이 수강하며 받아온 C 언어 프로그램 짜보겠다, "teach yourself" 어쩌고 하는 책 21일 완성이라기에 그거 읽겠다, 속된 말로 "깔짝깔짝"하다 포기했습니다. 한 달도 훨씬 덜 걸렸습니다, 포기할 때까지요.

어렸을 때 BASIC을 조금 배운 적이 있는데, 그땐 이렇게 재미없지 않았습니다. 그래픽은 어떻게 하는지 몰랐지만, 키보드 입력 받아서 화면에 찍는 정도는, 프로그램이 뭐다, 하는 감이 있었습니다. 그냥 순서도 만들어서 옮겨놓는 거, 정도의 감이었지만요. 한데 C는 그거 갖고 안 되더군요.

첫 번째 스트레스는 pointer였던 것 같습니다. 근본적으로 도대체 왜 포인터가 있어야 되는지, 그게 이해가 안 됐습니다. 제가 BASIC을 통해 아는 한, 프로그래밍은 그냥 문제 해결 방식을 순서도 같이 언어에 독립되게 기술하고 기계적으로 옮겨주는 것이어야 했습니다. (그땐 물론 표현이 이렇게 정확하진 않았으나, 후일 돌이켜 보니, 당시 답답했던 느낌의 정체는 이것이었죠.) 한데 대체 왜 포인터 따위가 있어야 되는지 이해가 안 갔습니다.

더구나 주소라는 건 더 말이 안 됐습니다. 사람은 "변수"란 말 충분히 이해합니다. 하다못해 식당 팁을 계산하고 싶어도, 팁을 18% 정확히 준다 해도, 밥값은 그때그때 다른 거 아니겠습니까? 그런데 변수의 "주소"는 도대체 뭔지 모르겠더군요.

다음은 함수였습니다. 전 수학을 좋아합니다. 함수의 개념도 정확히, 아주 정확히 이해하고 있다고 생각합니다. 그런데.. 어려운 건 그게 아니었습니다. 첫째, 함수의 패러미터로 어레이가 넘어오면 이건 포인터랑 같다... 아니, 어레이는 똑같은 데이터가 여러 개 있을 때 편하게 처리하자고 만든 거고 포인터는 뭔지 정체도 모르는 건데 이 둘이 왜 같아지는지 모르겠더군요. 둘째, "스택 영역" 운운... 그땐 불행히도 scope 개념을 몰랐습니다. 알긴 했지만 명시적이지 않았습니다. 뜬금없이 메모리가 스택, 힙, 전역공간, 텍스트 영역(이걸 뭐라고 부르는지 잊었습니다) 등등으로 구성되는데... 운운하더군요. 불행히도 단박에 변수와 메모리를 연결지을 통찰력이 없었습니다. 게다가 function pointer.. 이게 또한 어이가 없더군요. 아니, 도대체 덧셈에 주소가 어디 있나요 주소가? 라플라스 변환의 주소는 또 뭔가요?

그리고 type casting입니다. 특히 malloc으로 dynamic allocation을 해주면, (지금에야 알지만) 램(정확히는 프로세스에 할당된 가상 메모리 공간)의 일부를 누군가가 잡아놓고 그 주소를 리턴합니다. 그리고 거기엔 타입이, 메모리가 그러하듯 없고요. 쓰려면 타입 캐스팅으로 강제로 타입을 부여하고 써야 합니다. 한데 전 타입 캐스팅을 이해 못 했습니다.
int x = 3; 좋습니다. x란 변수가 있고 얘는 정수입니다. char c = 'b'; 네. c는 문자를 담는 변수고 현재 'b'입니다. 그런데...
x = (int) c; ?????? 아니, 왜 문자가 정수와 같단 말입니까???

프로그래밍 언어는, 적어도 제겐, 매끄러운 문제 해결의 기술 방식이어야 하는데, 이건 도대체 이상한 게 너무 많았습니다. 그래서 2주인지 3주인지 한 달도 안 되어 접었습니다.

근데, 지금은 어플리케이션 개발자는 아니지만 어쨌든 컴퓨터 분야에서 일하고 있습니다. C는 쉽다고 생각하고 있습니다. 정확히는, 그때 접고 C를 다시 배운 적도 없습니다. 그냥, 대부분의 내용을 이미 알거나 깨우친 상태에서 K&R의 그 고전적인 책을 한 번 읽은 게 다입니다. 그 *, (), [] 얘네들 갖고 연산 순서 복잡하게 해놓는 그 대목을 포함해서, 읽기 시작할 때 이미 전체를 다 아는 상태였습니다.

C++ 역시 어렵지 않다고 생각합니다. 최소한 1, 2만 라인 코드 짜면서 에러 메시지 때문에 구글링 한 적은 거의 없습니다. 기억하는 건 하나도 없습니다. 컴퓨터 접고 다시 손에 잡은 첫 언어가 C++이었습니다. 한 8시간 정도 했던 거 같고 2주쯤 걸렸습니다. 이후부터 딱히 C++ 문법을 추가로 공부한 적은 없습니다. 에러 메시지 때문에 구글링.. 이거 C 처음 배우다 포기한 몇 주 동안 진짜 많이 했습니다. "array 함수 어떻게 패스" 이런 거 네이버 검색도 많이 하고요. 그런데 C++을 익히는 기간이 지나고 나서는 이런 일도 거의 없었습니다.

그 사이에 두 가지 일이 있었습니다. 첫째, 논리회로를 정말 열심히 공부했습니다. 둘째, 8051 펌웨어 올리는 전필 실험 과목을 신청해서, 친구가 실험하는 걸 한 학기 구경했습니다.

8051 실험은 거의 대부분이 기억 안 납니다. 친구 어깨 주물러 주기, 담배 피울 때 같이 옆에 서 있기, 가끔 술 사주기, ... 이런 게 제 일이었습니다.  딱 한 장면 기억이 납니다. P1인지 P0란 이름이 붙은 레지스터에 값을 넣으면, 그 2진수 패턴에 따라 빛이 "물리적으로" 반짝반짝 바뀌더군요. 충격이었습니다. 베이직.. 배우던 시절엔 기껏해야 키보드 입력 -> 모니터 텍스트 출력 수준이고 그게 왜 일어나는지 전혀 관심도 없었죠. printf 때리면 원래 나오는 건지 알았습니다. 동시에 소프트웨어는 물리적인 세계랑 하등 상관없는 얘긴 줄 알았습니다. 그런데 그게 아니라, P1에 값을 요리조리 바꿔주니 물리적인 세계가 변하더군요.

그리고 그 학기에 그 과목만 C를, 그것도 전적으로 친구 덕에 찍고, 다음 학기엔 논리회로를 들었습니다. 처음엔 무슨 유치한 집합 연산 같더군요. combinational logic을 어떻게 만드는지야 알았지만, 이걸로 "뭐 하자는 플레이인지" 모르겠더군요. 그냥 퀴즈 내주면 풀고, 숙제 내면 그려가고 고작이었습니다. 그러다가 덧셈, 뺄셈을 선택적으로 하는 논리회로를 볼 기회가 생겼습니다. 그러니까 뭔가 감이 왔습니다.

컴퓨터는 겉보기엔 엄청나게 대단하고 복잡합니다. 그런데, 따지고 보면, 베이직만 생각해도-그때는 다행히도 함수 개념이 없었습니다, 베이직에선 goto를 써본 게 다고요-, 연산은 아주 단순한 몇 가지 뿐이었습니다. 단지 문제는 그 연산을 그때그때 선택적으로 해준다는 것 뿐이었고요. 한데, 이 감/가산기를 보니 사태는 너무 분명하더군요.

논리회로란, 모든 유한 개의 입력에 대해 1비트 크기의 출력이 뭐가 나와야 하는지 정의하기만 하면, 어찌 되었든 회로로 나올 수 있습니다. 따라서 컴퓨터란, 일단 모든 가능한 피연산자 조합( 32비트 피연산자 2개면, 2의 32승의 제곱 )이 입력으로 들어갈 때, 연산 종류를 지정하는 컨트롤 신호의 모든 가능한 패턴에 대해 출력이 어떤 것이 나와야 하는지 일일이 명시하기만 하면 구현될 수 있다는 통찰이 생기더군요.

물론 사실과 약간 다르나, 김화백의 말을 빌어 "더 이상의 자세한 설명은 생략"하겠습니다. 그리고 프로그램이란 게, 별 게 아니고 단지 논리회로에 입력의 일부로 들어가는, 저 제어신호의 집합일 뿐이란 생각이 들더군요. 감/가산만 하는 컴퓨터의 제어 신호는 1비트, 0 또는 1입니다. 하지만 거기에 곱셈까지 하려면, 제어 신호가 최소 2비트로 늘어야 되죠.

우리가 보는 건, 기괴한 소스 코드란 걸 저도 이미 알고 있었습니다. 저는 도대체 그놈의 소스 코드를 컴퓨터가 어떻게 알아먹나, 이것도 신기했더랬는데, 이젠 알겠더군요. 어느 대인배가 그걸 논리회로에 들어갈 제어신호로 무조건 번역해줘야 합니다.

앞서 제가 어려웠던 몇 가지를 나열했었습니다.

우선 변수의 '주소' 개념... 이건 이제 당연하게 느껴지더군요. 변수는 별 수 없이 RAM에 들어갑니다. (역시 김화백을 재인용하겠습니다.) 램은 2진수 8자리를 집어넣을 수 있는, 똑같이 생긴 셀이 주소를 갖고 다닥다닥 붙은 구조입니다. (개념상.. 그리고 논리회로에서 배우죠.) 변수는 여기 저장될 수밖에 없으니 주소가 생기는 것이구요.

함수.. 역시 마찬가집니다. 소스 코드, 프로그램은 우아한 연산처럼 보이지만, 결국 제어신호로 번역되어 어딘가 저장되어야 합니다. 그럴 데는 메모리 뿐이고, 당연히 주소를 가집니다. function pointer는 이 프로그램이 올라가 있는 메모리 상의 주소여야 합니다. 원한다면, 이걸 int로 강제 캐스팅해서 쓰레기값을 쓰는 것도 (당시에는) 가능하다고 생각했습니다.

type casting.. 마찬가지로 메모리엔 타입이 없고 타입이 있는양 속고 속이는 건 사람의 편의를 위해 컴파일러가 하는 짓입니다. 그러니 해당 메모리를 int로 쓸지, char 어레이처럼 간주하고 쓸지는 사람 마음일 수도 있습니다. 중심은 메모리에 뭔가가 있다는 거고요.

그외에도.. 제가 궁금했던 대부분의 문제가 논리회로를 이해하면서 이해가 되었습니다. 어떻게 모니터를 컴퓨터가 통제하는가, 모니터는 픽셀의 집합입니다. 한데 픽셀 각각은 24비트 정도의 유한한 상태만 가집니다. 7-segment LED처럼, 이 유한 상태 중 하나를 비트 패턴으로 갖고 있으면(FSM의 state), 논리/아날로그 회로가 물리적으로(모니터 픽셀 색깔로) 번역합니다. 프로그램이 하는 일은, 현재 이 유한 상태가 무엇이어야 하는지 약속된 장소에 그 비트 패턴을 지정해주는 일이고요.

C++를 공부할 때도 마찬가지로, 해당 프로그램 요소가 특히 C와 어떻게 관련이 있는지 고민을 많이 했습니다. class는 구현의 관점에서 struct와 비슷해 보였습니다. 단지 member function이 있는데, 이건 function pointer라는 훌륭한 물건이 있습니다. 어느 object가 이걸 부르냐에 따라, 내부 데이터가 달라 동작이 다른 셈인데, 이 function에 자기 자신(this pointer)을 암묵적으로 집어넣으면 해결됩니다. template은.. 컴파일 1단계(C++ -> C, 역시 자세한 설명은..)에서 T라고 된 부분을, instantiation을 만날 때마다 해당 type으로 대체한 코드를 생성한 뒤, 참조할 수 있게끔 extern declaration을 삽입해 주면 될 것 같더군요.

이런 것들은 전부 low level의 요소들인 것 같습니다. 이 모든 걸 완벽하게 알아도, 네비에 쓰이는 최단 경로 알고리즘을 아는 건 또 전혀 다른 문제입니다. 하지만, 이런 건 있는 것 같습니다.

제가 C에 처음 좌절하는 기간 동안, 구현이 너무 부담스러웠습니다. "학생 관리 프로그램 짜오세요" 하면, 먼저, 학생 레코드를 어레이로 할지 링크드 리스트로 해야만 하는지(할지..가 아닙니다..;;;), 어레이 크기를 동적할당 해야 하는지.. 이런 거부터 고민했었습니다. 어려운 문제일수록 작은 건 된다고 생각하고, 큰 것에만 집중해야 하는데, 신경이 작은 데로 너무 분산되니, 알고리즘이고 뭐고 없었던 거죠.

그런데 이 "찌질한" 문제들을 클리어하고 나니까, 아, 이게 아니구나, 이 산이 아니었구나, 하는 느낌이 오더군요. 사실.. 5개나 10개 정도의 트럼프 카드야 대충 쓱 보고 정렬할 수 있습니다. 하지만 제아무리 사람이라도, 10만개쯤 되는 카드를 순서대로 쓱 보고 정렬할 수 있을까요? 아무 조직적 방법 없이요?

안 되겠지요. 평범한(저 포함) 사람은 insertion sorting을 쓸 겁니다. 일단.. 한 장 꺼내고, 다음 꺼 꺼내서 앞에 꺼랑 비교합니다. 세 번째 꺼내서 앞의 두 개랑 비교하죠. 그럼 세 장은 정렬되어 있습니다. 네 번째 꺼내서 이 셋이랑 비교, 적절한 위치에 끼우죠. 이 과정을 10만번 반복합니다.

이 설명엔 '프로그래밍 언어'와 관련된 건 하나도 없습니다. 하지만 제가 C를 잘 모를 땐, 이렇게 C와 상관없는 부분을 분리해서 생각할 엄두가 안 났습니다. C 문법을 잘 알게 되고 나서는, C 문법이 이런 의미에서 다는 커녕, 바닷가의 조개만도 못한 존재라 해도 별 수 없단 생각이 들더군요.

얘기가 꽤 길어졌습니다. 제가 느끼기에 C든 C++이든 그렇게 어려운 언어 같지는 않습니다. 단지 C가 역사가 오래다 보니, 하드웨어에서 그다지 멀어지지 못했기 때문에, 고급 언어에서 기대되지 않는 측면이 많이 포함되어 문제를 어렵게 만드는 것 같습니다.

길어서 다 읽으신 분이 있을지 모르겠는데, 어떻게 생각하시는지 궁금합니다.

통합규정 1.3 이용안내 인용

"Pgr은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.
법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
10/11/05 14:13
수정 아이콘
컴공나오셨나요? 내용이 대부분 컴공에서 배우는 내용이군요.^^
전 8051 마이크로프로세서 다루면서 아~ C가 이런거구나 터득했다는...
shadowtaki
10/11/05 14:15
수정 아이콘
전자공학 전공한 C코더 입장에선 C가 가장 쉬운 것 같아요...
10/11/05 14:27
수정 아이콘
흐흐... C++로 오면서, 콜 규약에 대해서 알게 되면, function pointer 에 대해서 신세계가 펼쳐집니다... 만,
C++0x로 넘어오면서, lambda라는 놈이 생겨서;;; 다 필요없게 됐습니다. (C#에는 진즉부터 있었죠) 지금은 제가 만든 엔진 다 들어엎는중..
왜, 이렇게 편한걸 이제서야 만들어주는겨??!!

그리고... 알고리즘이라는건 일단 '알고 있는게' 중요하다고 생각합니다. 즉, 어떤 경우에 어떤 알고리즘을 써야 한다는걸 말이죠.
그 모든걸 직접 손으로 다 구현하기에는... 실무에서는 너무 시간이 부족합니다. 그때는 빨리 레퍼런스를 찾아서 가져다 쓰는게
훨씬 생산성이 좋겠죠... 그러라고 객체지향이니, 디자인 패턴이니... 하는것도 나온거라고 생각합니다.
"STL을 쓰는건 개발자의 수치다" 라면서, 자료구조와 알고리즘을 일일히 다 직접 만드는 분도 봤는데;;; 그건 좀...;;;
뒷짐진강아지
10/11/05 14:19
수정 아이콘
모든 악의 근원 "pointer"
그리고 함수에서의 call by reference(& 배열변수)... 그래 봤자 이것도 pointer영역
구조체 사용시에 나오는 pointer...('->' 같은것들)
그놈의 (참조)주소가 문제지요...
중첩 포인터로 X차원 배열 만들려고 하면... @$@#$@!$
//저는 프로그래밍 언어 수업을 들으면서 대략 이해했죠... 알고보면 별거 아닌데... 쩝...
그런데 메모리 주소 영역은 논리보다 컴퓨터 구조론에서 더 자세히 다루지 않나요?
아이온
10/11/05 14:20
수정 아이콘
단맛 님//
저도 전자과입니다. 저희는 컴파일러를 안 줘서... -_-;;;; 초수강 땐 어셈블리 코딩을 구경했고, 재수강 땐 제가 오픈 소스를 찾아서 어셈블리 코딩한 것처럼 구라를 쳤습니다. 흐흐흐

shadowtaki 님//
동의합니다. 단지 C언어를 첫 언어로 배우실 때 어렵다는 분들이 많더군요. 전 그런 과정은 안 거쳤는데, 방학 때 동아리에서 날을 오래 잡아 포인터 강좌를 하는 경우도 있다고 들었습니다. 왜 그런가, 생각해 본 거고요.
Cazellnu
10/11/05 14:23
수정 아이콘
신텍스는 당연한것이니까 그 자체가 어려우면 할말이 없어지니까요.
어딘가에서 보면 신텍스 자체만 익히고선 그것이 전부라고 생각하는 사람(거의 학생이죠)이 있긴 합니다.

저는 공부하는 방법을 권하는게
로직은 스탠다드 라이브러리에도 괜찮게 구현되어있는것이 많으니 그것의 작동논리를 익히고(사용법이 아니죠)
(사실은 전공수업중 자료구조, 파일처리등에 보면 다 나와있긴 합니다만)
다음으로 IPC등의 시스템 관련을 익히면 초중급까지는 무난히 갈 수 있다고 봅니다.
10/11/05 15:04
수정 아이콘
그리고.. 나름 오래동안 게임 프로그래머로서 일하면서 느낀건... '언어' 자체가 중요한게 아니라는 겁니다.
저야 경력 시작 자체가 C++ 이었고, 10년이 넘도록 C++로 계속 일을 하고 있긴 합니다만,
필요하다면 자바, C#, 베이직... 으로 프로젝트를 진행하기도 하고, LUA, Python 등으로 스크립트 작업을 하기도 합니다.
요즘은 HLSL과 아주 전쟁중이지요.. ㅠㅠ

사실 한 가지 언어를 왠만큼 마스터했다면, 다른 언어를 사용하게 되더라도... 한달 정도만 문법을 익히면,
그 이후로는 레퍼런스북 옆에 끼고 왠만한 프로젝트 진행은 가능하게 됩니다. 물론 아주 능숙하지는 못하지만요.
프로그래머로서 더 중요한 것은, 어떤 문제를 만났을 때, 이것을 어떻게 해결할 것인지를 얼마나 빨리 도출해내느냐라고 봅니다.
그리고... 언어는, 프로젝트의 성격에 따라서 결정할 문제지, 어떤 언어가 어떤 언어보다 우월하다...는 사실 무의미하다고 생각합니다.
녹차트윈스
10/11/05 15:05
수정 아이콘
저는 C/C++만 하다가 JAVA를 처음 배우게 됐을때....
"아니 이걸 포인터로 하면 편한데 왜 이렇게 하는거지...?"
이런 생각 많이 했었다는...^^;;;
혼돈컨트롤
10/11/05 15:04
수정 아이콘
컴공 졸업을 앞둔 학생입니다. 선배들이나 여러가지 주위 얘기를 들어보면 이런 점 때문에 IT 가 힘들고 특히 코더가 힘든 것 같습니다. 사실 하드웨어가 강력해지고 좋은 언어와 언어툴 등이 나오면서 예전 처럼 최적화까지 안해도 대충 그럭저럭 돌아가는 코드 정도는 누구나 쉽게 만들 수 있게 되었죠. 그래서 요즘은 유지보수가 편리하게 코드를 작성한느게 관건인데 사실 이것도 위에서야 개발자 갈구고 개발자 노가다 하고 하면 신경쓰일 문제는 아니죠. 일단 개발자가 편하자고 코드를 오오피다 패턴이다 하면서 적용시키고 사용하는 거니까요.
사실상 냉정히 말하자면 코더의 시대는 갔다고나 할까요. 기술이 발전함에 따라 코더는 새로운 신기술, 즉 과학쪽이라기 보단 정말 기술직이 되어버리게 되었죠. 바느질 쩔게 하는 장인이 있더라도 제봉틀이 나오고 많은 사람이 쉽게 바느질을 할 수 있고 공장에서 제봉틀로 옷을 찍어 내면서 바느질 장인은 더 이상 장인이 아니게 되는 그런것과 비교할까요...
아무튼 저도 졸업앞두고 이생각 저생각 많이 들더군요. 취직해봤자 건전지 인간 밖에 안될거 같고 (건전지 다되면 버려지는....) 아주 잘해야 충전지 인간이 되겠지만 역시 죽도록 쓰여지고 나중엔 결국... ㅠㅠ
이세상은말야
10/11/05 15:21
수정 아이콘
포인트는 제가 생각하기에 로우레벨 프로그램인 에셈블러레벨에서 발전된 형태인 구조적 프로그램 형태(C,파스칼)로 넘어오면서
구조적 프로그램의 가장 큰 장점은 함수 단위의 프로그램에 있어서, 효율적인 자료전달의 형태가 아닌것인가 생각됩니다.

에셈블리 프로그램에서는 프로그래머가 데이터 저장위치, 그것의 크기등을 알고 거의 모든 프로그램이 GOTO, 내지 BRANCH명령입니니다.
구조적 프로그래밍으로 넘어오면서, 구조적 구조로 프로그램을 가능하게 하는 기본 단위가 함수인데, 여기에서 간단한 데이터를
함수간에 주고받는 것은 문제가 되지 않으나, 좀 큰 데이터를 처리하는데에는 큰 문제가 생긴다고 보입니다. (함수간의 처리할 데이터 교환문제, 만약 포인터라는 신택스가 없다면)

그부분에 대해, 포인트라는 신택스는 너무가 적은 용량의 인수로, 각 함수간에 데이터를 교환가능하게 하고, 나아가서 함수자체의 호출도
함수 시작 위치(주소)만 알면 되기에 정말 효율적인 부분이라고 생각합니다.

C언어의 포인트라는 부분을 컴파일러한 부분을 역에셈블링해보면, 거의 에셈블러 레벨의 효율을 가지고 있다고 생각합니다. 그리고 지금
임베디드 분야의 C언어들은 컴파일하면, 에셈블러만으로 작성한것만 거의 차이가 나지 않습니다.
28살 2학년
10/11/05 15:18
수정 아이콘
저하고 너무나 비슷한 길을 걸으셨군요.
제가 올해 그렇습니다.
복학을 7년만에 하다보니 예전에 정말 열심히 공부한 C가 잘 기억이 안났습니다.
8년전 1학년때도 포인터, 구조체, malloc 나오면서 많이 어려워 했는데 그 부분을 제대로 못한게 지금도 후회됩니다.
올해 1학기에 C++을 스킵하고 바로 자바로 갔는데 자바가 포인터가 안나오는 대신 어렵기는 마찬가지로 어렵더군요.
지금은 객체의 다형성이니 Call by reference, Call by value 등 전체적인 개념은 이해가 되도 막상 코딩이 안됩니다.
그래서 전과를 계획하고 있습죠....

군대에 오래있었더니 객체지향에 대한 개념은 무척 잡기 쉽더군요.
"오늘은 1분대가 정화조 청소해!"
켈로그김
10/11/05 15:50
수정 아이콘
이상하다.. 나도 분명 3년을 배웠는데 왜이리도 낯설지.. 이상하다 이상해..;;
성야무인Ver 0.00
10/11/05 15:51
수정 아이콘
전 컴파일도 힘들었던 어셈블러랑 베이직세대라 C언어랑 포트란 77배울때의 감동을 잊을수가 없네요. 다만 포트란의 경우 칸 하나만 틀려도 프로그램자체가 돌아가지 않아서 이게 왜 안되지라고 갤갤댔는데... 지금은 다 잊어진 언어일뿐이군요.
10/11/05 16:21
수정 아이콘
프로그래밍 언어뿐만 아니라 인간의 자연어에도 해당되지만, 언어는 단지 의사소통 수단일 뿐이라는 걸 깨닫게 되더군요.
언어를 처음 접할 때는 그 존재의의를 잘 모르다 보니 형식을 따라가기에만 급급하게 되는데,
언어를 통해서 전달하고자 하는 의미와 의도를 이해하는 게 중요한 거 같습니다.
NULL Pointer
10/11/05 16:54
수정 아이콘
제가 나쁜놈이었군요....
10/11/05 17:29
수정 아이콘
저는 쓰레드 처음 배울 때가 어렵더군요. 그 산을 넘기까지 오랜 시간이 걸렸습니다.

[+] 그리고 "c 컴파일러는 c 언어로 만들었다"란 말을 이해하는 데도 한참 걸렸습니다 ^^


"포인터를 이해할 수 있는 능력은 타고난다"란 말이 있을 정도인데,
사실 더 크게 본다면 프로그래밍 능력이란 것도 타고 나는 것 같습니다.
10/11/05 18:32
수정 아이콘
전 아직도 C로 짜면서 가장 어려운게 포인터와 Recursive(이건 어느 언어에나 통용되는 내용이지만;;;)가 도저히 머리속에 와닿질 않더군요.

특히 Recursive는 직관적으로 이해하기가 너무 힘들어서...DP와 그리디 프로그래밍에 대해서 배울때 머리 쪼개는줄 알았습니다 ㅠㅠ
10/11/05 22:25
수정 아이콘
암만 코딩 잘해봐야 여자친구는 못짭니다..
난 애인이 없다
10/11/05 22:31
수정 아이콘
포인터의 요체가 여기 있습니다. http://blog.yurihan.net/30
Je ne sais quoi
10/11/05 23:22
수정 아이콘
음.. 글쎄요. 이야기하시는 게 뭔지 알긴 하겠는데, 그 정도 경지라는 게 그리 쉽게 얻어지는게 아니라 큰 공감이 가지 않습니다. 아이온님이 쓰신 글을 보니 상당한 실력이 있으시다는 건 알겠는데, 그건 아이온님의 실력인거고, 그렇게 접근하지 못하는 사람이 부지기수거든요. 그리고 아이온님의 실력이 어느 정도로 좋으신지 몰라 감히 이야기하지는 못하겠는데, C++같은 경우 예를 들면 솔직히 제 주변에 boost 제대로 다루는 사람 지금까지 한 번도 못 봤습니다(저는 감히 손도 못 대겠네요).
자료구조와 알고리즘은 분명히 프로그래밍의 핵심, 내공입니다. 하지만 이 내공을 겉으로 드러내기 위해서는 프로그래밍 문법에 대한 적확한 이해라는 외공이 필요하고, 이 부분은 또 별도입니다. 내공이 없으면 외공은 금방 부서지고, 외공이 없는 내공은 드러나지가 않습니다.
케이아치
10/11/06 03:06
수정 아이콘
왠지 완전 공감이 가는 글이네요..
C에서 헤맸고, 헤매고 있고, 헤맬것이라고만 생각했었는데.

이번학기 베릴로그 언어를 배우고.. MIPS 를 설계하고있는데..
C가 그냥 커피라면 베릴로그는 TOP.. 베릴로그 자체는 그렇게 안어려워도 CPU설계한다는것이 참 ㅠㅠ

근데 원래 CS 쪽에서도 이거 하나요 ? 교수님 미워요 ㅠㅠ
Summerlight
10/11/06 11:18
수정 아이콘
이미 질문 답변 게시판에도 한번 글을 남긴 바가 있지만, 저는 절대 C++이 그렇게 사용하기 쉬운 언어라고 보지 않습니다. 아직도 지엽적인 문법 세부 사항을 확인해야 하는 상황이 오면 C++ 표준이나 서적들을 찾아볼 수 밖에 없거든요. 이를테면 멀티 쓰레드 프로그래밍을 좀 해보려면 volatile과 메모리 모델에 대해 C++ 표준이 보장하는 범위를 알아야 하는데, 이걸 처음 질문 받았을 때 찾아보지 않고 바로 답하는 사람은 한번도 못 봤습니다. 그리고 정의와 선언 간의 차이와 다중 상속된 클래스의 멤버 함수 포인터가 void*와 호환되지 않는다는 예외 사항이 결합되면 찾기 힘든 버그를 만들어 낼 수도 있죠. 이런 예외 사항(이른바 "미정의 사항")들과 직관에 반하는 문법들이 수두룩합니다. C++ 자체가 성능을 위해 간결함을 포기한 언어이기 때문에 어쩔 수 없는 부분입니다만.

저도 C++을 며칠 공부한 이후부터 지금까지 제가 생각하는 로직만을 기술하는데에는 별 어려움이 없었습니다만, 그것만 가지고는 C++가 필요한 영역을 전부 커버할 수 없는 것이 현실입니다. 어차피 그런 도메인이라면 C++이 아니라 Java, C#을 쓰는게 훨씬 간편하고 생산성이 높고요. 말씀하신대로 C++은 저수준을 알아야 이해할 수 있는 언어가 맞습니다만, 그 알아야 하는 범위가 생각하시는 것보단 훨씬 넓습니다. 컴파일러가 내 코드를 가지고 무슨 짓을 하는지 대강이라도 알아두지 않으면 언제 뒤통수를 맞을지 모르거든요. 여기에 표준 라이브러리까지 들어가면 이건 뭐... 또 C++의 본 목적인 "빠른 속도"를 얻으려는 목적까지 있다면 언어의 각 문법들이 기계어에 어떻게 매핑되는지까지가 모두 "알아둬야 하는 문법"의 영역에 들어가는거고요. 21세기가 시작되고 사람들이 괜히 Java로의 대이동을 한게 아닙니다.

* ps. 저도 이렇게 말은 하지만 C++을 좋아하는 편입니다. 단지 문제점이 많고 어려운 언어라는 것을 인정하는거죠. 물론 이런 문제들은 프로그램에 대한 완벽한 통제권을 쥐는 댓가이므로 충분히 납득하고 잘 쓰고 있습니다.
Ys49.cho
10/11/06 18:42
수정 아이콘
현재 회사에서는 영업에 있지만..
윗글을 보면서..
아 그랬지..맞아 이랬던거 같에..하는걸 보면..

겨우 평점 3.0이지만..아.그래도 나 공대나온남자구나 하고 느낍니다.
목록 삭게로! 맨위로
번호 제목 이름 날짜 조회 추천
26227 [일반] 무한도전 이번주 감상.. [106] 반니스텔루이10734 10/11/06 10734 0
26226 [일반] 사랑이 뭐에요? [15] 산들바람4005 10/11/06 4005 0
26225 [일반] [분위기전환] 숙취해소 해볼까요? [7] 가나다랄4116 10/11/06 4116 0
26223 [일반] 달빛요정역전만루홈런 이진원님께서 돌아가셨다고 합니다. [34] 세우실6661 10/11/06 6661 0
26222 [일반] Somewhere Over The Rainbow_당신의 무지개 뒤엔 멋진 세상이 기다리고 있을까요. [10] 마실4150 10/11/06 4150 1
26221 [일반] '팔유팔파'와 '지투앤티' [10] 유유히4626 10/11/06 4626 3
26220 [일반] 우리나라 학교는 답이 없다 [41] 레몬커피6998 10/11/06 6998 2
26219 [일반] 인생의 푸념 좀 해도 되겠습니까? [17] 삭제됨3908 10/11/06 3908 1
26218 [일반] 방금 kbs 1tv 미디어 비평 보신분 계신가요? (G20관련) [12] 강동원5143 10/11/06 5143 0
26217 [일반] 위대한 탄생, 앞으로의 행보는? [44] 풍경7322 10/11/05 7322 0
26216 [일반] 김총리 "경제적 여유있으면 굳이 무상급식 불필요" [36] 아유5044 10/11/05 5044 0
26215 [일반] 중국과 브라질 농구 대표팀의 친선 경기 중 선수간 폭력사태 [24] 하지만없죠5051 10/11/05 5051 0
26214 [일반] 단편- 청춘에 남긴 꽃다발. [4] nickyo3176 10/11/05 3176 0
26213 [일반]  한국(SK) - 대만(슝디) 프로야구 챔피언쉽 2차전 중계 불판 [124] EZrock5534 10/11/05 5534 0
26211 [일반] 김지수&장재인의 "신데렐라" 티저가 공개되었습니다. [18] 세우실7574 10/11/05 7574 0
26210 [일반] [체벌] 벌써 시작입니다. [118] 삭제됨8725 10/11/05 8725 0
26209 [일반] 기어이 모나코도 사고를 치는군요 - 박주영 선수 아시안게임 참가 불발 [51] GODFlash8065 10/11/05 8065 0
26208 [일반] [IT 계층글] C 언어의 추억 [50] 아이온5743 10/11/05 5743 0
26207 [일반] 숭실대 수시 1차 1만4천명 전원합격처리 전산오류.. [27] 전국수석6532 10/11/05 6532 0
26206 [일반] [캐치볼모임안내] 야구공 던지고 놀기~ [13] 버디홀리3485 10/11/05 3485 0
26205 [일반] 갤럭시 탭 출시 [59] The HUSE7286 10/11/05 7286 0
26204 [일반] 2010 골든디스크 시상식 후보자 소개~! [16] CrazY_BoY4983 10/11/05 4983 0
26203 [일반] 마우스의 소중함을 깨닫고 있습니다 [16] 페가수스5018 10/11/05 5018 0
목록 이전 다음
댓글

+ : 최근 1시간내에 달린 댓글
+ : 최근 2시간내에 달린 댓글
맨 위로