티스토리 툴바


이글은 2004년 2월 12일 목요일 Focus에 나온 글입니다. 

1. 가짜 : 비쥬얼 베이직을 쓰면 후진놈 C만 쓰면 잘하는놈
   진짜 : 아무거나 쓴다. 

2. 가짜 : 언제나 툴에 의존하려 하고 좋은 툴을 찾아내려한다.
   진짜 : 별 관심 없다. 

3. 가짜 : 항상 고습기능을 익히려고 해쓴다. 
   진짜 : 별 생각없다.

4. 가짜 : 프로그래밍을 짜면 아주 성의있게 멋지게 만들려고 해쓴다. 
   진짜 : 눈에 보이는 대로 만든다. 그러나 필받으면 기차게 만든다. 

5. 가짜 : 항상 웹에만 관심이 있다. 
   진짜 : 별 관심 없다.

저작자 표시 비영리 변경 금지
*** 프로그래머 십계명 *** 

시작부터 경지에 이르기까지... 

1. 정보를 모음에 소홀히 하지 말고 설명서를 읽음에 게을리 하지 말지어 
다. 오늘 필요 없는 정보는 내일 필요하리라. 가장 가치 있고도 저렴한 
지식은 책 속에 있느니라. 서점과 동료의 책꽂이에 무엇이 꽂혀 있는지 
때때로 살피어라. 무심코 흘렸던 종이 한 장이 너의 근심을 풀어 주었 
으리라. 설명서는 충분히, 꼼꼼히 읽을지어다. 모든 의문은 설명서를 
안 보는 데서 생기니라. 그렇더라도 모두 다 읽을 필요는 없느니라. 

 

2. 너의 PC가 안전하다고 믿지 말지어다. 5분 후에 정전이 되고 내일 너의 
하드가 맛이 가리라. 그러하니 너의 소중한 소스 코드는 정기적으로 여 
러 군데에 단계별로 백업해 두어라.

 

3. 변하는 수를 다룰 때에는 늘 조심할지어다. 정수가 절대로 그 한계를 
넘지 않으리라 가정하는 것은 어리석음이라. 127, -128, 255, 32767, 
-32768, 65535, 이 숫자들을 너의 골수에 새기어라. 0.0은 0이 아니니 
실수는 원래부터 결코 정밀하지 않느니라. 부호 없는 것과 있는 것을 
어울리거나 정수끼리 나눌 때에는 늘 조심하여라. 

 

4. 무슨 일을 반복시킬 때에는 처음과 끝에 유의할지어다. 너의 컴퓨터는 
1보다는 0을 좋아 하니라. 배열의 첨자가 그 범위를 넘지 않을지 손 댈 
때마다 따져 보아라. 수식에 1을 더하거나 뺄 때에는 늘 긴장하라. 너 
의 프로그램은 단지 한 번 덜해서 틀리고 한 번 더해서 다운되느니라. 

 

5. 항상 모든 경우의 수를 고려하고 섣불리 생략하지 말지어다. 절대로 일 
어나지 않을 일은 반드시 일어나고, 가장 드물게 일어날 일이 가장 너 
를 괴롭히리라. 그러하니 언제나 논리에 구멍이 없는지 꼼꼼히 따져 보 
고, if를 쓸 때에는 else부터 생각하라. 

 

6. 함수 안에서 매개 변수값은 결코 믿지 말지어다. 지금 그 매개 변수가 
결코 가질 수 없다는 값을 내일부터는 가지리라. 그러하니 매개 변수값 
이 올바름을 항상 검사할지어다. 그렇더라도 처리 속도가 문제가 되는 
경우는 예외이니라. 

 

7. 오류를 알려 주는 기능은 있는 대로 모두 활용할 지어다. 컴파일러의 경 
고는 모두 켜 두어라. 경고는 곧 오류이니라. 오류를 알리는 함수의 결 
과를 확인하지 않는 우를 범하지 말지어다. 모든 파일 입출력과 모든 
메모리 할당은 조만간 실패할 것이라. 

 

