과연 어떤 코드가 좋을까? 이 문제는 프로그래머들의 스타일과 성격에 따라 무척 다르다.

일단 내 기준으로 보았을 때 다음과 같은 코드가 있으면 일단 뜯고 싶어진다.


        
char[] array4 = new char[]            
{             
         '<'
};
text17 = text17.TrimEnd(array4);
string[] array5 = text17.Split(array4, StringSplitOptions.RemoveEmptyEntries);
text17 = "";
for (int num24 = 0; num24 < array5.Length; num24++) 
{
       if (text17 == "")
       { 
               text17 = array5[num24];
       }
       else
      { 
              text17 = text17 + "." + array5[num24];  
       }
}

변수 명은 일단 넘어가자. Visual Studio를 쓰고 있다면 간단하게 이름을 바꿔줄 수 있으니까..

일단 저 프로그램의 목적은 ‘>’ 가 들어간 문자열 내에 문자들을 나누어서 최종적으로 “.” 로 연결된 문장을 만들고 싶은 것이다.

예를 들면 아래와 같다.

ABC1>2222>>222334>5>66666666>>>>>>>>>  

ABC1.2222.222334.5.66666666

로 바꿔주는 프로그램인 것이다.

 

위의 코드가  어떤 부분이 내 기준에 부합되지 않는지를 설명하려고 한다.

1. String “+” 연산자.

C# 중급 정도 하다보면, 문자열의 “+” 연산자의 낭비를 잘 알 수 있다. 즉 문자열을 단순히 한 두번 연결하는 레벨이라면 “+” 를 써서 연결은 하겠지만, 반복문 안에서 문자열 더하기는 확실히 좋지 않다.

만일 위의 예제로 본다면, 아래와 같은 문자열들이 나오게 된다.

ABC1  /  2222  /  222334  /  5  / 66666666

5개 정도의 문자열이 나오는데, 순서대로 더하게 되면 어떻게 될까?

메모리 상에서 더하는 과정을 순서대로 나열해 보겠다.

  1. ABC1, 2222, ABC12222   ( ABC1, 2222 은 언젠가 지워진다.. 언젠가..)
  2. ABC1(?), 2222(?), ABC12222 , 222334, ABC12222222334 ( 마찬가지로 ABC1 부터 222334까지의 문자열은 언제가 지워진다 –_-; )
  3. ABC1(?), 2222(?), ABC12222(?) , 222334(?), ABC12222222334, 5 ,ABC122222223345 ( ...... )
  4. ABC1(?), 2222(?), ABC12222(?) , 222334(?), ABC12222222334(?), 5(?) ,ABC122222223345,  66666666 , ABC12222222334566666666( ...... )

총 네번의 단계 동안 언젠가 지워져 줘야할 문자열의 갯수는 이미 상상을 초월한다.

“+” 연산자를 할 때, 특정 공간에 쭉 채워가듯 더하는 것이 아니라, 항상 문자열 공간을 새로 만들어 더하기를 하는 것이다. 저건 5 단계 정도니 저 정도 지만, 문자열의 길이가 길어지거나, 반복 횟수가 많아지기 시작하면, 언젠가 지워져야 할 문자열이 지워지기를 기다려야 될지도 모른다.

해결책은 여러가지가 있겠지만, C# 유저라면, StringBuilder를 추천한다. 사용방법은 간단하다.

StringBudiler sbReuslt = new StringBuilder();

sbResult.Append(“ABC1”);

sbResult.Append(“2222”);

sbResult.Append(“222334”);

sbResult.Append(“5”);

sbResult.Append(“66666666”);

sbResult.ToString();

매번 더해진 결과는 한 공간에 넣어서 계속 관리한다. 그 방법을 StringBuilder 가 해결해준다.

 

2. else 문과 string 비교.

저 프로그램이 정말 하고 싶어하는 것이 무엇이길래 저런 방식으로 짠걸까?
한번 생각해보았다. 그러니까, 다음 세 가지의 조건이 나온다.

1. 문자열을 더할 때 그 사이에 “.” 를 넣는다.

2. 맨 마지막 문자열을 더할 때 “.”  가 붙지 않는다.

3. 최초 문자열을 더할 때, 맨 앞에 “.” 가 붙지 않는다.

2번과 3번은 로직을 짤 때 2번을 택해도 되고, 3번을 택해도 된다. 그 이유는 문자열을 더한 뒤, 더 이상 붙여야 될 문자열이 없을 때 “.” 를 안붙이는 로직을 만들거나, 최초 문자열을 더할 때 앞쪽에 “.”를 붙이지 않고, 나머지 경우에 “.” 를 붙이는 방식이다.  처리 방법에 따라, 2번 조건 3번 조건을 쓸 수 있다.

자 저 위의 로직을 보자. 위의 조건 중 1번과 2+3 번의 형태를 만들었다.

즉 반복문 최초에는 그냥 문자열을 대입한 뒤, 다음 반복 부터는

이전 문자열 + “.” + 붙일 문자열

이런 식으로 짰다. 앞서 이야기 한대로 String 의 “+”는 안쓰는게 백번 낫다고 했다.
그렇다면 StringBuilder로 재 구성한다고 할 때, 최소한 저 방식대로 한다면, 매번 뒤에서는 Append를 두 번해야 한다.

sbResult.Append(“.”);

sbResult.Append(array[num24]);

코드가.. 아주 그냥...

더욱이 if 문을 보면, 문자열 비교를 한다. text17 == “”

개인적으로 숫자 비교는 용서하지만 문자열 비교는 가급적 피하고 싶다라는 개인적인 생각이다. 컴퓨터가 숫자에 대한 비교는 빠르지만, 문자열에 대한 비교는 문자열 갯수에 비례하도록 차이가 크게 발생된다. 그래서 꼭 필요한 경우가 아니라면 문자열 비교는 피하는게 좋다. ( 뭐 요즘 컴퓨터 사양은 무지하게 좋기 때문에, 무시되기도 하지만...)

또, for 문의 경우 index라는 개념이 있어서, 코드를 뭔가 알흠답지 않게 만든다. ( 100% 개인 취향 )

 

자 이것을 어떻게 수정할까?

먼저 최초 문자열일 때는 어떻게 판단하고, 어떻게 행동할까?

최종 무엇을 더하도록 할까?

 

결론부터 내자면 개인적으로는 위의 코드가 아래와 같이 만들어지길 원한다.

 

결론

StringBuilder 만 빼면, 나머진 개인 취향이다.
"어디를 향하든 서울만 가면 된다는” 말이 있듯이 사실 결과만 잘 나오면 된다. 어떻게 짜든 개인 취향이라는 것.
하지만, 최소한 나중에 유지보수를 해야 한다고 생각한다면, 간결하고, 단순하게 짜는게 더 낫지 않을까?

처음부터 저런 코드가 툭툭 떨어지진 않는다. 그래서 저렇게 코드가 안 나온다고 고민할 필요까진 없다. 다만, 시간이 될 때, 자신이 짠 코드를 뒤돌아 보면서 Refactoring을 하면서 정리해 보았으면 좋겠다.

728x90

+ Recent posts