티스토리 뷰

Computer Science/Etc

하드코딩이란?

감성적인 개발자 2022. 6. 30. 00:54

개발을 하다 보면 날코딩, 하드코딩이란 단어를 자주 접하게 된다. 어감에서부터 좋은 코드를 부르는 것은 아니란 걸 알았지만 정확한 의미를 정의하지 않고 그런가 보다 하며 쓰고 있었는데 문득 정확한 의미를 알고 싶었다.

 

하드코딩되었다는 것은 상수나 변수에 들어가는 값(데이터)을 코드에 직접 입력해 프로그램이 동작할 때를 말한다. 코드에 데이터가 입력되어있다는 것은 곧 값이 고정되어있단 것을 의미한다.

 

문제1)  확장성 및 유연성

#include<iostream>

using namespace std;

//하드코딩
string hc(string s){
  return "Hello World";
}
//소프트코딩
string sc(string s){
  return s;
}

int main(){
  cout << hc("doSomething") << endl;
  cout << hc("hardCoding") << endl;
  
  cout << sc("doSomething") << endl;
  cout << sc("softCoding") << endl;
}

 

위와 같이 두 가지 방식으로 스트링 반환 함수를 구현했을 때 하드코딩된 hc(string s)함수는 외부의 입력 값이 변해도 항상 고정된  값을 반환한다. sc(string s) 함수는 입력받는 인자에 따라 다른 값을 출력하는데, 이러한 방식을 하드코딩의 반대 의미로 소프트 코딩이라고 한다.

 

하드코딩을 하게 되면 테스트 시 동작을 바로 확인할 수 있다는 장점이 있지만, 확장성과 유연성을 가지지 못해 코드 변경 시 오류가 발생활 확률이 높다. 또한 아이디, 비밀번호 등이 하드코딩된 경우 비밀번호 유출의 위험성도 있다.

 

 

하드코딩이 가능한 데이터

사실상 상수인 값 (24시간, 60분, 60초, 1주일, 원주율) 들의 경우 변수나 상수로 선언하지 않고 하드코딩을해도 큰 문제가 없다.

 

아래의 코드는 반복문에 변수 또는 상수를 사용하지 않고, 12라는 데이터를 직접 넣어 반복 횟수를 지정하여 하드코딩되었지만 12라는 데이터는 1년 중 12 개월을 뜻하기 때문에 수정할 이유가 없다. 

int main(){
  for(int i = 0; i < 12; i++){
    cout << "12월 만큼 동작 수행" << endl;
  }
}

 

문제2)  프로그램 수정의 용이성

하드코딩은 프로그램 수정 시 문제를 발생시키기도 한다. 아래와 같이 12라는 데이터의 의미가 다양하게 사용되었을 때, 코드를 수정하게 되면 혼란을 겪을 수 있다. 

 

예를 들어, 화면에 버튼이 13개로 변경된다면 해당 반복문을 찾아 조건을 변경해줘야하는데, 수정할 반복문을 찾기도 번거롭고 12라는 데이터를 변경할 때마다 어떤 용도의 12인지 판단해주어야 하기 때문에 손이 많이 간다.

int main(){
  //1
  for(int i = 0; i < 12; i++){
    cout << "12월 만큼 동작 수행" << endl;
  }
  //2
  for(int i = 0; i < 12; i++){
    cout << "12개의 데이터 결과에 대한 동작 수행" << endl;
  }
  //3
  for(int i = 0; i < 12; i++){
    cout << "12개의 화면 버튼에 대한 동작 수행" << endl;
  }
  //1
  for(int i = 0; i < 12; i++){
    cout << "12월 만큼 동작 수행" << endl;
  }
  //2
  for(int i = 0; i < 12; i++){
    cout << "12개의 데이터 결과에 대한 동작 수행" << endl;
  }
  //3
  for(int i = 0; i < 12; i++){
    cout << "12개의 화면 버튼에 대한 동작 수행" << endl;
  }  
}

 

변수를 선언해 반복 조건으로 걸어준다면 가독성 뿐만아니라 및 수정 시 용이성 또한 챙길 수 있다. 

int main(){
  int monthsInYear = 12;
  int dataResultCount = 12;
  int buttonCount = 12
  
  for(int i = 0; i < monthsInYear; i++){
    cout << "12월 만큼 동작 수행" << endl;
  }

  for(int i = 0; i < dataResultCount; i++){
    cout << "12개의 데이터 결과에 대한 동작 수행" << endl;
  }
  
  for(int i = 0; i < buttonCount; i++){
    cout << "12개의 화면 버튼에 대한 동작 수행" << endl;
  }
  
  for(int i = 0; i < monthsInYear; i++){
    cout << "12월 만큼 동작 수행" << endl;
  }

  for(int i = 0; i < dataResultCount; i++){
    cout << "12개의 데이터 결과에 대한 동작 수행" << endl;
  }
  
  for(int i = 0; i < buttonCount; i++){
    cout << "12개의 화면 버튼에 대한 동작 수행" << endl;
  }
}

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함