오늘은 어디로 갈까...

문자열(String) 0x00 본문

낙서

문자열(String) 0x00

剛宇 2009. 2. 18. 17:06

1. 자바 프로젝트 만들기
  - New -> JavaProject를 실행해서 자바프로젝트를 생성한다.
  - Project 명을 여기서는 kr.kangwoo.util이라고 하겠다.
  - JDK 1.5를 사용하겠다.

2. 테스트 소스 폴더 추가
  - 기본값을 생성했다면 src 란 소스 폴더가 만들어져있는데, 테스트를 위해 test란 소스 폴더를 하나 더 추가하겠다.
  - 해당 프로젝트를 선택한후 마우스 우클릭한 다음 Prperties를 실행하면 속성창이 나온다.
  - 여기서 Java Build Path를 선택한후 Source 탭에서 Add Folder를 클릭한다.
  - 아래와 같은 창이 뜨면, Create New Folder를 클릭후 test 폴더를 생성한다.

장상적으로 생성되었다면, 아래 그림처럼 보일것이다.

3. StringUtils 클래스 생성하기
  - src란 이름의 소스폴더 아래에 StringUtils 클래스를 만들자.
  - 클래스가 생성되었다면 isBlank(String)란 간단한 메소드를 만들어보도록 하자.
  - 이 메소드는 문자열(String)의 좌우 여백문자(white space)를 제거한후, 공백("")이거나  null인지 검사한는 메소드이다.
package kr.kangwoo.util;

public class StringUtils {

	/**
	 * <p>문자열(String)의 좌우 여백문자(white space)를 제거한후, 공백("")이거나 <code>null</code>인지 검사한다.</p>
	 * 
	 * @param str 문자열
	 * @return
	 */
	public static boolean isBlank(String str) {
		return false;
	}

}

  - 일단 로직 구현은 나중에 하고 발생할 수 있는 경우의 수에 대해서 생각해보자. 크게 5가지 경우를 생각했는데, 주석에 추가하자.
	/**
	 * <p>문자열(String)의 좌우 여백문자(white space)를 제거한후, 공백("")이거나 <code>null</code>인지 검사한다.</p>
	 * 
	 * <pre>	
	 * StringUtils.isBlank(null)    = true
	 * StringUtils.isBlank("")      = true
	 * StringUtils.isBlank("   ")   = true
	 * StringUtils.isBlank("han")   = false
	 * StringUtils.isBlank(" han ") = false
	 * </pre> 
	 * 
	 * @param str 문자열
	 * @return
	 */
	public static boolean isBlank(String str) {
		return false;
	}

4. Test Case 만들기
  - 테스트 케이스를 만들어보도록 하자.
  - 이 부분은 무시하고 넘어가도 되지만, 이런 방식으로 개발하면 나중에 많은 시행착오를 줄일 수 있다.
  - New -> JUnit Test Case를 실행해서 테스트 케이스를 만들자
  - JUnit 3.x와 JUnit 4.x를 선택할 수 있는데, 여기서는 JUnit 4.x을 선택하도록 하겠다.
  - 처음 테스트 케이스를 만들 경우는 아래처럼 JUnit 라이브러를 빌드 패스에 추가할건지 물어본다.(당연 추가해야한다.)
  - 3.x에서는 TestCase 클래스를 상속받고, 테스트할 메소드는 반드시 testXxx()로 생성해야했지만, 4.x에서는 @Test 어노테이션(Annontation)만 달아주면 그 메소드가 테스트 대상이 된다. 한마디로 4.x는 어노테이션으로 움직인다고 보면 된다.
  - 기본값으로 생성하면 아래와 같은 코드가 만들어 졌을 것이다.
package kr.kangwoo.util;


import org.junit.After;
import org.junit.Before;

public class StringUtilsTests {

	@Before
	public void setUp() throws Exception {
	}

	@After
	public void tearDown() throws Exception {
	}
}
  - setUp(), tearDown() 부분은 현재로서는 의미가 없는 부분이기는 하지만 그냥 놔두겠다.
    (잘보면 두 메소드 위에 @Before, @After 어노테이션이 붙어 있다.)
  - 자, 그럼 isBlank(String) 메소드를 만들어 보도록 하자.
package kr.kangwoo.util;


import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

public class StringUtilsTests {

	@Before
	public void setUp() throws Exception {
	}

	@After
	public void tearDown() throws Exception {
	}
	
	@Test
	public void isBlank() {
		Assert.assertEquals(StringUtils.isBlank(null), true);
		Assert.assertEquals(StringUtils.isBlank(""), true);
		Assert.assertEquals(StringUtils.isBlank("   "), true);
		Assert.assertEquals(StringUtils.isBlank("han"), false);
		Assert.assertEquals(StringUtils.isBlank(" han "), false);
	}
}

  - 실행(Run As -> JUnit Test)보면 아래와 같은 화면이 나온다. 즉, 테스트를 실패했다는 것이다.
  - 현재는 무조건 false를 리턴하기에, Assert.assertEquals(StringUtils.isBlank(null), true); 이부분에서 바로 실패를 하는것이다.

 
5. StringUtils.isBlank(String) 구현하기
  - 자, 이제 중요한 로직을 구현해보도록하자.
	public static boolean isBlank(String str) {
		if (str == null) {
			return true;
		}
		return str.trim().equals("");
	}
  - 다시 테스트 케이스를 실행해보자. 성공이라고 나올것이다.

  - 위에처럼 구현해도 전혀 문제가 없지만, 코드를 조금 수정해서 어렵게(?) 보이도록 해보자.
	public static boolean isBlank(String str) {
		if (str == null) {
			return true;
		}
		int strLen = str.length();
		if (strLen > 0) {
			for (int i = 0; i < strLen; i++) {
				if (Character.isWhitespace(str.charAt(i)) == false) {
					return false;
				}
			}
		}
		return false;
	}

  - 최적화(?)란 미명아래에 위처럼 변경을 해보았다. 사실 어느것이 더 좋은가는 상황에 따라 달라질 수 있을것이다. 사람의 입장에서 보면, 첫번째꺼는 아주 직관적이다. 두번째꺼는 비비~꼬아놔서 유심히 봐야 뭔지 이해가 갈것이다. 성능의 입장에서 보면 두번째께 아마(Maybe~~) 조금 더 빠를거 같다. 프로그래밍에 정답은 없는 것 같다. 단지.... 취향~~~~~? ^^;

6. 나머지 필요한 메소드도 각자 구현해 보도록 하자. 필자가 자주 쓰는것을 첨부하겠으니 참고하길 바란다. 단, 대충 만들었으니 꼭 검증해보도록.