모바일 오유 바로가기
http://m.todayhumor.co.kr
분류 게시판
베스트
  • 베스트오브베스트
  • 베스트
  • 오늘의베스트
  • 유머
  • 유머자료
  • 유머글
  • 이야기
  • 자유
  • 고민
  • 연애
  • 결혼생활
  • 좋은글
  • 자랑
  • 공포
  • 멘붕
  • 사이다
  • 군대
  • 밀리터리
  • 미스터리
  • 술한잔
  • 오늘있잖아요
  • 투표인증
  • 새해
  • 이슈
  • 시사
  • 시사아카이브
  • 사회면
  • 사건사고
  • 생활
  • 패션
  • 패션착샷
  • 아동패션착샷
  • 뷰티
  • 인테리어
  • DIY
  • 요리
  • 커피&차
  • 육아
  • 법률
  • 동물
  • 지식
  • 취업정보
  • 식물
  • 다이어트
  • 의료
  • 영어
  • 맛집
  • 추천사이트
  • 해외직구
  • 취미
  • 사진
  • 사진강좌
  • 카메라
  • 만화
  • 애니메이션
  • 포니
  • 자전거
  • 자동차
  • 여행
  • 바이크
  • 민물낚시
  • 바다낚시
  • 장난감
  • 그림판
  • 학술
  • 경제
  • 역사
  • 예술
  • 과학
  • 철학
  • 심리학
  • 방송연예
  • 연예
  • 음악
  • 음악찾기
  • 악기
  • 음향기기
  • 영화
  • 다큐멘터리
  • 국내드라마
  • 해외드라마
  • 예능
  • 팟케스트
  • 방송프로그램
  • 무한도전
  • 더지니어스
  • 개그콘서트
  • 런닝맨
  • 나가수
  • 디지털
  • 컴퓨터
  • 프로그래머
  • IT
  • 안티바이러스
  • 애플
  • 안드로이드
  • 스마트폰
  • 윈도우폰
  • 심비안
  • 스포츠
  • 스포츠
  • 축구
  • 야구
  • 농구
  • 바둑
  • 야구팀
  • 삼성
  • 두산
  • NC
  • 넥센
  • 한화
  • SK
  • 기아
  • 롯데
  • LG
  • KT
  • 메이저리그
  • 일본프로야구리그
  • 게임1
  • 플래시게임
  • 게임토론방
  • 엑스박스
  • 플레이스테이션
  • 닌텐도
  • 모바일게임
  • 게임2
  • 던전앤파이터
  • 마비노기
  • 마비노기영웅전
  • 하스스톤
  • 히어로즈오브더스톰
  • gta5
  • 디아블로
  • 디아블로2
  • 피파온라인2
  • 피파온라인3
  • 워크래프트
  • 월드오브워크래프트
  • 밀리언아서
  • 월드오브탱크
  • 블레이드앤소울
  • 검은사막
  • 스타크래프트
  • 스타크래프트2
  • 베틀필드3
  • 마인크래프트
  • 데이즈
  • 문명
  • 서든어택
  • 테라
  • 아이온
  • 심시티5
  • 프리스타일풋볼
  • 스페셜포스
  • 사이퍼즈
  • 도타2
  • 메이플스토리1
  • 메이플스토리2
  • 오버워치
  • 오버워치그룹모집
  • 포켓몬고
  • 파이널판타지14
  • 배틀그라운드
  • 기타
  • 종교
  • 단어장
  • 자료창고
  • 운영
  • 공지사항
  • 오유운영
  • 게시판신청
  • 보류
  • 임시게시판
  • 메르스
  • 세월호
  • 원전사고
  • 2016리오올림픽
  • 2018평창올림픽
  • 코로나19
  • 2020도쿄올림픽
  • 게시판찾기
  • 게시물ID : humorbest_850029
    작성자 : Ksana
    추천 : 55
    조회수 : 5156
    IP : 113.10.***.122
    댓글 : 16개
    베스트 등록시간 : 2014/03/07 12:26:23
    원글작성시간 : 2014/03/06 23:01:55
    http://todayhumor.com/?humorbest_850029 모바일
    C 초보가 흔히 하는 삽질성 코드에 대해 조언을 드립니다.
    이제 C언어 등 프로그래밍을 시작하시는 분들께 제 작은 조언을 하나 드릴까 싶어 글 남겨요. 일단 여러분들의 호기심과 열정에 격려의 박수 보내드립니다. 짝짝짝. 그럼 약간의 시간을 들여 삽질성 코드에 대한 조언을 좀 드리도록 할께요. 저는 평소에 글을 좀 무미건조하게 쓰는지라 그다지 재미가 없을지 모르겠어요.<br /><br /> <h1><삽질성 코드?></h1>코딩을 열심히 했습니다. 엄청나게 많은 코드량에 약간 뿌듯합니다. 그러나 똻!!! 버그가 쩝니다!! 뭐가 잘못되었는지 몰라 들여다보고 들여다보고 들여다보지만, 알 수가 없습니다. 도움을 청하기 위해 글을 씁니다. 코딩 창의 코드를 쓱~ 긁어서 쓱~ 갖다 붙입니다. 답변이 오겠지 오매불망 기다립니다.<br /><br />여러분들에게는 훌륭해 보이는 코드일 수도 있습니다. 그렇지만 코드를 복사해 붙이기 전, 여러분들은 여러분들이 보는 코드가 남들에게는 어떻게 보이는 지 좀 더 고민할 필요가 있습니다.<br /><br />초보가 흔히 저지르는 실수가, 이런 "삽질성 코드"의 범람입니다. 제가 아주 싫어하는 코드이인데, 보통 이런 스타일로 작성되는 코드들입니다.<br /><blockquote><font face="Courier New">...</font><br /><font face="Courier New">printf(" 프로그램을 시작합니다.\n");</font><br /><font face="Courier New">...</font><br /><font face="Courier New">...</font><br /><font face="Courier New">printf("blah blah"); scanf("blah blah", &a);</font><br /><font face="Courier New">printf("blah blah"); scanf("blah blah", &b);</font><br /><font face="Courier New">...</font><br /><font face="Courier New">printf("1번 메뉴: "); ... blah blah</font><br /><font face="Courier New">printf("2번 메뉴: "); ... blah blah<br /></font><font face="Courier New">printf("종료는 q: "); ... blah blah<br /></font><font face="Courier New">printf("메뉴를 선택: "); ... blah blah</font></blockquote><br />그래서 프로그램을 실행시키면 무슨 80~90년대 PC 통신 스타일의 뭔가가 만들어지죠. 묻고 싶습니다. 간단한 사칙연산 계산기 로직 하나 만드는데 뭐가 그렇게 장황한가요? 왜 이런 printf의 홍수가 일어나나요? 혹시 콘솔 윈도우에 나오는 그러한 출력물들이 신기해서 그러시는 건가요? 이렇게 코드를 작성하시는 태도는 매우 좋지 않습니다. goto 만큼이나 해롭다고 생각합니다. 혹시 이렇게 프로그램을 작성하시는 분들, 이제 부터는 그렇게 짜지 마세요.<br /><br /> <h1><삽질성 프로그램이 좋지 않은 이유></h1> <h2>1. 당신의 시간이 무의미하게 소모된다.</h2>printf와 scanf, 그리고 쓸데없는 "메뉴" 구성 때문에 불필요하게 시간이 듭니다. 시간 아까워요. <br /><br /> <h2>2. 프로그램의 핵심 로직이 가려집니다.</h2>프로그램이 뭘 하는지 잘 드러나지 않습니다. 그렇게 작성된 코드를 "논술"에 비교한다면 핵심 주제는 한 두줄인데 쓸데없는 미사여구만 10페이지, 혹은 종이에 낙서한 겁니다. 초보 분들, 그리고 실수를 해 버리면 도대체 어디서 잘못된 건지 파악하기도 어렵죠. 왜일까요? 실제 핵심적인 역할을 하는 부분과, 쓸데없이 출력하는 부분, 쓸데없이 입력을 받는 부분, 또 무의미한 메뉴 구성들이 서로 한데 얽혀 풍성한 스파게티가 될 겁니다.<br /><br /><br /> <h1><왜 이런 삽질을 하는가?></h1>그럼 왜 이런 코드를 짜게 될까요? 조금 엄하지만 나열해 보도록 하죠.<br /><br /> <h2>1. 코드에 뭔가 출력되는 것이 신기해서.</h2>당신이 정말 초보라는 증거군요. 그럼 코드는 실습 정도로만 짜고, 책을 더 보고 전반적인 사항을 보다 익히기를 바랍니다. 많이 짠다고 무조건 많이 느는 건 아니에요.<br /><br /> <h2>2. 자신이 없어서.</h2>자신이 짠 코드 흐름도 불안해서 이렇게 하는 거라면, 너무 불안감이 심한 겁니다. 물론 프로그래밍에 익숙한 선배들도 중요한 부분에는 printf 등을 삽입해서 코드가 생각대로 돌아가는지 확인하는 코드를 넣습니다. 그렇지만 이것도 중간 결과를 간략하게 출력하는 로그 정도로 끝내야 됩니다. 불필요하게 번잡한 메시지를 넣을 필요가 있을까요? 중간 결과만 명료하게 알아볼 수 있을 정도로 출력하면 됩니다.<br /><br />* 번잡한 예: scanf( ... , &a); printf("변수 a에 입력된 값은 %d 입니다... 블라블라, ..", a, ...);<br />* 간단한 예: scanf( ...., &a); printf("a = %d\n", a); // 정말 확인을 위해 쓰긴 하지만, 애초에 이런 코드를 넣지 마라.<br /><br />그리고 디버깅을 꼭 배우세요.<br /><br /> <h2>3. 뭔가 있어 보이게 만들고 싶어서.</h2>뭔가 메뉴 1, 2, 3, a, b, c, q 등을 이용해서 메뉴도 만들고 하면 있어 보이니까요.<br />그치만요... 그거 진짜 90년대 PC 통신이잖아요. 아님 자판기에요? 솔직히 말해 남들 눈에는 졸라 구려 보여요.<br /><br /> <h1><그럼 어떻게 짜라는 거지?><br /></h1> <h2>1. 제발 함수를 써서 기능을 분할하세요.</h2>총합을 구하고 싶으면 총합을 수행하는 함수를 만들고, 평균을 구하고 싶으면 평균을 구하는 함수를 만들어 구현하세요. 함수의 입력은 딱 그 역할만 하는 것들만 넣구요. 함수 어떻게 짜는 지 모른다구요? 그럼 그런 삽질 코딩으로 보내는 시간에 함수를 공부하는 것이 어떨까요.<br /><br />메인 함수에 모든 기능이 몽땅 때려박혀 있는거, 재앙입니다. 실습으로 한걸음씩 따라하는 거라든가, 함수를 들어가기 전에 아주 기초 단계일때만 이해 가능한 겁니다. 여러분들의 프로그램 어딘가에서 에러가 납니다. 함수로 잘 기능을 분할했다면 그 에러난 함수만 교정하면 됩니다. 그러나 메인함수에 모든 걸 짰다는 말은, 뒤죽박죽이자 같은 코드가 여러번 반복되었다는 말입니다.<br /><br /> <h2>2. 입력은 파일로 받으세요.</h2>input.txt 등의 파일을 만들어서 거기에 한 줄에 하나씩 케이스를 입력 받아 결과를 출력하도록 하세요. 프로그래밍 경시 대회 등에서 자주 쓰이는 스타일입니다. 표준 입력으로 받더라도 불필요하게 입력을 요구하는 print문을 넣지 마세요.<br />만일 여러분들이 프로그램의 입력으로 정수 두 개를 받고 싶다면,<br /><blockquote><font face="Courier New">int x, y;</font><br /><font face="Courier New">if ( 2 == scanf ("%d %d ", &x, &y) ) {</font><br /><font face="Courier New">....</font><br /><font face="Courier New">} <br /></font></blockquote>정도만 해도 충분합니다. 이외에 정수 두개를 입력하라는 둥의 입력 메시지는 굳이 출력할 필요가 없습니다. 입출력 스타일을 이렇게 딱 정하는 것도 깔끔한 프로그램을 짜는 데 있어 매우 중요합니다. 그리고 파일을 표준 입력으로 받으려면 컴파일된 파일에, 예를 들어 a.exe 가 만들어졌다면,<br /><blockquote><font face="Courier New">a.exe < input.txt</font><br /></blockquote>이렇게 해 주면 됩니다. 진짜 파일로 입력을 받으려면 이렇게 하면 되겠죠?<br /><blockquote><font face="Courier New">FILE *fp = fopen("input.txt", "r");<br />if (fp) {<br />  fscanf("%d %d ", &x, &y);<br />  fclose(fp);<br />}<br />// 여기서도 굳이 파일이 열리지 않았다는 에러 메시지가 필요할까?</font> 이 부분은 선택에 맡긴다.<br /></blockquote>이렇게 입력값을 따로 주는 이유가 있습니다. 매번 컴파일, 실행할 때마다 여러분들은 1, 2, 3, 4 직접 숫자를 입력하지 않아도 됩니다. 그거 일일이 입력하는 것도 시간이 걸리죠. 혹시 두 정수 x, y들을 코드 안엔 박아두었나요? 값을 바꿀 때마다 일일이 재컴파일 하겠죠. 그런 프로그램은 절대 좋은 게 아닙니다. 100번이든 1000번이든 한 번 짜고 컴파일한 뒤 문제를 발견할 때까지 계속 테스트할 수 있도록 만들어야죠.<br /><br />파일을 입력을 받는 법을 모른다면, 반드시 익히셔서 쓸 수 있도록 만드세요. <br /><br /> <h2>3. 입력 포맷과 마찬가지로 출력 포맷도 간단하게 만듭니다.</h2>두 개의 정수를 받아서 하나의 정수를 출력한다든지, 이렇게 단촐하게 결과를 찍는 게 좋습니다. 왜 주저리주저리 값을 출력해야 할까요? 왜 사람의 제어 메뉴가 굳이 들어가야 할까요? 원래 <u>사람의 손을 줄이고 기계의 힘을 빌어 단순한 많은 일을 자동화하기 위해 하는 것</u>이 컴퓨터 프로그래밍의 원칙입니다. 이런 삽질성 코드들은 그러한 원칙을 무시하는 겁니다. 그러니 좋지 않죠.<br /><br />문자열이 들어간다 하더라도 그냥 "The answer is %d\n" 이 정도로. 이것만으로도 프로그램의 동작을 확인은 충분히 할 수 있습니다.<br /><br /> <h1><예: 평균 출력></h1>표준 입력으로부터 N개의 정수를 받아 합과 평균을 출력하는 프로그램을 작성할 겁니다.  입력 포맷은 이렇게 할 겁니다.<br /><blockquote><font size="3">5 1 2 3 4 5</font><br /></blockquote>첫번째 5는 정수의 개수 N입니다. 자신 다음에 정수 5개가 입력된다는 뜻이에요. input.txt 파일을 메모장으로 열어서 적어 줍니다.<br />여기서 입력 포맷은 여러분이 어떤 식으로든 여러분이 입력하기 편하도록 구성하면 됩니다.<br />총합과 평균은 각각 실수(double)이며 하나의 공백으로 구분합니다. 소수점 2자리까지만 표현하도록 하죠.<br /><br /><blockquote><font face="Courier New">#include <stdio.h></stdio.h></font><br /><br /><font face="Courier New">double get_total(int n)</font><br /><font face="Courier New">{</font><br /><font face="Courier New">  double tot = 0.0;</font><br /><font face="Courier New">  int i, x;</font><br /><font face="Courier New">  </font><br /><font face="Courier New">  for(i = 0; i < n; ++i) {</font><br /><font face="Courier New">    scanf("%d ", &x);</font><br /><font face="Courier New">    tot += (double)x;</font><br /><font face="Courier New">  }</font><br /><font face="Courier New">  </font><br /><font face="Courier New">  return tot;</font><br /><font face="Courier New">}</font><br /><br /><font face="Courier New">double get_average(double total, int n)</font><br /><font face="Courier New">{</font><br /><font face="Courier New">  double average = 0.0;</font><br /><font face="Courier New">  </font><br /><font face="Courier New">  if (n) {</font><br /><font face="Courier New">    average = total / (double)n;</font><br /><font face="Courier New">  }</font><br /><font face="Courier New">  </font><br /><font face="Courier New">  return average;</font><br /><font face="Courier New">}</font><br /><br /><font face="Courier New">int main()</font><br /><font face="Courier New">{</font><br /><font face="Courier New">  int n;</font><br /><font face="Courier New">  double average, total;</font><br /><font face="Courier New">  </font><br /><font face="Courier New">  scanf("%d ", &n);</font><br /><font face="Courier New">  total = get_total(n);</font><br /><font face="Courier New">  average = get_average(total, n);</font><br /><font face="Courier New"> </font><br /><font face="Courier New">  printf("%.2lf %.2lf\n", total, average); </font><br /><font face="Courier New">  return 0;</font><br /><font face="Courier New">}</font><br /></blockquote>이것이 컴파일 되어서 average.exe 가 되었다면<br /><blockquote><font face="Courier New">average.exe < input.txt</font><br /><font face="Courier New">15.00 3.00</font><br /><br /></blockquote>이렇게 하면 됩니다. 비주얼 스튜디오를 쓴다면 프로젝트 속성을 열어 "Debugging -> Command Arguments"에 간 다음 "< input.txt"를 넣어 주면 되죠.<br />아주 간결하게 입/출력이 나옵니다. 게다가 입력값은 input.txt 만 바꿔주면 결과는 알아서 바뀝니다. 다시 여러번 컴파일할 필요도 없죠.<br />그리고 여러분들이 합과 평균을 구해 출력했다는 의도까지 함수를 통해 명확히 보입니다. 만일 합에서 에러가 나면, get_total()  함수만 보면 되고, 평균 부분에서 에러가 나면 get_average함수만 보면 됩니다.<br /><br />물론 합과 평균을 구하는 정도의 매우 간단한 코드니까, 모든 걸 main에서 아주 간단하게 처리해도 상관 없습니다. 그러나 코드가 조금이라도 복잡해진다면 반드시 제가 드리는 조언을 지키셔야 버그를 줄일 수 있어요. 말이 많이 길어졌습니다. 그냥 여기 질문 올리시는 분들께 꼭 드리고 싶은 말씀이라 적어 보았습니다.<br /><br />

    이 게시물을 추천한 분들의 목록입니다.
    [1] 2014/03/06 23:24:34  211.177.***.67  핑크마카롱  518940
    [2] 2014/03/06 23:42:07  124.197.***.248  글냥이  54510
    [3] 2014/03/07 00:06:55  121.166.***.169  20세기살라딘  442787
    [4] 2014/03/07 00:44:04  218.154.***.51  DeHet  286616
    [5] 2014/03/07 00:44:53  61.79.***.185  Naaru  452055
    [6] 2014/03/07 00:46:53  223.62.***.115  컴뱃포스  322138
    [7] 2014/03/07 02:14:50  58.141.***.249  hazelnut  334081
    [8] 2014/03/07 02:19:31  121.160.***.226  미스포츈☆  339394
    [9] 2014/03/07 09:01:14  117.16.***.100  못된눈썹  430187
    [10] 2014/03/07 12:26:23  115.94.***.181  3343  32139
    푸르딩딩:추천수 3이상 댓글은 배경색이 바뀝니다.
    (단,비공감수가 추천수의 1/3 초과시 해당없음)

    죄송합니다. 댓글 작성은 회원만 가능합니다.


    현재 게시판의 베스트게시물입니다.  
    번호 제 목 이름 날짜 조회 추천
    858208
    [취업도전기] 라이엇게임즈 [8] SWCraftsman 14/03/26 23:22 6358 49
    858044
    에러 나면 에러원인 읽어보세요 [17] 잉여잉여킹짱 14/03/26 14:07 5400 44
    857080
    질문후 질문글 지우시는 분들께 [10] 콜드이슈 14/03/24 02:15 2726 56
    855754
    자신이 프로그래머인데 자기 형이 싫다면... [21] 콜드이슈 14/03/21 00:31 7590 44
    855224
    과제보니까 짠하다 [6] 잉여잉여킹짱 14/03/19 18:34 4540 25
    853041
    과제글에 답변해주지 맙시다. [13] 잉여잉여킹짱 14/03/14 11:34 4093 47
    852699
    질문글에 답변 달렸으면 삭제하지 맙시다. [18] RedPain 14/03/13 16:25 3047 61
    851154
    불닭볶음면 버그좀 해결해주세요;; [82] 무앙무앙이 14/03/09 21:11 11951 110
    C 초보가 흔히 하는 삽질성 코드에 대해 조언을 드립니다. [16] Ksana 14/03/07 12:26 5156 55
    849876
    예상컨데... [11] Ksana 14/03/07 00:52 2835 32
    849444
    게시판에 올라오는 대학생들 과제에는 답변하지 않아야 한다고 생각합니다. [31] 달빛연구자 14/03/06 05:21 7150 129
    848441
    코딩왕국 [16] 콜드이슈 14/03/03 23:27 4682 52
    847240
    [음모론주의] 요즘 개발자 구인구직 분위기가 험악합니다. [8] 컴포지트 14/03/01 14:35 5622 74
    843113
    (오징어 주의;;) 도서 "프로그래머 철학을 만나다" [10] SWCraftsman 14/02/22 22:51 2807 32
    842460
    프로그래머 현실.youtube [10] 팽이~ 14/02/21 23:06 3705 28
    842034
    오유에 코드를 깨끗이 올리자 (Syntax Highter) [12] E_Sukmean 14/02/21 10:18 2487 23
    841194
    [루아 이야기] 3. 루아의 기본적인 문법을 익혀보아요. [3] 달빛연구자 14/02/20 14:21 2985 25
    841178
    [루아 이야기] 4. 루아를 강력하게 만들어 주는 IUP를 소개할께요. [12] 달빛연구자 14/02/20 13:41 2397 23
    841087
    [루아 이야기] 1. 루아를 설치해 보자. [9] 달빛연구자 14/02/20 10:35 3913 35
    840740
    [루아 이야기] 2. 루아의 기본 사용법을 익혀 봅시다. [6] 달빛연구자 14/02/20 01:00 3595 27
    839443
    디버깅.gif [18] 평정컴퓨터 14/02/18 00:45 4808 72
    838002
    파이썬 책 추천부탁해도될까요? 쇠고기야채죽 14/02/15 19:26 3615 33
    837749
    C 고수분들 제발 도움좀 급해요. [18] 콜드이슈 14/02/15 02:54 4824 55
    837218
    질문하는 법 [9] RedPain 14/02/14 06:43 2762 44
    836248
    요즘 쳐 돌은 개발자들이 속속 눈에 띕니다. [45] 컴포지트 14/02/12 14:55 7794 53
    835182
    라인 1줄로 만드는 담력테스트 게임 [37] 콜드이슈 14/02/10 18:01 89043 54
    834423
    군대에서 코딩하는 9가지 방법 [17] RedPain 14/02/09 12:47 16150 40
    [◀이전10개] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [다음10개▶]
    단축키 운영진에게 바란다(삭제요청/제안) 운영게 게시판신청 자료창고 보류 개인정보취급방침 청소년보호정책 모바일홈