8. 한 번의 수정과 재컴파일만으로 연관된 모든 것이 저절로, 강제로 바뀌 
도록 할지어다. 어떠한 것을 수정했을 때에 연관된 것이 따라서 변하지 
않는다면 그것이 곧 벌레이니라. 컴파일러로 하여금 매개 변수 리스트 
를 완전하게 검사하도록 하고, 언젠가 손대야 하거나 따라서 변해야 하 
는 수치는 전부 매크로로 치환하며, 형 정의를 적극 활용하여라. 

 

9. 사용자가 알아서 잘 써 주리라고 희망하지 말지어다. 너의 프로그램은 
항상 바보와 미친놈만이 쓰느니라. 사용 설명서를 쓸 때에는 결코 빠뜨 
리지 말아라. 빠뜨린 만큼 사용자는 너를 괴롭힐 것이니라. 

 

10.매사에 겸손하고 항상 남을 생각할지어다. 가장 완벽한 프로그램일수록 
가장 완벽하게 숨은 벌레가 있느니라. 네가 이 세상 최고의 프로그래머 
라고 떠들며 자만할 때, 옆집 곳간에서는 훨씬 더 뛰어난 것을 묵묵히 
만들고 있느니라. 아무렴 프로그래밍은 혼자 잘나서 할 게 아니니, 너 
로 인해 다른 사람들도 더불어 잘 되면 그얼마나 좋은 것이냐. 

이 모든 것을 깨닫고 지키려 애쓰는 자는, 있어도 없어도 되어도 아니 
되어도 늘 평온하리라. 

저작자 표시 비영리 변경 금지
작은팁~ C언어 이야기 2011/10/28 10:58
모르면 섭섭한 작은 팁이에요^^

일반적으로... 스스로 코드를 작성하는 중..에는 별로 쓸 일이 없지만 ㅇ_ ㅇ;

여기저기 소스를 긁어다가 모으신 경우

스튜디오에 복사해 놓고도 코드 라인이 이리 밀리고 저리 밀려서 가독성이 떨어질 때!

 

우리의 마법사님을 불러냅니다!

Ctrl + K, Ctrl + F 이쁘게 자동 정렬~ 인거죠

 

코드 들여쓰기와 내어쓰기를 자동으로 이쁘게 해준답니다

정리를 원하시는 코드라인을 블록으로 지정하시고

Ctrl + K 후에 Ctrl + F  하시면 완성 ^^

 

전체를 정렬하시고 싶다면 당연히

Ctrl + A, Ctrl + K, Ctrl + F ^^

 

이쁜 코딩하세요 학우여러분 ㅎㅎ

 

인터넷에서 소스를 복사하게되면...

 

왼쪽으로 쏠리는 경우가 있는데요

 

이럴때 사용하면 참 편리하네요~ ^^


범위 잡고, ALT + F8 을 누르면

 

아주 보기 좋게 소스들이 정렬되는것을

 

볼수 있습니당~ ^^

 

많이 많이 이용해주세욤~ ^^


저같이 변덕이 심한 분들은 필수로 아셔야 할 팁 ^^

변수명을 sangmi 로 짓고 코드 내에서 수백번?ㅎ 사용했다고 가정해 봅시다~

 

앗 그런데 어떤 이유로든 그 변수명을 sangmiWon 으로 바꾸고 싶어진거에요!

아니 이런!! 어떻게 수백번을 일일이 찾아서 바꾸는고! 끄아아아!!

 

하지만 걱정마세요 +_+ 우리에겐 Replace All 이 있으니깐용 ㅎㅎ

변경을 원하는 변수명 위에 커서를 놓고 Ctrl + H 를 눌러용

 

작은 창이 뜹니다. 커서가 변수명 위에있도록 하고 실행 했기 때문에

맨 위창에는 현재의 변수명이 써있지요

그 아래 replace with 가 있죠? 거기에 변경을 원하는 이름을 써주시고~

Replace All 버튼을 꾹! ㅋㅋ 

그러면 총 몇개의 변수명이 바뀌었는지 표시 해 주고 끝나요! 아주 간단하지용 ㅎㅎ

 

