맞는데 왜 틀릴까..?

Java/Effective Java 77

[Effective Java] Item 63. 문자열 연결은 느리니 주의하라

문자열 연결 연산자(+) 문자열 연결 연산자(+)는 여러 문자열을 하나로 합쳐주는 편리한 수단이다. 한 줄짜리 출력값 혹은 작고 크기가 고정된 객체의 문자열 표현을 만들 때라면 괜찮지만, 본격적으로 사용하기 시작하면 성능 저하를 감내하기 어렵다. 문자열 연결 연산자로 문자열 n개를 잇는 시간은 n^2에 비례한다. 문자열은 불변이라서 두 문자열을 연결할 경우 양쪽의 내용을 모두 복사해야 한다. StringBuilder를 사용하자. 결론 성능에 신경 써야 한다면 많은 문자열을 연결할 때는 문자열 연결 연산자(+)를 피하자. 대신 StringBuilder의 append 메서드를 사용하자.

Java/Effective Java 2023.07.30

[Effective Java] Item 62. 다른 타입이 적절하다면 문자열 사용을 피하라

문자열(String)은 텍스트를 표현하도록 설계되었지만 원래 의도하지 않은 용도로도 쓰이는 경향이 있다. 이번 아이템에서는 문자열을 쓰지 않아야 할 사례를 다룬다. 문자열을 쓰지 않아야 할 사례 1. 문자열은 다른 값 타입을 대신하기에 적합하지 않다. 입력받을 데이터가 진짜 문자열이 아닌 수치형이라면 int, float, BigInteger 등 적당한 수치 타입으로 변환해야 한다. 기본 타입이든 참조 타입이든 적절한 값 타입이 있다면 그것을 사용하고 없다면 새로 작성하자. 2. 문자열은 열거 타입을 대신하기에 적합하지 않다. 상수를 열거할 떄는 문자열보다는 열거 타입이 월등히 낫다. 3. 문자열은 혼합 타입을 대신하기에 적합하지 않다. 여러 요소가 혼합된 데이터를 하나의 문자열로 표현하는 것은 대체로 좋..

Java/Effective Java 2023.07.30

[Effective Java] Item 61. 박싱된 기본 타입보다는 기본 타입을 사용하라

자바의 타입 기본 타입 : int, double, boolean 참조 타입 : String, List 박싱된 기본 타입 : Integer, Double, Boolean 오토박싱과 오토언박싱 덕분에 두 타입을 크게 구분하지 않고 사용할 수는 있지만 차이가 사라지는 것은 아니다. 기본 타입과 박싱된 기본 타입의 주된 차이 3가지 1. 기본 타입은 값만 가지고 있으나, 박싱된 기본 타입은 값에 더해 식별성(identity)이란 속성을 갖는다. 박싱된 기본 타입의 두 인스턴스는 값이 같아도 서로 다르다고 식별될 수 있다. 2. 기본 타입의 값은 언제나 유효하나, 박싱된 기본 타입은 유효하지 않은 값, 즉 null을 가질 수 있다. 3. 기본 타입이 박싱된 기본 타입보다 시간과 메모리 사용면에서 더 효율적이다. ..

Java/Effective Java 2023.07.30

[Effective Java] Item 60. 정확한 답이 필요하다면 float와 double은 피하라

float와 double의 문제점 float와 double 타입은 과학과 공학 계산용으로 설계되었다. 이진 부동소수점 연산에 쓰이며, 넓은 범위의 수를 빠르게 정밀한 '근사치'로 계산하도록 세심하게 설계되었다. 따라서 정확한 결과가 필요할 때는 사용하면 안 된다. float와 double 타입은 특히 금융 관련 계산과는 맞지 않는다. 0.1 혹은 10의 음의 거듭제곱 수(10^-1)를 표현할 수 없기 때문이다. ex1) 주머니에 1.03 달러가 있는데 그중 42 센트를 썼다. System.out.println(1.03 - 0.42)는 0.6100000000000001을 출력한다. ex2) 주머니에 1 달러가 있는데 10센트 사탕 9개를 샀다. System.out.println(1.00 - 9*0.10)는..

Java/Effective Java 2023.07.23

[Effective Java] Item 59. 라이브러리를 익히고 사용하라

Random 무작위 수를 생성하는 코드 책의 글쓴이가 신중히 선택한 범위에서 무작위 수를 100만 개 생성한 다음, 그중 중간 값보다 작은 게 몇 개인지 출력한다. random 메서드가 이상적으로 동작한다면 약 50만개가 출력돼야 하지만, 실제로 돌려보면 666,666에 가까운 값을 얻는다. 무작위 생성 수 중 2/3가 중간값보다 낮은 쪽으로 쏠린것이다. 위 코드는 문제를 세 가지나 내포하고 있다. 1. n이 그리 크지 않은 2의 제곱수라면 얼마 지나지 않아 같은 수열이 반복된다. 2. n이 2의 제곱수가 아니라면 몇몇 숫자가 평균적으로 더 자주 반환된다. n 값이 크면 이 현상은 더 두드러진다. 3. 지정한 범위 '바깥'의 수가 종종 튀어나올 수 있다. rnd.nextInt()가 반환한 값을 Math...

