Turbo-C
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
터보-C 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
Lua 게시판
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C/C++ FAQ
[9] 프로그래밍을 처음 시작하는 왕초보입니다. C부터 배우고 C++을 배워야 하나요?
김백일 [cedar] 47288 읽음    2002-11-01 00:40
아닙니다. 그 반대죠.

많은 사람들이 C++에 대해서 오해하고 있는 것이 참으로 안타깝습니다.
프로그래밍 언어를 처음 시작하는 사람에게 C는 별로 좋지 않습니다
(다른 관점에서 보면, Java도 마찬가지고요.)
차라리 C++부터 배우는 것이 낫습니다.

제가 C/C++ 자료실에 올린 Bjarne Stroustrup의 논문에 있는 예제를 들어보죠.
http://www.borlandforum.com/impboard/impboard.dll?action=read&db=cpp_res&no=17

(지금부터는 프로그래밍을 전혀 모르는 사람의 입장에서 생각해봅시다.)

사용자에게 이름을 입력받고, 그대로 출력하는 간단한 프로그램을 생각해봅시다.

표준 C++이라면 다음과 같이 간단하게 만들 수 있습니다. 
아주 직관적이죠? 굳이 설명하지 않아도 쉽게 이해할 수 있을 겁니다.

#include <iostream> // get standard I/O facilities
#include <string>   // get standard string facilities

int main()
{
  using namespace std; // gain access to standard library
  cout << "Please enter your full name: ";
  string name;
  cin >> name;
  cout << "\nHello, " << name << ".\n";
}


C의 경우라면, 다음과 같이 하면 되겠죠?
일단, 입력 받는 문자의 갯수에 제한이 있겠군요.

#include <stdio.h> /* get standard I/O facilities */

/* maximum name length is 19 characters */
#define MAX_LEN 20 

int main()
{
  char name[MAX_LEN];

  printf("Please enter your first name: ");
  scanf("%s", name); /* read characters into name */
  printf("Hello, %s.\n", name);

  return 0;
}

초보자가 위 코드를 제대로 이해하기 위해 알아두어야 할 것이 꽤 많습니다.
우선, 전처리기 문장인 #define과, char 배열의 개념입니다.
C의 문자열은 '\0'으로 끝나기 때문에 20 - 1 = 19 문자까지만 저장된다든지,
name은 문자배열의 주소를 나타낸다든지 말이죠.
괴상한 암호 같이 생긴 "%s"도 직관과는 거리가 멀죠.
게다가 위 코드는 완전하지도 않습니다.
만약 scanf로 입력받을 때, 19문자 이상을 입력하게 되면,
name 배열의 크기를 넘어가 버리기 때문에, 프로그램 자체가 죽어버립니다. -_-;;
정말 초보에게는 좌절감만 느끼게 하기 십상이죠.

초보의 좌절감을 해소하기 위해서, 프로그램이 죽어버리는 문제를 해결해보죠.
다음과 같이 scanf의 라인에 '19'만 추가하면 됩니다.

scanf("%19s", name); /* read characters into name */

하지만 이렇게 하면 상수 정의문인
#define MAX_LEN 20
을 써서, 상수 값을 바꾸는 의미가 없습니다. -_-;;

scanf 안의 19도 자동으로 바뀌게 하려면
다음과 같이 수정하면 됩니다.

char fmt[10];
sprintf(fmt,"%%%ds", MAX_LEN - 1);  /* create a format string: plain %s can overflow */
scanf(fmt, name); /* read at most MAX_LEN - 1 characters into name */

이제는 sprintf와 "%%%ds"의 의미도 이해해야 합니다. -_-;;

이 scanf는 아직도 문제가 남아있습니다. name 배열은 19문자까지로 입력이 제한되지만,
실제로 타이핑은 얼마든지 19문자 이상 화면에 계속되고, 그대로 남아있습니다.

게다가 맨 앞에 C++ 코드와 같이, 메모리가 허락하는 범위에서 무제한으로 문자열을
입력받고 출력하는 방법은 도저히 위의 scanf를 사용한 방법으로는 해결할 수 없습니다.

맨 처음의 C++ 코드와 비슷하게 동작하는 C 코드를 만드려면
malloc과 realloc를 써서 메모리를 동적으로 할당하고,
scanf대신 getchar를 써서 문자 하나씩 처리를 해야 합니다.
다음은 이를 구현한 코드입니다.

#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>

void quit();
void input_str(char** str);

int main()
{
      char *name;

      printf("Please enter your full name: ");
      input_str(&name);

      printf("\nHello, %s.\n", name);
      free(name); /* release memory */

      return 0;
}