아아~

바꾸자마자 후회가 된다면

가볍게 Ctrl + Z 

이건 뭐 어느 프로그램이나 그렇죠 ㅎㅎ 바로 전 행동 취소 ^^

 

Ctrl + H 로 불러낸 창에 

원하는 변수명을 다음, 다음, 다음 이렇게 찾아 내려가는 기능도 있고 (Ctrl + F 로 바로가기 가능)

하나만 바꾸는 것도 있고 그러니까..

여러모로 잘 사용 해 보시면 좋겠죠 ^^

 

으흥

우리가 코딩을 하다보면..

(그게 자체적으로 지원하는 함수명이든.. 아니면 우리가 선언한 변수명이든..)

뭔가 함수나 변수의 이름들이 너무 길고 복잡해져서!

안그래도 느린(저 같은 경우 매우 느린) 영타로 감당하기가 버거울 때!

에.. 아니면 급성귀차니즘 발병이라던가.. 저 같이 만성 귀차니즘 질환자들에게!!

 

컨트롤 + 스페이스라는 

신의 가호가 있었으니 ㅡ.ㅡ;;; 

 

에.. 그것을 적극적으로 활용해 주는 겁니다 ^0 ^/ 꺄호~

 

가령

bool   isKillingTimeNow = true;

이런 변수가 있다고 했을때.. 그 값을 바꾸려면 다시 그 변수명을 다 쓰겠죠!  ('0' 시러~!!)

그때!

 

isKill 

대략 요정도 쓰시고.. 컨트롤 + 스페이스를 해주는 겁니다!

그럼 멋지게 쨔쟌~

isKillingTimeNow 

이렇게 되어요 ^^; 

뭐 물론 isKill 로 시작하는 변수명이 또 있다면 얘기는 달라지지만요 ㅎㅎ

그래도 드롭다운으로 선택할 수 있는 모든 변수명이 출력되기 때문에

간단히? 마무리 할 수 있죠 ㅎ


코드 라인을 오른쪽으로 밀고 싶으시면 (뭔가 가독성을 위해서 많이들 그러시죠?)

탭을 누르시잖아요. 그걸 다시 왼쪽으로 당기고 싶으시면 

시프트 + 탭을 하시면 됩니당 ㅎㅎ

 

나중에 이 파일 저 파일~ 프로젝트에 파일이 많아졌을 경우

여기 저기 옮겨 다니실 때는

컨트롤 + 탭 ^^

뭔가 익스플로어 여러개 중에 알트 + 탭의 기능과 같다고 보시면 될 것 같아요 ^^;

 

음 그리고..

타인의 코드를 볼 때 많이 사용되겠지만..

코드 중에 어떤 함수를 사용하고 있는데 어떤 기능을 하는 함수인지 

정의된 부분을 보고 싶은 경우

함수명에 커서를 대시고 F12 누르시면 바로 이동 하더라구요

 

Ctrl + Tab : Edit하고 있는 Child Window 간의 이동 

Ctrl + F4 : 현제 Edit하고 있는 Child Window 닫기 

Ctrl + I >> 자열 입력 : 점진적으로 문자열 찾기 

Ctrl + F3 :현재 커서에 있는 문자열 찾기 (블록 지정 안 해도 됨) 

F3 : 찾은 문자열에 대한 다음 문자열로 이동 

Ctrl + H : 문자열 찾아 바꾸기 

Ctrl + Left/Right Arrow : 단어 단위로 이동 

Ctrl + Delete 또는 Backspace : 단어 단위로 삭제 

Ctrl + F2 : 현재 라인에 북마크 지정/해제 

F2 :지정된 다음 북마크로 이동 

Ctrl + Shift + F2 : 지정된 모든 북마크를 해제 


저작자 표시 비영리 변경 금지
성공하는 프로그래머들의 9가지 코딩습관 -Intro

>> 좋은 소스 코드가 좋은 프로그램을 만든다 

 

