JAVA

float, double이 근사치임을 유의하기! 정확한 결과가 필요할 때는 float, double을 사용하면 안 된다. 정밀한 근사치로 계산하도록 설계되었기 때문이다. 특히 금융 계산과는 맞지 않는데, 10의 음의 거듭제곱 수를 표현할 수 없기 때문이다. 다음은 와닿는 예시이다. → 1.03달러 - 42센트는? System.out.println(1.03 - 0.42); 를 해보면 0.610000000000001을 출력한다. → 1달러가 있었는데 10센트 사탕 9개를 사면? System.out.println(1.00 - 9 * 0.10); 은 0.999999999999998을 출력한다. BigDecimal, int, long을 사용! 정확한 결과가 필요한 금융 계산에서는 BigDecimal, int, l..
표준 라이브러리를 사용하라 - 검증되었다. - 라이브러리 작성자는 훨씬 경험이 많고 전문적이다. - 있는거 구현하느라 시간 허비 말고 기능 개발에 집중 - 성능이 지속적으로 개선, 기능이 추가된다. - 우리가 작성한 코드가, 많은 사람들에게 낯익은 코드가 된다. 라이브러리가 너무 방대해서 뭐가 있는지 잘 모르겠어요 구현을 안하고 라이브러리를 쓰려면 일단 알아야 하는데, 자바 라이브러리는 너무 방대해서 잘 모른다. 그러나 자바 프로그래머라면 적어도 java.lang, java.util, java.io 하위 패키지들에 익숙해져야 한다. + 특별한 나만의 기능이 아니면 있을 가능성이 높고, 있는지 잘 모르겠다면 찾아보라. 이펙티브 자바에서는 아래 라이브러리들 또한 직접 추천했다. ─ 컬렉션 프레임워크 ─ 스트..
향상된 for문 (for-each문)을 사용하자! 전통적인 for문으로 컬렉션을 순회하는 다음 코드들을 보자. Iterator와 인덱스 변수는 코드를 지저분하게 하고 있다. 한편 우리에게 필요한 것은 원소뿐이다. for(Iterator i = c.iterator(); i.hasNext(); ){ Element e = i.next(); ... // e로 무언가 한다 } for(int i=0; i
왜 지역변수의 범위를 최소화해야 할까? 지역변수의 범위를 최소로 줄이면, 코드 가독성 및 유지보수성이 높아지고 오류 가능성은 낮아진다. 지역변수 범위를 줄이는 가장 강력한 기법은 "가장 처음 쓰일 때 선언하기"다. 만일 지역변수를 나중에 사용할 예정인데 미리 선언부터 해두면 가독성이 떨어진다. 실사용 시점에서 변수 정보가 기억나지 않을 수도 있다. 거의 모든 지역변수는 선언과 동시에 초기화하자. *try-catch문은 예외 (: 초기화 자체가 예외 가능성이 있을 경우) 반복문에서의 추천 사항 반복문은 변수 범위를 한정해준다. for문 안에 쓴 변수는 for문 안으로 한정한다는 말이다. 반복문 내에서만 변수를 사용할 거라면, while문 말고 for문을 사용하는 것이 좋다. (이전 while문에서 사용한 ..
옵셔널 메서드가 특정 조건에서 값을 반환해낼 수 없을 때는 어떻게 해야 할까? (자바8 이전) - 예외를 던진다 - null을 반환 그러나 두 방법 모두 허점이 있다. 예외는 진짜 예외적인 상황에서만 사용해야 한다(Item69) null을 반환하면 별도의 null처리 코드를 추가해야 하며, 어디선가 언젠가 뜬금없는 NullPointerException의 가능성도 있다. (자바8 이후) - Optional 유효한 반환값이 없을 때는 Optional를 반환하면, null이 아닌 T타입 참조를 하나 답거나, 혹은 아무것도 담지 않을 수 있다(즉, 빈 옵셔널) 옵셔널은 원소를 최대 1개 가질 수 있는 '불변' 컬렉션이다. * Optional가 Collection를 구현하지는 않았지만, 원칙적으로 그렇다고 한다...
null이 아닌, 빈 컬렉션이나 배열을 반환하라 null이 아닌 빈 배열이나 컬렉션을 반환하라. null을 반환하는 API는 사용하기 어렵고, 오류 처리 코드도 늘어난다. 그렇다고 성능이 좋은 것도 아니다. null 반환은 옳지 못하다 ─ 컬렉션이 비었으면 null을 반환하는 코드 (옳지 못하다) 아래 메서드는 컬렉션이 빈 경우 null을 반환하게 두었다. private final List cheesesInStock = ...; /** * @return 매장 안의 모든 치즈 목록을 반환한다. * 단, 재고가 하나도 없다면 null을 반환. */ public List getCheeses(){ return cheesesInStock.isEmpty ? null : new ArrayList(cheeseInSto..
가변인수(varargs) 가변인수는 인수 개수가 정해지지 않았을 때 아주 유용하다. 명시한 타입의 인수를 0개 이상 받을 수 있다. 가변인수 메서드 호출시, 인수 개수 길이의 배열에 인수를 담아서 가변인수 메서드에 전달한다. 즉 호출시마다 새로운 배열을 할당하고 초기화한다. 가변인수 간단 예시 다음은 가변인수를 활용한 간단한 예시이다. 인수로 int... args가 들어간다. // 입력받은 int 인수들의 합을 계산해주는 가변인수 메서드 static int sum(int... args){ int sum = 0; for(int arg : args) sum += arg; return sum; } 인수가 1개 이상이어야 하는 가변인수 메서드 예를 들어, 최솟값을 찾는 메서드를 생각해보면 인수가 0개 들어오도록..
다중정의(오버로딩)는 신중히 사용하라 프로그래밍 언어가 오버로딩을 허용한다고 해서 다중정의를 꼭 활용하라는 뜻은 아니다. 보통 파라미터 수가 같을 때는 오버로딩을 피하는 게 좋다. 메서드명을 달리 한다거나의 방법으로 말이다. 그런데 생성자의 경우 메서드명이 정해져 있는데 어떡하나? 이럴 경우 헷갈릴 만한 파라미터를 형변환하여 명확한 오버로딩 메서드가 선택되도록 하면 된다. 자세한 내용은 아래 참고하자. 혼란을 주는 오버로딩 메서드 예시 다음과 같이 classify 메서드가 3개로 오버로딩되어있다. 아래 예시는 ─ 집합, 리스트, 그 외 컬렉션 타입 객체를 순서대로 classify()를 통해 호출해보는 코드다. ─ 그럼 '집합', '리스트', '그 외'가 순서대로 출력되어야 할 것 같지만, '그 외', '..
메서드 시그니처를 신중하게 설계하라 이번 아이템은 가볍게 쓰는 '여러 API 설계 요령'이다. 사용하기 쉽고 오류가능성이 적은 API를 만들고 싶다면 유의깊게 보길! ─ 메서드 이름을 신중히 짓자. 항상 표준 명명 규칙(Item68)을 따라야 한다. 이해할 수 있고, 같은 패키지 내 다른 이름들과 일관되게 짓도록 해야 한다. 긴 이름은 피하자. 개발자들에게 잘 받아들여지는 이름을 사용하자. 자바 라이브러리의 API 가이드를 참고하자. ─ 편의 메서드를 너무 많이 만들지 말자 메서드가 너무 많은 클래스, 인터페이스는 까다롭다. (사용/문서화/테스트/유지보수... 모든 면에서!) 편의 메서드를 너무 많이 두지 말고, 자신의 각 '기능'을 완벽히 수행하는 메서드로 제공해야 한다. 아주 자주 쓰일 경우에만 편의..
자바는 네이티브 메서드를 적극 사용하며, 자바로 작성한 클래스는 불변식을 지키고자 한다. (불변식: 어떤 객체의 유효한 상태를 규정함 / 변하지 않음 / 항상 참이되는 조건) 메모리 전체를 하나의 거대한 배열로 다루고 있는 C나 C++에서는 편하게 누리지 못하는 강점이다 하지만 아무 노력 없이 다른 클래스로부터의 침범을 막을 수 있는 것이 아니다. 항상 불변식이 '어디선가' 깨질 수 있다고 생각하며 방어적으로 프로그래밍 해야 한다. 적절치 않은 상황에 대비하여, 클래스를 보호하기 위한 시간을 써야 한다. 다시말해, 객체의 허락 없이는 내부를 수정하도록 두면 안 되는데 나도 모르게 내부 수정을 허락해버리는 경우를 주의해야 한다. 가변 클래스가 객체에 사용되는 것을 유의하자 예를 들어 이런 상황을 경계해야 ..
히어로맛쿠키
'JAVA' 카테고리의 글 목록 (3 Page)