1. 내가 바라봤던 하드코딩, 앞으로 바라볼 하드코딩
저는 개발을 처음배울 때, 그러니까 고1때 주위에서 이런 말이 많이 들려왔어요.
"야. 하드코딩은 초짜나 하는 거야.", "자기 실력이 부족하니까 하드코딩으로 때우지 쯧쯧."
등등 하드 코딩에 대한 부정적인 이야기를 많이 듣고 자라왔습니다. 그래서 그 때 당시에 저는 '하드코딩은 절대로 하면 안되겠다.' 라고 생각했었죠.
하지만 시간이 조금 흐른 후 회사에 취직하고 다른 개발자분들과 이야기 하면서 하드코딩에 대한 존재를 다시 생각해보는 시간을 갖게 됬어요. ' 하드코딩이란 코드에 직접 값을 입력하는 것을 의미한다. ' 결국 주위에서 그렇게 하지말라고 했던 하드코딩은 필수적으로 해야만 했던 것이죠.
2. 하드코딩을 해야하는 이유
하드코딩을 해야하는 가장 큰 이유는 변수 선언과 초기화 때문입니다. 웹에서 사용되는 JS 같은 경우 변수를 선언했지만 초기화하지 않은 경우 자동적으로 undefined라는 값을 넣어서 괜찮을 지도 모릅니다. 하지만 C나 JAVA 같은 컴파일러 언어들은 어떨까? 이 언어들은 변수를 메모리에 적재한다. 근데 만약 선언만 해두고 초기화를 하지 않았다면..? 일단 제가 쓰고있는 IDE인 Visual Studio에서는 아예 빌드조차 불가능하게 막아두었습니다.
#include <stdio.h>
int main()
{
int x;
printf("%d",x);
return 0;
}
또한 C 컴파일러 웹사이트에서 위 코드와 동일한 코드로 컴파일링 했을 때 아래와 같이 출력된 것을 확인할 수 있습니다.
분명 x에는 아무것도 값이 저장되어있지 않은데 x를 출력하니 32765라는 이상한 값이 나오고 말았습니다.
아무튼 서론이 길었지만 이걸 단 번에 해결할 수 있는 방법이 두 가지 있습니다. 첫 번째는 변수 값에 0을 넣는거죠. 그럼 아무리 그 변수를 출력해도 저희는 이미 해당 변수를 0으로 초기화 했기 때문에 이상한 값이 들어가지 않습니다.
' 어? 그럼 문자나 문자열은요? ' 라고 생각드실 수 있습니다. 일단 C에서는 String이라는 변수 타입은 없습니다. 오직 char만이 있을 뿐, 그래서 char을 쓸 때 저는 0으로 초기화 합니다.
' 엥? char은 문잔데 어떻게 0으로 초기화가 되요? '라고 생각이 들겁니다만 이 이야기까지 하면 너무 길어지니 다음에 기회가 있으면 한 번 말해보도록 하겠습니다.
또한 최적화와 가독성에도 큰 도움이 됩니다.
런타임 혹은 컴파일러에서 계산하지 않고 바로 값을 넣다보니 최적화가 잘될 수 밖에 없습니다. 그리고 짧고 간단한 코드들은 루프를 돌리는 것보다 훨씬 더 보기 편해집니다.(하지만 반대로 복잡한 로직이면....)
이러한 장점만 보고 모든 코드를 하드코딩으로 작성하시는 분들은 없겠죠..?
3. 그래서 하드코딩은 해야 돼 말아야 돼?
하드코딩은 최적화에 도움이되고 가독성도 높아지지만 단점도 명확한 친구입니다. 많은 단점이 있겠지만 큰 단점이라면 보안과 유지보수겠네요. 하드코딩을 사용하면 가독성은 좋아집니다. 그대신 유지보수가 힘들어지죠. 코드를 분석할 시간은 줄어들지만 그만큼 수정해야될 요소는 미역이 물에 불어나듯이 불어날꺼에요. 특히 커다란 서비스를 운영한다면..? 어우.. 생각하기도 싫네요...
게다가 보안쪽에서도 위험도가 가장 높은 방식이 하드코딩이에요.
예를 하나 들어보겠습니다. 여러분들의 소중한 월급이 들어오는 통장 계좌번호와 계좌 비밀번호가 만약 하드코딩으로 은행앱에 있다면 어떻게 될까요? 만약 해커가 여러분의 핸드폰을 해킹해 은행앱을 뜯어보는 순간 여러분의 소중한 계좌번호와 비밀번호가 그대로 해커에게 노출되버리고 말아요. 그런 일이 일어나면 안되겠죠? 그래서 중요하고 보안 레벨이 높은 데이터는 절대 하드코딩을 해서는 안되요.
하지만 그다지 중요하지 않거나 간단한 로직과 데이터에는 하드코딩을 해도 상관은 없어요. 외부에 공개되도 상관없는 데이터, 아주 간단한 로직 등 오히려 하드코딩이 아닌 소프트 코딩으로 했다가는 집나가서 들어오고 있지 않던 편두통이 다시 찾아올꺼에요. 그리고 여러분들이 가지고 있는, 만들어나갈 로직과 데이터를 한 번 잘살피고 분리해보면 아마 한 눈에 보일꺼에요. 이 데이터가, 이 로직이 중요하고 유지보수가 중요한 것인지 아닌지 말이죠!
4. 마무리
오늘은 간단하게 하드코딩에 대한 이야기를 한 번 해봤어요. 과거에 저는 하드코딩에 대한 좋지 못한 인식이 있었지만 현장에서 직접 다른 개발자들과 이야기해보고 생각해보니 다양한 주제들에 다양한 관점들이 보이기 시작했습니다. 앞으로도 끝없이 성장하고 싶어요!
긴 글을 봐주셔서 감사합니다!!