작동하는 결과만 좋으면 소스 코드는 어떻게 만들어지든 상관이 없다고 생각하는 사람들이 있다.

 절대로 그렇지 않다. 프로그램은 한 번 만들고 끝나는 법이 없다. 계속되는 버그 수정, 

기능 확장 등 계속적인 관리가 필요하다. 그래서 소스 코드는 최대한 알아보기 쉽고 관리하기 쉽게 만들어져야 한다.

 이 것은 1차로 프로그래머를 위한 것이지만 결국 프로그램의 성능에도 영향을 미칠 수밖에 없다. 

관리하기 어려운 소스 코드에서 좋은 프로그램이 나오는 것은 불가능하기 때문이다.

 이 글을 통해 좋은 프로그래밍 습관을 배워보자. 이 글을 제대로 이해하려면 최소한 하나의 프로그래밍 언어는 어느 정도

 알고 있어야한다. 

ASP,PHP,Perl,xxxxJavaScript 등의 스크립트 언어도 상관없다. 

HTML도 일종의 언어이기 때문에 몇 가지를 빼고는 적용할 수 있을 것이다. 

이 글에서 사용한 예제는 모두 C로 작성되었지만, C언어를 모른다고 해서 걱정할 필요는 없다.

 여기서 중요한 것은 "원리"이지 "특정 언어"가 아니다.

1 문장을 확실히 끝낸다.

 

프로그래머가 가장 흔히 저지르는 실수는 한 문장을 끝내고 세미콜론(;)을 빼 먹는 것이다. 

 

이렇게 해서 생긴 오류는 때로 감쪽같이 숨어서 프로그래머를 당황하게 만든다. 

 

코드 작성시 각 문장이 세미콜론으로 제대로 끝났는지 항상 확인하라. 

 

비록 모든 언어가 문장 끝에 세미콜론을 요구하지는 않는다 하더라도 말이다. 여기 세미콜론을 잊어버린 예제가 있다: 

int main(void)

{

    /* 세미콜론이 없음. 오류 발생*/ 

    printf("Hello World!\n") 

    return(0);

}

 

 

 

놀랄 정도로 많은 사람들이 이런 실수를 한다. 몇 줄 안되는 프로그램에서는 그럭저럭 괜찮지만…

 

길이가 1000 줄 이상이 되는 코드를 작성한다고 하면 문제는 다르다. 어디선가 세미콜론을 빼 먹었다면 찾아내는 일이

 

 쉽지 않을 것이다. 일반 문장 끝에 항상 마침표(.)를 쓰듯이 코드 한 줄이 끝나면 항상 세미콜론을 써라.

 

세미콜론에 관한 다른 실수는 그것을 엉뚱한 곳에 찍어서 생긴다.

 

 경험 있는 프로그래머들은 다음의 예제를 보고 웃음을 터트릴 테지만, 필자는 실제로 이런 일을 많이 보았다. 

 

자신의 프로그램이 왜 작동하지 않는지 이상하게 여기며 email을 보내는 사람들이 많은데, 

 

거의 대부분 세미콜론 때문이다. 다음 예를 보자: 

 

/* main() 뒤에 세미콜론 필요 없음 */ 

int main(int argc, char *argv[]); 


    printf("Hello World"); 

    return(0); 


 

 

 

 

함수나 메소드, 제어문 블록을 시작할 때 세미콜론을 찍으면 안 된다. 


빈칸과 들여쓰기를 적절히 활용한다.

 

C언어에서 빈 칸은 무시된다. 따라서 빈 칸없이 모두 붙여 쓴 코드를 만들 수는 있지만 결국 아무도 알아보지 못하는 

 

"어려운" 코드가 되고 만다. 다음 예를 보자: 

 

if(x==0) {a=b=c=d=MAX; x++;}

 

이렇게 코드를 작성하면 공간을 절약할지 모르지만 다른 사람은 물론 작성자 자신도 알아보지 못하는 코드가 된다.

 

 읽기 쉽게 구성된 코드를 작성하라! 

if(x == 0) 


    a = b = c = d = MAX; 

    x++;


 

 

 

