• 카테고리
    • 전체 글

    • 카테고리1
    • 카테고리2
    • 카테고리3
    • 카테고리4
  • 태그
  • 방명록

코드 정리 001 in C#

기술자료/.NET 2012. 5. 18. 18:31

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

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


        
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
블로그 이미지

하인도1

[하인드/하인도/인도짱 의 홈페이지] 저만의 공간입니다. 다양한 소재들을 나열하는 아주 단순 무식한 홈페이지 입니다. 다양한 문서 자료도 있겠지만, 저의 푸념들도 있답니다.

250x250

블로그 내에 소스 코드 삽입 이사온 기념 스킨도... RSS 전문 기능 비활성화 관련. 스킨 바꾸어 보았습니다. 서버 파일 정리 좀 했습니다.

«   2025/06   »
일 월 화 수 목 금 토
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

2010 twi2me me2dayzm 것 me2sms 인터파크 Visual Studio Buscuit moss 협업 매뉴얼 MOSS 2007 비스킷 개발환경 친구 블로그 windows Azure 좀 Tutorial 수 SharePoint 지름신 Google Apps Engine e-book me2photo WSS java 불만 오류

  • Total :
  • Today :
  • Yesterday :

Copyright © 2015-2025 Socialdev. All Rights Reserved.

Copyright © 2015-2025 Socialdev. All Rights Reserved.

티스토리툴바