하드코딩을 피하기! (상수 사용, StringBuilder 사용)

2022. 3. 30. 17:41Back-end/Spring

반응형
하드코딩이란?

프로그램의 소스코드에 데이터를 직접 입력해서 저장하는 것.

주로 파일 경로, URL 또는 IP 주소, 비밀번호, 화면에 출력될 문자열 등이 대상이 된다.

 

하드코딩의 문제점
  1. 의미를 파악하기 어렵다.  
public Car(int position) {
    this("orange", position);
}

public Car(String name) {
    this(name, 0);
}

   2. 유지 보수하기 어렵다.

/* 월 원금을 구하는 메서드 */
public static double calculateMonthlyPrincipal(int principal) {
    return principal / 12;
}

/* 월 이자를 구하는 메서드 */
public static double calculateMonthlyInterest(int principal) {
    return principal * 0.1 / 12;
}
...

 

해결방법 : 상수를 활용한다.
private static final int INSTALLMENT_MONTHS = 12;
private static final double INTEREST_RATE = 0.1;

/* 월 원금을 구하는 메서드 */
public double calculateMonthlyPrincipal() {
    return this.principal / INSTALLMENT_MONTHS;
}

/* 월 이자를 구하는 메서드 */
public double calculateMonthlyInterest() {
    return this.principal * INTEREST_RATE / INSTALLMENT_MONTHS;
}

 

결론

의미가 명확한 코드, 가독성 좋은 코드, 유지 보수하기 좋은 코드를 작성하기 위해
하드코딩을 하기보다는 상수를 활용하자.

하지만, 이 글에서 다룬 하드코딩의 문제점 외에도 보안에 취약한 문제점 등
여러 가지 해석에 의한 다양한 문제점들이 존재한다.

또, 상수를 활용하는 방법 외에도 연관된 상수를 ENUM으로 관리하거나 외부에 데이터를 저장하는 등
하드코딩을 피하는 여러 가지 방법이 존재한다.

하드코딩이 무조건 안좋다는 것은 아니다.
하나의 예시로 원주율인 3.141592…는 값이 변경될 일이 없고 매직 넘버로 사용해도 의미가 명확하다.

하드코딩의 정확한 기준, 하드코딩의 문제점, 하드코딩을 피해야 하는지에 대한 100% 정답은 없다.

현재 소스 코드에서 어느 방법이 최선의 방법인지 항상 고민하는 습관을 지니자.

https://tecoble.techcourse.co.kr/post/2020-05-07-avoid-hard-coding/

 

하드코딩을 피해라.

tecoble.techcourse.co.kr

 


내 퀴즈쪽 코드를 보면 +연산자를 사용한 하드코딩으로 되어있어서 성능개선을 위해 StringBuilder를 사용해보려한다.

String question = a+b+c+d+"?";

+연산자를 사용하면 메모리에 a를 저장하고, b를 저장하고, 새로운 a+b를 또 저장하고 하기 때문에 성능적으로 좋지 않다고 한다. StringBuilder는 더할 때 새로운 객체를 생성하지 않고 기존 데이터에 더하는 방식을 사용하여 속도도 빠르고 상대적으로 부하가 적다고 한다. 그럼 당연히 써야겠지?

ArrayList<String> questionList = new ArrayList<String>();
questionList.add("ㄱ");
questionList.add("ㄴ");
questionList.add("ㄷ");
questionList.add("ㅁ");
// questionList에서 랜덤으로 문제 가져오기
int num1 = random.nextInt(questionList.size());
int num2 = random.nextInt(questionList.size());
int num3 = random.nextInt(questionList.size());
int num4 = random.nextInt(questionList.size());
String a = questionList.get(num1);
String b = questionList.get(num2);
String c = questionList.get(num3);
String d = questionList.get(num4);
String e = "?";

StringBuilder sb = new StringBuilder();
sb.append(a).append(b).append(c).append(d).append(e);

String question = sb.toString();

.append() 로 계속 추가해서 붙이면 된다. 

그리고 toString(); 을 해주면 된다.

 

https://hardlearner.tistory.com/288

 

자바 StringBuilder 사용법 및 사용하는 이유

StringBuilder 사용법 및 사용하는 이유 자바에서 문자열하면 자연스럽게 String이 떠오른다. String은 소위 불변(immutable)객체라고 한다. String str1 = "abc"; , String str2 = "def"; 2개의 String객체가 있..

hardlearner.tistory.com

 

반응형