티스토리 뷰
728x90
반응형
다른 타입이 적절하다면 문자열 사용을 피하라
- 문자열(String)은 텍스트를 표현하도록 설계되었고, 그 일을 아주 잘해주고 있습니다. 그런데 문자열은 워낙 흔하고 자바가 잘 지원해주고 있어서 의도치 않게 사용하는 경우도 있습니다.
💡문자열은 다른 값 타입을 대신하기에 적합하지 않습니다.
- 많은 사람들이 파일, 네트워크, 키보드 입력으로부터 데이터를 받을 때 주로 문자열(String)을 사용합니다. 하지만 입력 받는 데이터가 수치형이라면 int, float, double형 또는 Y/N을 입력받는다면 boolean을 사용하는 것이 좋습니다.
💡문자열은 열거 타입을 대신하기에 적합하지 않습니다.
// bad
public static void typeV1(String fruitName) {
if (fruitName.equals("apple")) {
System.out.println("딸기");
} else if (fruitName.equals("grape")) {
System.out.println("포도");
}
}
// good
public static void typeV2(Fruit fruit) {
if (fruit == Fruit.APPLE) {
System.out.println("딸기");
} else if (fruit == Fruit.GRAPE) {
System.out.println("포도");
}
}
enum Fruit {
APPLE, GRAPE
}
💡문자열은 혼합 타입을 대신하기에 적합하지 않습니다.
- 구분자(#)을 가지고 타입을 혼합하는 경우, 이 구분자가 의미가 있어야하는데 className에도 #이 포함될 수 있고, i.next()에도 #이 포함될 가능성이 있다면 의미가 없어집니다. 그리고 매번 문자열을 파싱하는것도 번거롭고 에러가 발생하기 쉽습니다. 이러한 경우 전용 클래스를 새로 만드는것이 좋습니다.
// bad
String compoundKey = className + "#" + i.next();
// good
public class Compound {
private CompoundKey compoundKey;
private static class CompoundKey {
private String className;
private String delimiter;
private int index;
public CompoundKey(String className, String delimiter, int index) {
this.className = className;
this.delimiter = delimiter;
this.index = index;
}
}
}
💡문자열로 권한을 표현하는 경우
- 아래 예제 코드는 각 스레드가 자신만의 변수를 갖게 해주는 기능을 가지고 있습니다. 하지만 스레드 구분용으로 키 문자열을 받고 있는데 여기서 문제가 발생합니다.
- 바로 문자열 키가 전역 namespace에서 공유되고 있습니다. 만약 key가 중복이 되는 경우 같은 값을 공유할 수 있고, 또한 의도적으로 같은 키를 이용해 다른 클라이언트의 값을 가져올 수 있습니다. 그렇기 때문에 문자열로 하게되면 보안에도 취약허고 제대로 동작하지 않을 수 있습니다.
public class ThreadLocal {
private ThreadLocal() {} // 객체 생성 불가
public static void set(String key, Object value) {
}
public static Object get(String key) {
}
}
💡해결 방법
- 이 방법은 문자열 기반의 문제점을 해결해주지만 개선할 부분이 있습니다. get/set이 static일 필요가 없어지고 Key의 인스턴스도 변경하는게 좋습니다.
public class ThreadLocal {
private ThreadLocal() {} // 객체 생성 불가
public static void set(Key key, Object value) {
}
public static Object get(Key key) {
}
public static class Key {
Key() { }
}
}
💡리펙토링
public final class ThreadLocal<T> {
public ThreadLocal() {};
public void set(T value) {};
public T get() {};
}
✔️ 정리
- 모든 상황을 문자열로 해결하려고 하지 말고 적절한 타입을 사용해서 상황을 해결하려고 하는것이 중요합니다.
참고 자료)
https://catsbi.oopy.io/94095769-531f-4037-b514-12f0c896b9f2
https://jjingho.tistory.com/111
728x90
반응형
'스터디 > 이펙티브 자바' 카테고리의 다른 글
이펙티브 자바 - Item64. 객체는 인터페이스를 사용해 참조하라 (0) | 2022.08.16 |
---|---|
이펙티브 자바 - Item63. 문자열 연결은 느리니 주의하라 (0) | 2022.08.13 |
이펙티브 자바 - Item61. 박싱된 기본 타입보다는 기본 타입을 사용하라 (0) | 2022.08.11 |
이펙티브 자바 - Item58. 전통적인 for문보다는 for-each문을 사용하라 (0) | 2022.08.09 |
이펙티브 자바 - Item57. 지역변수의 범위를 최소화하라 (0) | 2022.08.08 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- spring boot redisson sorted set
- 트랜잭셔널 아웃박스 패턴 스프링부트
- pipeline architecture
- 트랜잭셔널 아웃박스 패턴 스프링 부트 예제
- redis sorted set으로 대기열 구현
- transactional outbox pattern
- JDK Dynamic Proxy와 CGLIB의 차이
- java userThread와 DaemonThread
- space based architecture
- service based architecture
- spring boot redis 대기열 구현
- 서비스 기반 아키텍처
- java ThreadLocal
- spring boot 엑셀 다운로드
- redis sorted set
- transactional outbox pattern spring boot
- 람다 표현식
- microkernel architecture
- redis 대기열 구현
- 레이어드 아키텍처란
- 공간 기반 아키텍처
- spring boot redisson destributed lock
- spring boot redisson 분산락 구현
- spring boot poi excel download
- polling publisher spring boot
- pipe and filter architecture
- 자바 백엔드 개발자 추천 도서
- spring boot excel download paging
- @ControllerAdvice
- spring boot excel download oom
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
글 보관함