반응형
이 포스팅에서 작성하는 내용은 EFFECTIVE JAVA(이펙티브자바) 에서 발췌하였습니다.
아이템 62. 다른 타입이 적절하다면 문자열 사용을 피하라
문자열
- 텍스트를 표현하도록 설계된 클래스
- 문자열은 워낙 많이 사용되고 잘 지원되어 의도하지 않은 용도로 쓰이는 경우도 있다.
문자열 사용 유의점
- 다른 값 타입을 대신하기에 적합하지 않다.
- 데이터가 수치형이라면, int/float 등 적당한 수치 타입으로 변환해야 하고,
- 예/아니오와 같은 데이터라면, boolean으로 변환해야 한다.
- 열거 타입을 대신하기에 적합하지 않다.
- 아이템 34에서 다룬 내용처럼, 상수를 열거할 때에는 문자열보다 열거 타입이 훨씬 좋다.
- 혼한 타입을 대신하기에 적합하지 않다.
- 여러 요소가 혼합된 데이터를 하나의 문자열로 표현하는 것은 대체로 좋지 않다.
- 권한을 표현하기에 적합하지 않다.
ex 1) 혼합 타입을 문자열로 처리한 부적절한 예제
String compoundKey = className + "#" + i.next();
- 만약, className이나 i.next()에 문자 #이 들어간다면 혼란스러운 결과를 초래한다.
- 이런 경우에는, 차라리 전용 클래스를 새로 만드는 편이 낫다.
ex 2) 문자열을 사용해 권한을 구분한 부적절한 예제
public class ThreadLocal {
//객체 생성 불가
private ThreadLocal() {
}
// 현 스레드의 값을 키로 구분해 저장
public static void set(String key, Object value) {
}
//키가 가르키는 현 스레드의 값을 반환한다.
public static Object get(String key);
}
- 이 방식이 의도대로 동작하려면 각 클라이언트가 고유한 키를 제공해야 하지만, 만약 두 클라이언트가 의도치 않게 같은 키를 사용하게 된다면 같은 변수를 공유하게 된다.
- 이런 상황이 발생하는 경우, 제대로 기능하지 못하며 보안에도 취약할 것이다.
ex 3) ex 2의 예를 Key 클래스로 권한을 구분한 예제
public class ThreadLocal {
//객체 생성 불가
private ThreadLocal() {
}
//권한
public static class Key{
Key() { }
}
// 위조 불가능한 고유키를 생성
public static Key getKey(){
return new Key();
}
public static void set(Key key, Object value);
public static Object get(Key key);
}
- ex2의 문자열 기반 API의 문제 두 가지를 모두 해결해주지만, 개선할 필요가 있다.
- set과 get은 정적 메서드일 필요는 없으니 Key 클래스의 인스턴스 메서드로 변경하자.
- 추가로, ThreadLocal을 매개변수화 타입으로 선언하면 된다.
ex 4) ex3에서 매개변수화하여 타입안정성 확보한 예제
public class ThreadLocal<T> {
public ThreadLocal();
public void set(T value)
public T get();
}
정리
- 더 적합한 데이터 타입이 있거나, 새로 작성할 수 있다면 문자열 대신 그것들을 사용하자.
- 문자열은 잘못 사용하면 번거롭고, 불편하다.
- 문자열을 잘못 사용하는 흔한 예로는 기본타입, 열거타입, 혼합타입이 있다.
반응형
'BE > Java' 카테고리의 다른 글
[Effective Java] 아이템 64. 객체는 인터페이스를 사용해 참조하라 (0) | 2022.11.30 |
---|---|
[Effective Java] 아이템 63. 문자열 연결은 느리니 주의하라 (0) | 2022.11.30 |
[Effective Java] 아이템 61. 박싱된 기본 타입보다는 기본 타입을 사용하라 (0) | 2022.11.28 |
[Effective Java] 아이템 60. 정확한 답이 필요하다면 float와 double은 피하라 (0) | 2022.11.25 |
[Effective Java] 아이템 59. 라이브러리를 익히고 사용하라 (0) | 2022.11.24 |