자 이번강좌에서는 프로그래머의 악!
절대 해서는 안될 행동인 하드코딩에 대해 설명하겠습니다.
하드코딩이란 우리가 작성하는 코드 자체에
값을 박제해버리는 코드를 말합니다
예를들자면 아래같은 코드죠
#include <stdio.h>
int main()
{
int arr[10];
for (int i = 0; i < 10; i++)
{
arr[i] = 0;
}
for (int i = 0; i < 10; i++)
{
printf("%d", arr[i]);
}
for (int i = 0; i < 10; i++)
{
arr[i] = 1;
}
for (int i = 0; i < 10; i++)
{
printf("%d", arr[i]);
}
}
어라 이건 맞는 코드 아닌가요? 지금까지 잭클님이 강좌 올리실때도 이렇게 하신것같은데..
맞습니다. 틀린 코드는 아니죠, 다만 저는 여러분의 이해를 쉽게 하기 위해서 프로그래밍의 악
'하드코딩'을 한 것입니다. 이게 왜 잘못된걸까요?
왜 하지말란걸까요?
자 위에코드를 일단 한줄 한줄 해석해보면
길이가 10인 배열 arr을 하나 만들고
arr의 요소를 전부 0으로 바꾸고
arr의 요소를 전부 화면에 출력하고
다시 arr의 요소를 전부 1로 바꾸고
arr의 요소를 전부 화면에 출력하는 코드입니다
자 근데 만약에 우리가 배열 arr의 길이를 바꿔야할것같다고 칩시다
배열의 길이가 10개면 충분할것같다고 생각됐었는데
갑자기 생각해보니 안될것같아서 100으로 늘려야해요
그럼 arr[10]을 arr[100]으로 바꿔주고
for문에 있는 조건식에 i < 10도 전부 i < 100으로 바꿔줘야겠죠?
지금 저렇게 간단한 코드만 가지고도 벌써 수정해야할곳이 5곳이 생겨버립니다
근데 만약에 실제로 내가 회사에다니면서 규모가 큰 프로젝트를 진행하는데
저런식으로 프로그래밍 해놨다가 수정사항이 생겼습니다
수정할곳이 1000곳 이상 생길텐데 감당할수 있을까요?
그래서 "프로그래밍의 악"인 하드코딩인겁니다.
그럼 저 코드를 어떻게 수정할수있을까요?
우선 첫번째 방법으로는 define이 있습니다.
이 define을 이번 강좌에서 배워보도록 하죠.
define이란 우리가 쓰는 함수 같은게 아닙니다.
컴파일러 명령입니다.
아래 코드를 보시죠
#include <stdio.h>
#define ARRAY_LENGTH 100
int main()
{
int arr[ARRAY_LENGTH];
for (int i = 0; i < ARRAY_LENGTH; i++)
{
arr[i] = 0;
}
for (int i = 0; i < ARRAY_LENGTH; i++)
{
printf("%d", arr[i]);
}
for (int i = 0; i < ARRAY_LENGTH; i++)
{
arr[i] = 1;
}
for (int i = 0; i < ARRAY_LENGTH; i++)
{
printf("%d", arr[i]);
}
}
우선 define을 쓰는법은 위와같이
#define 규칙이름 값 |
이렇게 사용하시면 됩니다
define을 설명하자면 제가 앞써 define은 컴파일 명령이다 라고 말했습니다.
제 블로그에 주석에 대한 글을 보셨나요?
주석은 컴파일과정에서 모두 제거된 후 프로그램이 만들어진다고 했습니다.
그러나 define은 컴파일 과정에서 규칙이름을 모두 값으로 대체하고 컴파일 됩니다.
위처럼 #define ARRAY_LENGTH 100 이라는 규칙을 만들어 놓았다면
컴파일 과정에서 모든 ARRAY_LENGTH라는 문구는 100으로 대체 된 후 컴파일된다고 보시면 됩니다.
저렇게 해놓으면 만약에 배열의 길이를 100에서 50으로 바꿀때도
#define ARRAY_LENGTH 100을
#define ARRAY_LENGTH 50으로 바꿔주면 한번만 바꾸고도
다른 코드를 수정할 필요가없겠네요!
자 그럼 하드코딩을 피하는 방법 첫번째 define에 대해 배워보았구요
다음시간에는 sizeof함수와 배열의 길이를 구하는법을 알아보겠습니다!
수고하셨습니다!
'C' 카테고리의 다른 글
([C언어] 14강) 함수의 생성과 반환값 (0) | 2019.06.27 |
---|---|
([C언어] 13강) sizeof연산자로 배열 길이 구하기 (0) | 2019.06.27 |
([C언어] 11강) 2차원 배열 (0) | 2019.06.27 |
([C언어] 10강) 배열 (0) | 2019.06.26 |
([C언어] 9강) while문과 do-while문 (0) | 2019.06.26 |