얼마나 보기 편해졌는가? 빈 칸이 적절히 있어야 코드가 읽기 쉽다. 

 

컴퓨터는 빈 칸을 상관하지 않지만, 사람에게는 꼭 필요하다. 들여쓰기 역시 마찬가지다.


3 중괄호와 블록 방식을 통일한다.

 

프로그래머마다 중괄호({,})와 블록을 쓰는 방법이 다르기 때문에 다른 프로그래머가 코드를 넘겨 받아 작업할 때 혼란이 생긴다. 

 

예를 들면, 이런 식으로 쓰는 것이다: 

int main() 


    int x = 1; 

    int y = 10; 

    while(x < y ){ 

        printf("Value of x is %d\n", x); 

        x++; 

    } 


 

 

 

 

어떤 프로그래머들은 다음과 같이 중괄호를 사용한다: 

int main() 


    int x = 1; 

    int y = 10; 

    while(x < y )

    { 

        printf("Value of x is %d\n", x); 

        x++; 

    } 


 

 

 

 

모두가 동의하지는 않겠지만, 필자는 2번째 방식을 더 좋아한다. 블록의 시작과 끝이 명확하기 때문이다.

 어떤 한 방식을 모든 프로그래머에게 강요할 수는 없지만 하나의 프로그램 안에서는 한 방식으로 통일해야 한다. 

그리고 다른 프로그래머의 코드를 볼 때는 다른 방식에 대한 가능성을 언제나 염두에 두고 보아야 한다. 

 
  

4. if를 남용하지 않는다.

 

어떤 사람들은 "if" 문 사용하기를 너무 좋아해서 다음과 같은 코드를 작성하기도 한다: 

if(a == 0) 


    a++; 

    return(a); 


 

if(a == 1) 


    a += 5; 

    return(a); 


 

if(a == 2) 


    a += 10; 

    return(a); 


 

if(a == 3) 


    a += 20; 

    return(a); 


 

if(a == 4) 

    exit(1);

 

 

 

이것보다 더 나은 방법이 있을까? else if를 쓰는 것? 아니다. 대안은 "switch-case"문을 사용하여 간결한 코드를 얻는 것이다: 

switch(a) 


    case 0: a++; 

        return(a); 

 

    case 1: a += 5; 

        return(a); 

 

    case 2: a += 10; 

        return(a); 

 

    case 3: a += 20; 

        return(a); 

 

    default: exit(1); 

}

 

 

 

 

"a"와 일치하는 값이 없으면 자동적으로 default에 정의된 작업을 한다. 위의 예에서는 프로그램이 끝나게 설정되어 있다.

 

 
  

블록 안의 블록(nesting)을 남용하지 않는다 
 

사람들이 블록 안의 블록(nesting)을 얼마나 남용하는지 알 게 되면 놀랄 것이다. 세 개 이상의 중첩된 블록을 갖는 것은 좋지 않다. 알아보기 힘들기 때문이다. 다음 예제를 보자. 

int a = 10; 

int b = 20; 

int c = 30; 

int d = 40; 

 

if(a == 10) 


    a = a + d; 

    if(b == 20) 

    {

        b = b + a; 

        if(c != b) 

        { 

            c = c + 1; 

            if(d > (a + b)) 

                printf("Made it all the way to the bottom!\n"); 

         } 

    } 

}

 

 

 

어느 정도는 과장되어 있지만, 많은 사람들이 "진짜" 이렇게 하고 있다. 그럼 어떻게 고칠 수 있을까? 한 가지 방법은, 함수로 나누는 것이다: 

void next(int a, int b, int c, int d) 


    if(c != b) 

    { 

        c = c + 1; 

        if(d > (a + b)) 

            printf("Made it all the way to the bottom!\n"); 

    } 


 

int main() 


    int a = 10; 

    int b = 20; 

    int c = 30; 

    int d = 40; 

 

    if(a == 10) 

    { 

        a = a + d; 

        if(b == 20) 

        { 

            b = b + a; 

            next(a, b, c, d);

        } 

    } 

    return(0); 

}

 

 

 

 

