728x90
정확한 답이 필요하다면 float와 double은 피하라.
부동소수점은 근사치로 계산하도록 세삼하게 설계되었다. 따라서 정확한 결과가 필요할 때는 사용하면 안된다. 특히, float와 double타입은 특히 금융관련 계산과 맞지 않는다.
System.out.println(1.03 - 0.42);
결과 값 : 0.6100000000000001
System.out.println(1.00 - 9 * 0.10);
결과 값 : 0.09999999999999998
금융 계산에는 BigDecimal, int 혹은 long을 사용해야 한다.
public static void main(String[] args) {
double funds = 1.00;
int itemsBought = 0;
for (double price = 0.10; funds >= price; price += 0.10) {
funds -= price;
itemsBought++;
}
System.out.println(itemsBought + "개 구입");
System.out.println("잔돈(달러):" + funds);
}
결과 값
3개 구입
잔돈(달러):0.3999999999999999
final BigDecimal TEN_CENTS = new BigDecimal(".10");
int itemBought = 0;
BigDecimal funds = new BigDecimal("1.00");
for(BigDecimal price = TEN_CENTS;
funds.compareTo(price) >= 0;
price = price.add(TEN_CENTS)) {
funds = funds.subtract(price);
itemBought++;
}
System.out.println(itemBought + "개 구입");
System.out.println("잔돈(달러):" + funds);
결과 값
4개 구입
잔돈(달러):0.00
다른 방법으로는 정수 값으로 치환한다음 소수점을 직접 관리하는 방식이다.
int itemBought = 0;
int funds = 100;
for(int price = 10; funds >= price; price += 10) {
funds -= price;
itemBought++;
}
System.out.println(itemBought + "개 구입");
System.out.println("잔돈(센트): " + funds);
박싱된 기본 타입보다는 기본 타입을 사용하라.
자바 데이터 타입은 2가지로 나눌 수 있다.
기본 타입 : int, double, boolean
참조 타입 : String, List
오토 박싱 언박싱 때문에 int, Integer를 구분없이 사용 할 수 있지만 차이가 사라지는 것은 아니다.
기본타입 | 박싱된 기본 타입 |
값만 가지고 있음 | 값 + 식별성 |
값이 유효함 | null값을 가질 수 있음 |
시간과 메모리 효율성이 높음 |
박싱된 기본타입에 == 연산자를 사용하면 오류가 난다.
박싱된 기본타입은 값이 같더라도 서로 다른 인스턴스이면 false가 된다.
박싱된 기본타입과 기본타입을 혼용해서 쓰면 기본 타입의 박싱이 자동으로 풀린다.
NullPointerException에러가 발생한다.
static Integer i;
public static void main(String[] args) {
if(i == 42)
System.out.println("믿을 수 없군!");
}
언박싱은 값이 변하면 객체가 계속해서 생성된다.
아래코드는 시간과 메모리 낭비에 최악이다.
Long sum = 0L;
for(long i = 0; i <= Integer.MAX_VALUE; i++) {
sum += i;
}
System.out.println(sum);
박싱된 기본 타입이 적절히 쓰이는 경우
- 컬렉션의 키, 원소 값으로 쓴다.
- 매개변수화 타입이나 매개변수화 메서드의 타입 매개변수로는 박싱된 기본 타입을 사용해야 한다.
- 리플렉션을 통해 메서드를 호출할 떄도 박싱된 기본 타입을 사용해야 한다.
728x90
'Language > Effective java' 카테고리의 다른 글
일반적인 프로그래밍 원칙 (0) | 2022.08.12 |
---|---|
일반적인 프로그래밍 원칙 (0) | 2022.08.11 |
일반적인 프로그래밍 원칙 (0) | 2022.08.08 |
메서드 (0) | 2022.08.04 |
메서드 (0) | 2022.08.01 |
댓글