void quit() /* write error message and quit */
{
      fprintf(stderr, "Memory exhausted.\n");
      exit(1);
}

void input_str(char** str) {
      #define DEFAULT_LEN 20
      int max = DEFAULT_LEN, i = 0, c;

      if ((*str = (char*)malloc(max)) == NULL) /* allocate buffer */
            quit();

      while (1) { /* skip leading whitespace */
            int c = getchar();
            if (c == EOF) break; /* end of file */
            if (!isspace(c)) {
                  ungetc(c,stdin);
                  break;
            }
      }

      while (1) {
            c = getchar();
            if (c == '\n' || c == EOF) { /* at end; add terminating zero */
                  (*str)[i] = 0;
                  break;
            }
            (*str)[i] = c;
            if (i == max - 1) { /* buffer full */
                  max *= 2;
                  max = (char*)realloc(*str, max); /* get a new and larger buffer */
                  if (*str == 0) quit();
            }
            i++;
      }
}

소스가 60라인 가까이 되는군요. -_-;;
게다가 아직도 문제는 남아 있습니다.
즉, 사용 후에는 반드시 free()로 할당된 메모리를 해제해야 합니다.
strdup() 함수의 사용법과도 비슷하죠. 
버그 발생의 원인이 될 수 있는 좋지 않은 구현 방법이지만 어쩔 수 없겠네요.

도데체, 이름 하나 입력 받고 그대로 출력하는 데 알아야 될 것이 왜 이렇게 많은지!

C++이 어렵게 느껴지는 것은, 우리가 그 동안 C를 먼저 어렵게 배운 후에,
클래스의 정의부터 시작하는 어려운 C++ 책을 보고 어렵게 배웠기 때문입니다.

이제는 string과 vector와 같은 표준 라이브러리부터 먼저 배우고,
간단하면서도 실용적인 코드를 작성해 본 다음에,
객체지향과 클래스 정의를 배우면 됩니다.

C++을 단기간에 독파할 수 있는 좋은 책으로 Addison-Wesley에서 나온 "Accelerated C++"
을 강추합니다.
와우북에 있는 다음 서평을 참고하세요.
http://www.wowbook.com/computer/book/info/book_detail.asp?isbn=ISBN0-201-70353-X&review=13370#start

--------------------------------------------------------------------------------------
2003/2/26 추가:
--------------------------------------------------------------------------------------
2003/3월말 중에 위 책의 번역판이 나옵니다.
http://www.infopub.co.kr/common/bookinfo/bookinfo.asp?sku=06000144
티클맨 [tclmania]   2002-12-14 05:13 X
C 를 먼저 배워야 합니다. 개인이 코딩할수 있는 한도는 정해져 있기 때문에 (500 라인정도),그 이하의 코딩은 C++ 은 무의미 합니다..단 GUI 프로그래밍은 예외지만요.
티클맨 [tclmania]   2002-12-14 05:14 X
보통 C 를 배운 사람들이 C++ 을 어려워 하는것은 혼자서 많은 코드를 짜려고 하기 때문이죠..
김백일.cedar [cedar]   2002-12-21 16:26 X
아직도 제가 쓴 글의 의미를 이해하지 못하시나요? 객체지향보다도 ANSI C++/STL 라이브러리를 익히는 것이 더 중요하고 쉽다는 얘기입니다.
초보탈출 [charger]   2002-12-23 10:56 X
저는 완전초보인데 C를 공부안하고 C++들어갔는데. 참으로 고생을 많이 했네요.. 책 선택을 잘못해서 그런지 몰라도 보통 책들이 C++의 개념이 프로그램 기본 개념 모른상태에서는
초보탈출 [charger]   2002-12-23 10:58 X
진도가 나아가질 않더군요.. 그런 의미로 C의 기본 개념 공부를 하고 C++로 들어간다면 수월하게 배울수 있다고 봅니다.
초보탈출 [charger]   2002-12-23 10:59 X
보통 컴맹이 마우스도 재대로 사용도 못하면서 한글이나 엑셀 배울려고 하는거랑 같죠..
jbuilder [jbuilder]   2003-01-07 20:43 X
닭이 먼저냐...달걀이 먼저냐.....근데 프로그래밍은 이상하게도..C 를 먼저하든...C++ 을 먼저하든..JAVA를 먼저하든....필요한 개념과 프로그래밍 방식은...스스로 깨
jbuilder [jbuilder]   2003-01-07 20:46 X
쳐 가는것 같더군요.....^^ 단지 시작하는게 중요하지않을까요? 무엇을 먼저 하든?
TranX [tranxlate]   2003-04-06 15:28 X
초보자는 초보자가 더 잘아는법 이지만... 머 굳이 C부터 시작할필요는 없는거같아요..중요한건 소스들을 어떻게 쉽고 빠르게 할수 있을까겠죠...
Lloyd von Reuenthal [tinydew4]   2003-04-14 15:49 X
C를 먼저아는게 좋다고 보는데 C에서 간단하게 하고 C++로 넘어가면 더 쉽던데요..C배우고 C++을 봤을때 헤매는 사람은 C를 공부했다는거 이상으로 C를 가지고 많은 경험을 쌓았
Lloyd von Reuenthal [tinydew4]   2003-04-14 15:50 X
기 때문일걸요 전 C를 먼저 하였지만 실무라든지 큰 프로젝트를 한적이 없어 오히려 편했습니다.
관우 [kimdw1410]   2003-05-23 20:30 X
저는 CUI가 맘에드는데요.. 괜찮은 생각인지.. 아.. 이책은 어떤가요? 지금 저도 왕초보입니다.. 출판사 성안당꺼고요..  제목은 C가보이는그림책..  괜찮은 건지..
김요한 [phonon]   2004-08-02 14:24 X
저자(국내서)나 역자도 개념을 제대로 이해를 못한 상태에서 출판하기 때문에 그렇다고 봅니다. 본래 개념은 더 쉽게 사용하기 위한 발상에서 출발했습니다. 원 제안자들의 책을 읽으면 얇아도 모든 내용이 다 들어있으며 쉽습니다. 그런 책을 찾아보세요. 요즘은 그런 것보다 객체의 개념을 어렵게 많이도 설명해 놓아서 불만입니다. 거의 반을 할애하지만 읽고나도 무슨 내용인지 모르겠더군요.
박진석 [jin159357]   2005-08-06 17:18 X
저는 아무것도 모르지만;;;;;;