이렇게 하려면 일거리가 약간 늘겠지만, 코드는 구조화되고 읽기는 휠씬 쉬워진다. 함수를 좀 더 잘 만들면 다른 함수에서도 다시 사용할 수 있다. 코드 전체를 이해하기 쉽게 만들려면 더 많은 코드를 만들어야 하는 경우가 자주 있다. 그러나 한 번만 그렇게 하면 오래도록 편리하다. 

 

6. 주석을 열심히 제대로 단다 

 

 

코드에 주석을 자주 달아라. 사람들이 이해하기 어려운 문장이나 변수에 항상 주석을 달아라. 한달 후엔 당신 자신도 그 주석의 도움이 필요할 것이다: 

int x = 100; 

int y = 1000; 

 

if(x < y) 

    a = 0; 

else 

    a = 1;

 

 

 

 

이 프로그램이 무엇을 하고 있는지 알 수 있겠는가? 변수 x, y와 a가 무엇을 뜻하는 지 모른다면 알기 어렵다. 이 프로그램에 주석을 달아 보자:

/* 

* 이익과 손실을 체크하는 프로그램: 

*/ 

 

int x = 100; 

/* x 는 책을 팔아 얻은 돈의 총 량 */ 

int y = 1000 

/* y 는 책을 만드는 데 든 비용 */ 

int a; 

/* 이익인지 손실인지 확인 */ 

 

/* x가 y보다 작은지 체크: */ 

if(x < y) 

/* 손실. 숫자 1이 손실을 나타내기로 함 */ 

    a = 1; 

else 

/* 이익. 숫자 0가 이익을 나타내기로 함 */ 

    a = 0;

 

 

 

 

이렇게 주석을 달면 C 언어를 모르는 사람도 이 프로그램을 쉽게 알 수 있다. 각 문장이 무엇을 수행하는지, 각 변수들이 무엇을 나타내는지 알 수 있다. 주석을 다는 것은 좋은 습관이다. 하지만 그렇다고 "무작정" 주석을 달라는 것은 아니다. 어떤 부분을 이해하기 쉽도록 하자는 것이지 "모든 부분에" "장황한 이야기를 늘어놓자"는게 아니다. 

int profit = 1; 

/* 이익은 1과 같다 */ 

int loss = 0; 

/* 손실은 0과 같다 */ 

 

/* 만일 이익이 1과 같다면: */ 

if(profit == 1) 

    /* "이익이 났다!" 라고 프린트한다*/ 

    printf("We made a profit!\n"); 

/* 아니면: */ 

else 

    /* "손실이 났다!" 라고 프린트한다*/ 

    printf("We made a loss!\n");

 

 

 

 

이렇게 주석을 다는 것은 시간 낭비이다. 당연한 것을 "다시" 설명하고 있다. 변수를 선언하거나 변수에 값을 넣을 때가 주석이 가장 필요한 때이다. 각 변수가 무엇을 나타내는지, 각 변수에 무슨 일이 일어나는지, 프로그램이 무엇을 하는 것인지, 어떻게 그 일을 하는지 적어둘 필요가 있다. 각 함수와 메소드, 프로시저, 에러 코드가 무엇을 하는지도 주석을 달아 놓을 필요가 있다. 

 
7. 이름을 제대로 단다.

 

변수, 함수, 메소드, 프로시저, 유니언, 구조체(structure), 클래스의 이름만 보아도 무엇을 하는 것인지 금방 알 수 있도록 이름을 지어라. 변수 이름을 "x", "y", "z"로 정하는 습관은 좋지 않다는 것이다. 필자도 위에서 "x", "y", "z"로 변수 이름을 쓰지 않았냐고 항의할지도 모르겠다. 그러나 필자가 한 글자 변수를 썼던 이유는 어떤 프로그램에 속하지 않은 "단순" 예제였기 때문이다. 필자가 실제 프로그램을 작성할 때는 당연히 의미 있는 이름을 사용한다. 자, 다음의 코드를 살펴 보자: 