Java/Effective Java 2023.07.23

[Effective Java] Item 57. 지역변수의 범위를 최소화하라

지역변수의 유효 범위를 최소로 줄이면 코드 가독성과 유지보수성이 높아지고 오류 가능성은 낮아진다. 지역변수의 범위를 줄이는 방법 1. 가장 처음 쓰일 때 선언하기 사용하기 전에 미리 선언부터 해두면 코드가 어수선해져 가독성이 떨어진다. 변수를 실제로 사용하는 시점에 타입과 초깃값이 기억나지 않을 수 있다. 지역변수를 생각 없이 선언하다 보면 변수가 쓰이는 범위보다 너무 앞서 선언하거나, 다 쓴 뒤에도 여전히 살아 있게 되기 쉽다. 지역변수의 범위는 선언된 지점부터 그 지점을 포함한 블록이 끝날 때까지 이므로, 실제 사용하는 블록 바깥에 선언된 변수는 그 블록이 끝난 뒤까지 살아있게 된다. 2. 거의 모든 지역변수는 선언과 동시에 초기화해야 한다. 초기화에 필요한 정보가 충분하지 않다면 충분해질 때까지 선..

Java/Effective Java 2023.07.22

[Effective Java] Item 56. 공개된 API 요소에는 항상 문서화 주석을 작성하라

API를 쓸모 있게 하려면 잘 작성된 문서도 곁들여야 한다. 자바에서는 자바독(Javadoc)이라는 유틸리티가 소스코드 파일에서 문서화 주석(doc comment; 자바독 주석)이라는 특수한 형태로 기술된 설명을 추려 API 문서로 변환해 준다. 문서화 주석 문서화 주석을 작성하는 규칙은 공식 언어 명세에 속하진 않지만 자바 프로그래머라면 알아야 하는 업계 표준 API다. 이 규칙은 문서화 주석 작성법 (How to Write Doc Comments) 웹 페이지에 기술되어 있다. API를 올바로 문서화하려면 공개된 모든 클래스, 인터페이스, 메서드, 필드 선언에 문서화 주석을 달아야 한다. 직렬화할 수 있는 클래스라면 직렬화 형태에 관해서도 적어야 한다. 문서화 주석이 없다면 자바독도 그저 공개 API ..

Java/Effective Java 2023.07.22

[Effective Java] Item 55. 옵셔널 반환은 신중히 하라

메서드가 값을 반환할 수 없을 때 1. 예외를 던짐 진짜 예외적인 상황에서만 사용해야 한다. 예외를 생성할 때 스택 추적 전체를 캡처하므로 비용도 많이 든다. 2. 반환 타입이 객체 참조라면 null을 반환 null을 반환할 수 있는 메서드를 호출할 때는, 별도의 null 처리 코드를 추가해야 한다. null 처리를 무시하고 반환된 null 값을 어딘가에 저장해 두면 언젠간 NullPointerException이 발생할 수 있다. (실제 원인과는 전혀 상관없는 코드에서) 3. Optional 자바 8 이후 Optional 는 null이 아닌 T타입 참조를 하나 담거나, 혹은 아무것도 담지 않을 수 있다. 아무것도 담지 않은 옵셔널을 '비었다'라고 말한다. 어떤 값을 담은 옵셔널을 '비지 않았다'라고 한다..

Java/Effective Java 2023.07.22

[Effective Java] Item 54. null이 아닌, 빈 컬렉션이나 배열을 반환하라

null을 반환하는 메서드 컬렉션이 비었으면 null을 반환하는 메서드 - 따라 하지 말 것 private final List cheeseInStock = ...; /** * @return 매장 안의 모든 치즈 목록을 반환한다. * 단, 재고가 하나도 없다면 null을 반환한다. */ public List getCheeseInStock{ return cheeseInStock.isEmpty() ? null : new ArrayList(cheeseInStock); } 이 코드처럼 null을 반환한다면, 클라이언트는 이 null 상황을 처리하는 코드를 추가로 작성해야 한다. 컬렉션이나 배열 같은 컨테이너가 비었을 때 null을 반환하는 메서드를 사용할 때면 항시 이와 같은 방어 코드를 넣어줘야 한다. 클라이언..

Java/Effective Java 2023.07.16