아이템 62. 다른 타입이 적절하다면 문자열 사용을 피하라. - ksw6169/effective-java GitHub Wiki
문자열을 쓰지 말아야 하는 경우
1. 문자열은 다른 값 타입을 대신하기에 적합하지 않다.
- 입력 데이터가 진짜 문자열일 때만 String 타입을 사용해야 한다.
- 만약 받은 데이터가 수치형이라면 int, float, BigInteger 등 적당한 수치 타입으로 변환해야 한다.
- '예/아니오' 질문의 답이라면 적절한 열거 타입이나 boolean으로 변환해야 한다.
- 기본 타입이든 참조 타입이든 적절한 값 타입이 있다면 그것을 사용하고, 없다면 새로 하나 작성하라.
2. 문자열은 열거 타입을 대신하기에 적합하지 않다.
- 상수를 열거할 때는 문자열보다는 열거 타입이 월등히 낫다.
3. 문자열은 혼합 타입을 대신하기에 적합하지 않다.
- 여러 요소가 혼합된 데이터를 하나의 문자열로 표현하는 것은 대체로 좋지 않다.
- 다음은 혼합 데이터를 키로 사용하는 예제로 많은 단점을 내포하고 있다.
/**
* [혼합 데이터를 문자열로 사용하는 코드의 단점]
* 1. 구분자 '#' 이 두 요소 중 하나에서 쓰였다면 혼란스러운 결과를 초래한다.
* 2. 각 요소를 개별로 접근하려면 문자열을 파싱해야 해서 느리고, 귀찮고, 오류 가능성도 커진다.
* 3. 적절한 equals, toString, compareTo 메소드를 제공할 수 없으며, String이 제공하는 기능에만 의존해야 한다.
*/
String compoundKey = className + "#" + i.next();
4. 문자열은 권한(capacity)을 표현하기에 적합하지 않다.
- 권한(여기서는 '키' 를 의미한다.) 을 문자열로 표현하는 경우가 종종 있다.
- 예컨대 각 스레드가 자신만의 변수를 갖게 하는 기능을 만들기 위해 사용자가 제공하는 문자열 키로 스레드별 지역변수를 식별하게 하는 경우, 문자열 키는 고유할 수 없으므로 다른 사용자가 의도적으로 같은 키를 사용하여 다른 사용자의 값을 가져올 수도 있다.
- 이 경우에는 문자열 대신 위조할 수 없는 클래스의 객체를 별도로 만들어 각 스레드별로 고유한 키를 사용할 수 있게끔 하는 것이 좋다. (객체는 고유하므로 문자열처럼 다른 사용자가 의도적을로 같은 키를 사용할 수 없게 되기 때문이다.)
핵심 정리
- 더 적합한 데이터 타입이 있거나 새로 작성할 수 있다면 문자열을 쓰지 말자.
- 문자열은 잘못 사용하면 번거롭고, 덜 유연하고, 오류 가능성도 크다.
- 문자열을 잘못 사용하는 흔한 예로는 기본 타입, 열거 타입, 혼합 타입이 있다.
참고 자료