void x(int a, int b) 


    int z; 

    z = a + b; 

    printf("z is %d\n", z); 


 

 

 

 

여기서 우리는 프로시저 x가 무슨 일을 하는지는 알 수 있지만, 무엇을 의미하는지는 모른다. 또한 a, b, z가 무언지도 모른다. 이제 약간 수정해 보자: 

void sum_of_ages(int jacks_age, int jills_age) 


    int total_age; 

    total_age = jacks_age + jills_age; 

    print("total_age is %d\n", total_age); 


 

 

 

 

주석은 하나도 없지만 이름만 보면 무엇을 하려는지 쉽게 알 수 있다. 이름을 잘 지으면 주석을 달지 않아도 된다. 

 
  

 준비한 만큼만 넣는다 - 버퍼(Buffer) 확인 하기 

 

미리 정해놓은 배열이나 변수의 크기를 항상 확인해야 한다. 잘못하면 저장되는 데이터가 뒤섞이거나 심하면 시스템에 문제를 일으킬 수 있다. 사용자로부터 입력을 받는 C 프로그램을 보자: 

char city[10]; 

/* 도시 이름을 담는 배열 */ 

 

printf("Enter a city name: "); 

scanf("%s", city); 

printf("City is %s\n", city);

 

 

 

여기서는 도시 이름을 영어 아홉 글자로 가정하고 있다(열번째 글자는 null문자’\0’이다). 사용자가 아홉 글자 이상의 도시 이름을 입력하면 어떤 일이 일어날까? 아무 일도 없거나, 프로그램이 실패하거나, 또는 버퍼 안에 있는 데이터를 겹쳐 쓸 수도 있다. 어떤 경우든, 위험을 무릅쓰는 무모한 일을 하지 말아라. 입력되는 문자의 길이를 점검하도록 하자: 

char city[10]; 

/* 도시 이름을 담는 배열 */ 

 

printf("Enter a city name: "); 

fgets(city, sizeof(city), stdin); 

printf("City is %s\n", city);

 

 

 

 

수정된 코드에서는 사용자가 버퍼 크기보다 큰 문자열을 입력한다면, 버퍼가 담을 수 있는 만큼만 받아 들이고 나머지는 잘라 버린다. 

 

 
  

9. 사용자를 절대 믿지 않는다. 
 

이것은 중요한 법칙이다. 당신의 프로그램을 이용할 사람들을 믿지 말라. 사용자들이 당신이 원하는 방식대로만 사용할 것이라는 안일한 생각을 버려야 한다. 오히려 프로그램의 문제점을 찾기에 열심인 사람들로 생각하고 철저히 대비해야 한다. 예를 들면, 위에서는 도시 이름을 더 길게 입력할 사용자에 대비하여 문자열의 길이를 확인했다. 

 

C언어처럼 데이터 타입(Type)을 명시하도록 요구하는 언어를 사용할 때는 사용자 입력으로 들어 오는 데이터 타입과 프로그램에서 사용하는 데이터 타입을 확인해야만 한다. 그렇지 않으면, 문제가 생길 수 있다. 디버거(Debugger)가 있다면 프로그램이 실행될 때 어떤 일이 일어나는지, 예를 들면 변수들에게 어떤 일이 일어나는지 모니터하라. 에러 체크하는 데에는 많은 시간이 들지만, 그만큼 더 좋은 프로그램을 만들 수 있다.

저작자 표시 비영리 변경 금지

#include <iostream>
#include <string>

using namespace std;

class Profile
{
public:
void printProfile()
{
cout << "Name : " << _name.c_str() << endl;
cout << "Phone Number : " << _phoneNumber.c_str() <<endl;
}

void setName(string name)
{
_name = name;
}

void setPhoneNumber(string phoneNumber)
{
_phoneNumber = phoneNumber;
}

private:
string _name;
string _phoneNumber;
};

int main()
{
Profile myProfile;

myProfile.setName("신재호");
myProfile.setPhoneNumber("010-9880-9562");
myProfile.printProfile();

return 0;
}

저작자 표시 비영리 변경 금지