본문 바로가기
Language/Effective java

일반적인 프로그래밍 원칙

by y.j 2022. 8. 10.
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

댓글