모바일 오유 바로가기
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_875061
    작성자 : 달빛연구자
    추천 : 99
    조회수 : 8844
    IP : 59.18.***.43
    댓글 : 34개
    베스트 등록시간 : 2014/04/30 17:18:23
    원글작성시간 : 2014/04/29 23:44:13
    http://todayhumor.com/?humorbest_875061 모바일
    C언어로 프로그램 짤 때의 몇가지 요령
    <div>안녕하세요. 달빛연구자 입니다.<br />저는 주 언어를 C를 사용하고 있는데요.<br /> 다른 고급언어들과 달리 비교적 단순한 문법을 갖고 있는 C는 스스로 엄격한 규칙을 가지고 짜지 않으면, 소스가 쉽게 엉켜버리는<br />특징을 가지고 있습니다.<br /> 이 글에서는 제가 코드를 짤 때 사용하는 규칙을 몇가지 뽑아서 소개하고자 하는데요.<br /> C언어를 사용하시는 분들께 많은 공감이 되었으면 좋겠습니다.</div> <div> </div> <div><strong>1. 하나의 함수가 오직 하나의 기능만을 수행할 때 까지 분리할 것</strong>.<br /> 함수를 만들 때 조건문을 사용하여, 하나의 함수가 여러가지의 기능을 하도록 만드는 경우가 있습니다.<br />이렇게요</div> <div>int foo(int a, int b,int c)<br />{<br /> if(c == 1){return a+b;}<br /> if(c == 2){return a-b;}<br /> return 0;<br />}</div> <div>이러한 형태는 함수의 재사용성과 가독성을 떨어뜨리게 되므로 사용하지 않는 것이 좋습니다. <br />대신 아래와 같이 고쳐주는 편이 좋습니다.</div> <div>int plus(int a,int b){return a+b;}<br />int min (int a,int b){return a-b;}</div> <div>만약 어떠한 사정으로 반드시 foo함수와 같은 형태로 써야만 한다면 foo라는 함수가 오직 분기의 기능만을 수행하도록<br />아래와 같이 foo를 작성해 주면 됩니다.</div> <div>int foo(int a,int b, int c)<br />{<br /> switch(c)<br /> {<br />  case 1: return plus(a,b);<br />  case 2: return min(a,b);<br />  default: return 0;<br /> }<br />}</div> <div><strong>2. 함수 내부에서 static 변수를 사용하지 말 것.</strong><br />int foo(void)<br />{<br /> static int a = 0;<br /> a++;<br /> return a;<br />}</div> <div>위와 같이 작성된 함수는 한번 호출될 때마다 1씩 증가된 값을 리턴합니다.<br />함수 내부에서 static 변수나 전역변수를 참조하는 것은 멀티쓰레드 동작시 재진입 문제가 발생하기 때문에, 가능한 피하는게 좋습니다.<br />또한 디버깅시 함수의 동작 뿐 아니라 상태까지 고려해 주어야 하는 어려움이 발생합니다.</div> <div>이러한 함수가 필요하다면, 아래와 같이 함수 외부에서 값을 받도록 바꾸어 주는 편이 좋습니다.</div> <div>void foo(int *a){*a = *a + 1;}</div> <div> </div> <div><strong>3. 함수의 출구를 하나로 묶을 것</strong><br />아래는 매우 흔한 형태의 메모리 누출의 예 입니다...<br />int foo(int c)<br />{<br /> int *a=NULL;<br /> a = (int*)malloc(sizeof(int)); <br /> if(c == 2){return -1;}<br /> free(a);<br /> return c;<br />}</div> <div>함수의 마지막에서 free를 잘 호출해 주었으나, c == 2 인 경우에는 free를 호출하지 못하고 함수가 끝나버리는데요..<br />이러한 실수가 실무에서도 상당히 많이 일어나며, goto를 활용하면 아래와 같이 바꿀 수 있습니다.</div> <div>int foo(int c)<br />{<br /> int res = 0;<br /> int *a=NULL;<br /> a = (int*)malloc(sizeof(int)); <br /> if(c == 2)<br /> {<br />  res = -1;<br />  goto END;<br /> }</div> <div> res = c;<br />END:<br /> free(a);<br /> return res;<br />}</div> <div>함수의 출구가 항상 하나로 묶여있기 때문에 함수가 종료될 때는 항상 free를 실행하게 됩니다.</div> <div> </div> <div><strong>4. 옳지 않은 조건을 먼저 소거할 것</strong><br />아래의 코드는 옳지 않은 조건을 소거하지 않는 코드의 예 입니다.<br />int foo(int c,int d)<br />{<br /> if(c == 1 || d == 3)<br /> {<br />  printf("ok");<br />  return 0;<br /> }<br /> return -1;<br />}<br />이것을 아래와 같이 바꾸라는 말 이에요.<br />int foo(int c,int d)<br />{<br /> if(c != 1){return -1;}<br /> if(c != 3){return -1;}<br /> printf("ok");<br /> return 0;<br />}</div> <div>코드를 이렇게 바꾸었을 때 이점이 있는데요. 그것은 바로 블럭의 깊이가 깊어지지 않는다는 점입니다.<br />대신에 코드가 아래로 쭉 길어지지만, 블럭이 깊어지는 것보다는 낫습니다.</div> <div>또한 이렇게 코드가 단순한 형태를 유지하며 아래로 쭉 길어지면 디버깅을 할 때 break point를 잡기가 수월해진다는 장점이 있고요.</div> <div>5. 일반적인 목적의 함수는 가능한 특수한 목적을 갖는 함수의 형태로 감싸서 사용할 것.<br />글로 써 놓으니 의미가 조금 애매할 수 있는데요. 예를 들자면 이런 겁니다.</div> <div>printf("[error message] %s",error_message);</div> <div>이러한 형태의 코드를 직접 사용하는 대신 아래와 같이 감싸서 사용하라는 의미입니다.<br />int error_print(const char *error_message)<br />{<br /> return printf("[error message] %s",error_message);<br />}<br />조금 소소해 보일 수 있지만, 이렇게 감싸놓은 코드는 유지보수에 감초같은 존재가 되어 줍니다.</div> <div> </div> <div><strong>6. 전역범위에서 static 을 적극적으로 활용할것.</strong><br />전역범위에서의 static 예약어는 전역변수와 함수가 해당 파일 밖에서 호출되는 것을 막아줍니다.<br />즉 함수 내부에서만 사용하는 전역변수와 함수들은 모조리 static을 붙여 선언해 주어야합니다.<br />그러면 파일은 아래와 같은 형태를 지니게 되죠..</div> <div>xxx.h<br /> void func_init(void);<br /> void func_run(void);<br /> void func_deinit(void);</div> <div>xxx.c<br />typedef struct { ... }xxx_t;<br /> static void func_a(void);<br /> static void func_b(void);<br /> static void func_c(void);</div> <div>즉 위와 같은 형태로 함수원형이 선언되었다면, 이 모듈을 사용하는 사람은 static으로 선언된 함수들에 대해서는 신경쓰지 않고,<br />오직 헤더에 선언된 함수들만을 사용해서 작업할 수 있게 됩니다. 사용자로에게 필요없는 함수와 변수를 은닉하는 것입니다.</div> <div>이와 같이 소스파일을 하나의 객체(Object)로 보고, 인터페이스 함수를 제외한 모든 부분을 다른 파일로부터 감추는 것이<br />C언어로 코드를 짤 때 가장 기본이 되는 요령 중 하나 입니다. 완전한 OOP는 아니되 비교적 OOP 비슷하게 짜지 않으면, 코드의 복잡도와<br />상호의존도가 급격하게 올라가 프로그램의 규모가 커질수록 고생을 하게 되기 때문이죠.</div> <div> </div> <div><strong>7. 숫자를 하드코딩할 때에는 반드시 enum이나 define으로 치환해서 사용할 것.</strong><br />예는 간단합니다.</div> <div>int a = 5;<br />이렇게 쓰는 대신<br />#define ARRAY_SIZE_MAX 5<br />int a = ARRAY_SIZE_MAX;</div> <div>이렇게 쓰라는 이야기죠. 이렇게 하는 이유는 크게 두 가지 인데요. 하나는 가독성을 위한 부분이 크고요.<br />나머지 하나는 같은 의미의 숫자가 여러 곳에서 쓰일 때 이것 하나만을 고치면 모든 부분에 적용되는 것을 기대하는 것 입니다.</div> <div>다른 사람이 짜 놓은 코드를 분석할 때 가장 곤란한 것 중 하나가 의미를 알수없는 상수입니다.<br />이것을 매크로로 치환해 놓으면, 매크로 자체가 상수의 의미를 설명하는 주석이 되어 줍니다.<br /> </div> <div>이번 글에서 소개할 내용은 이상 7가지 입니다.</div> <div>사실 이런식의 규칙은 제가 사용하는 것만 해도 수십개가 되어서 일단은 7개의 항목만을 정리해서 올렸는데요.</div> <div>개인적인 노하우기 때문에 제가 무조건 옳다는 법도 없고, 이런 규칙이 오히려 독이 되는 경우도 있을 것 입니다.</div> <div>그런 걸 발견하시면 댓글로 피드백을 주시면 감사하겠습니다.</div> <div> </div> <div>감사합니다.</div>

    이 게시물을 추천한 분들의 목록입니다.
    [1] 2014/04/29 23:50:55  182.213.***.139  수상한그녀  372006
    [2] 2014/04/29 23:55:36  220.117.***.100  붉은십자군  61964
    [3] 2014/04/30 03:05:12  175.116.***.223  만렙마법사  160178
    [4] 2014/04/30 04:24:59  175.223.***.53  저기요?  141504
    [5] 2014/04/30 06:30:42  211.178.***.121  커널패닉  370633
    [6] 2014/04/30 07:08:40  180.231.***.165  황금비  483546
    [7] 2014/04/30 09:19:37  223.62.***.81  올레7코스  240349
    [8] 2014/04/30 10:02:20  112.216.***.59  kosi  439167
    [9] 2014/04/30 17:03:05  1.253.***.173  우헤헤헤헤  137160
    [10] 2014/04/30 17:18:23  218.233.***.4  인민에어  346503
    푸르딩딩:추천수 3이상 댓글은 배경색이 바뀝니다.
    (단,비공감수가 추천수의 1/3 초과시 해당없음)

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


    현재 게시판의 베스트게시물입니다.  
    번호 제 목 이름 날짜 조회 추천
    890055
    프로그램 짜다가 하다가 막혀서 질문 [32] 콜드이슈 14/05/29 17:16 5158 40
    889793
    졸업작품 테스트 해주세요 ㅠ [25] downmix 14/05/29 00:56 5351 35
    889193
    애매하게 보람있는 포맷 [9] 만렙마법사 14/05/27 22:21 4679 37
    886517
    질문글에 본인 삭제 금지 [11] 콜드이슈 14/05/22 13:50 3531 82
    885726
    자바스크립트 애니메이션 프레임워크 famo.us 정식 오픈! [5] 컴포지트 14/05/20 20:27 2441 35
    883419
    과제글에 대처하는 방법 [17] Cochineal 14/05/16 15:35 3155 26
    882535
    열받아서 푸념합니다 [20] 행보관의삽질 14/05/14 19:26 3319 43
    882201
    프로그래머가 과속하는 방법 [19] 콜드이슈 14/05/13 23:30 8155 38
    879716
    [후기] 라이엇 게임즈 개발자 취업 [30] SWCraftsman 14/05/09 14:57 32007 85
    C언어로 프로그램 짤 때의 몇가지 요령 [34] 달빛연구자 14/04/30 17:18 8844 99
    873950
    회사 때려치고 노동부에 신고했다는 사람입니다. [30] 개발자노잼 14/04/28 19:33 7638 145
    872166
    나는 개발자입니다 [14] 단풍나무왕 14/04/25 15:28 5712 82
    872016
    질답 게시판을 하나 따로 만들어줬으면 좋겠네요 [6] 울바 14/04/25 09:54 1133 18
    871682
    프로그래머 남편 [14] 망그로브 14/04/24 21:48 6373 36
    870761
    (펌) 공돌이식 고백 [26] 서면몇센치게 14/04/23 01:37 7176 60
    864040
    여기가 홍진호씨 게시판인가요? [9] 중고신상 14/04/11 19:00 6420 66
    863081
    프로그래밍에 대한 몇 가지 문답 [9] 달빛연구자 14/04/09 01:27 3627 56
    862882
    전 누가 저한태 여친 있냐고 물어보면 죽어요 [41] 난늘그레 14/04/08 15:29 9227 57
    862857
    난 프로그래머 게시판이 처음 생길때.. [15] 콜드이슈 14/04/08 14:03 4989 51
    861420
    과제 질문에 대해 좋은 응답을 못 듣는 이유를 생각해 봤어. [12] 루저녀석 14/04/04 06:49 2667 51
    861418
    개발자가 보면 암걸리는 동영상 [30] enoeht 14/04/04 06:20 9096 63
    859670
    프로그래머의 수신호 [27] 민영화는재앙 14/03/30 16:04 7994 108
    859664
    과제코드 질문글 올리고 삭제하는사람의 심리 [15] JNYEON 14/03/30 15:57 3535 61
    859472
    질문(또는 숙제)글의 답답한 無피드백들을 보며.. [6] 앵두 14/03/30 00:03 2139 45
    858823
    공대찌질이님 보세요 [20] 잉여잉여킹짱 14/03/28 14:26 4841 61
    [◀이전10개] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [다음10개▶]
    단축키 운영진에게 바란다(삭제요청/제안) 운영게 게시판신청 자료창고 보류 개인정보취급방침 청소년보호정책 모바일홈