지금 c언어 책 산것이 정말 후회되네요 싸지도 않은데;

c++로 넘어갈때 고생좀 해야 겠지만

초심자의 마음으로 또다시 배우면 되겟죠 뭐;

프로그래밍에 대한 감각은 익혔으니 뭘 먼저 배우든 상관 없다고 생각해요
박진석 [jin159357]   2005-08-06 17:23 X
사람 햇갈리게 하네요
지금 c 언어 배우는데 c++언어가 더 좋다니까 -ㅁ-
java등등 많은데 c 하나만 알아도 되지 않아요?
0x000 [djdu1018]   2005-10-16 23:30 X
C언어는 그냥 수박 겉핥기 식으로 넘어가시고 그 다음에 C++로 가시는게 편하다고 저는 생각합니다.
0x000 [djdu1018]   2005-10-17 20:51 X
C언어를 마스터 한 다음에 C++을 배우면 객체지향이란 것에 대해 쉽게 익숙해지지 못할 것이고,
C언어를 넘긴 후 C++을 배우면 객체지향(결국 객체지향이 문제)이 이해가 잘 되질 않고,

결국 C언어를 먼저 배워야 겠지만 대충 문법은 이렇고 구조는 저렇고 이렇게만 하고 넘어가셔도 좋습니다.
zz코드 [custom3929]   2008-07-31 14:19 X
이미 객체지향 개념하고 절차지향 개념으로 쪼개지기 때문에,
제 생각에는 절차지향 언어인 C를 먼저 하는것이 나을듯 합니다,
(물론 저도 그 절차를 밟고 있고요)
원래 프로그래밍 언어의 절차가 절차지향에서 객체지향으로 넘어가며 발전한 거라.C언어로 프로그래밍을 못하면 다른 고급언어로 넘어갔을때 그만큼 어려워질것이란게 지금 책 쓰시는 분들의 의견이고
C언어를 깊게 파고들면 지금 현재 고급언어들로 할수 있는것들 거의 다 할수 있더라고요 그리고 지금 사람들이 추천하는 (현직 프로그레머들) 일반 루트는
C->java(객체 지향땜시)->C++->API등등으로 나가더라고요
아,,,그리고 관우씨 그 그림책 저도 봤는데요, 처음에 좀 얼렁뚱땅한게 나와서,,
저는 지금 열혈강의 C프로그래밍 3번쨰 흩어보고있습니다.
마을사람B [shichan307]   2015-06-25 23:24 X
그..c++책들은요 독자가 이미 문법을 알고있다 생각하고 막나가는거같아요. 초보자입장에선 문법은 c에서 먼저 배운 후에 넘어가야 한다 생각하는데 고수님들 생각은 어떤가요?

+ -

관련 글 리스트
9 프로그래밍을 처음 시작하는 왕초보입니다. C부터 배우고 C++을 배워야 하나요? 김백일 47288 2002/11/01
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.