
자바의 데이터 타입은 크게 두 가지로 나눌 수 있습니다. 바로 int, double, boolean 같은 기본 타입과 String, List와 같은 참조 타입입니다. 그리고 각각의 기본 타입에는 대응하는 참조 타입이 하나씩 있으며, 이를 박싱된 기본 타입이라고 합니다. 예컨대 int, double, boolean에 대응하는 박싱된 기본 타입은 Integer, Double, Boolean 입니다. 아이템 6에서 이야기했듯, 오토박싱과 오토언박싱 덕분에 두 타입을 크게 구분하지 않고 사용할 수는 있지만, 그렇다고 차이가 사라지는 것은 아닙니다. 둘 사이에는 분명한 차이가 있으니 어떤 타입을 사용하는지는 상당히 중요합니다. 즉, 주의해서 선택해야 한다는 의미입니다. 기본 타입과 박싱된 기본 타입의 주된 차이는..

float와 double 타입은 과학과 공학 계산용으로 설계되었습니다. 이진 부동소수점 연산에 쓰이며, 넓은 범위의 수를 빠르게 정밀한 '근사치'로 계산하도록 설계되었습니다. 따라서 정확한 결과가 필요할 때는 사용하면 안 됩니다. float와 double 타입은 특히 금융 관련 계산과는 맞지 않습니다. 0.1 혹은 10의 음의 거듭제곱 수를 표현할 수 없기 때문입니다. 예를 들어 주머니에 1.03달러가 있었는데 그 중 42센트를 썼다고 해봅시다. 🤔 남은 돈은 얼마인가요? 다음은 이 문제의 답을 구하기 위해 작성된 코드입니다. System.out.println(1.03 - 0.42); 안타깝게도 이 코드는 0.6100000001을 출력합니다. 결괏값을 출력하기 전에 반올림하면 해결되리라 생각할지 모르지만..

무작위 정수 하나를 생성하고 싶다고 해봅시다. 값의 범위는 0부터 명시한 수 사이입니다. 아주 흔히 마주치는 문제로, 많은 프로그래머가 다음과 같은 짤막한 메서드를 만들곤 합니다. static Random rnd = new Random(); static int random(int n) { return Math.abs(rnd.nextInt()) % n; } 괜찮은 듯 보여도 문제를 세 가지나 내포하고 있습니다. 위 코드의 문제점 [1]. n이 그리 크지 않은 2의 제곱수라면 얼마 지나지 않아 같은 수열이 반복된다. [2]. n이 2의 제곱수가 아니라면 몇몇 숫자가 평균적으로 더 자주 반환된다. n 값이 크면 이 현상은 더 두드러집니다. 다음 코드는 무작위 수를 백만개를 생성한 다음, 그 중 중간 값보다 작..

아이템 45에서 이야기했듯, 스트림이 제격인 작업이 있고 반복이 제격인 작업이 있습니다. 다음은 전통적인 for 문으로 컬렉션을 순회하는 코드입니다. for (Iterator i = c.iterator(); i.hasNext(); ) { Element e = i.next(); } 그리고 다음은 전통적인 for 문으로 배열을 순회하는 코드입니다. for (int i = 0; i < a.length; i++) { ... // a[i]로 무언가를 한다. } 이 관용구들은 while 문보다는 낫지만(아이템 57) 가장 좋은 방법은 아닙니다. 반복자와 인덱스 변수는 모두 코드를 지저분하게 할 뿐 우리에게 진짜 필요한 건 원소들뿐입니다. 더군다나 이처럼 쓰이는 요소 종류가 늘어나면 오류가 생길 가능성이 높아집니다...

이번 아이템은 기본적으로 "클래스와 멤버의 접근 권한을 최소화하라"고 한 아이템 15와 취지가 비슷합니다. 지역변수의 유효 범위를 최소로 줄이면 코드 가독성과 유지보수성이 높아지고 오류 가능성은 낮아집니다. C와 같이 역사가 깊은 프로그래밍 언어 중에는 지역변수를 코드 블록의 첫머리에 선언하는 경우가 많고, 이 방식을 여전히 습관처럼 따르는 프로그래머도 있습니다. 하지만 자바에서는 문장을 선언할 수 있는 곳이면 어디서든 변수를 선언할 수 있습니다. 지역변수의 범위를 줄이는 가장 강력한 기법은 '가장 처음 쓰일 때 선언하기'입니다. 사용하려면 멀었는데, 미리 선언부터 해두면 코드가 어수선해져 가독성이 떨어집니다. 변수를 실제로 사용하는 시점엔 타입과 초깃값이 기억나지 않을 수도 있습니다. 지역변수를 생각없..

API를 쓸모 있게 하려면 잘 작성된 문서도 곁들여야 합니다. 전통적으로 API 문서는 사람이 직접 작성하므로 코드가 변경되면 매번 함께 수정해줘야 하는데, 자바에서는 Javadoc이라는 유틸리티가 이 귀찮은 작업을 도와줍니다. 자바독은 소스코드 파일에서 문서화 주석이라는 특수한 형태로 기술된 설명을 추려 API 문서로 변환해줍니다. 문서화 주석을 작성하는 규칙은 공식 언어 명세에 속하진 않지만 자바 프로그래머라면 응당 알아야 하는 업계 표준 API라 할 수 있습니다. 여러분의 API를 올바로 문서화하려면 모든 클래스, 인터페이스, 메서드, 필드 선언에 문서화 주석을 달아야 합니다. 직렬화할 수 있는 클래스라면 직렬화 형태(아이템 87)에 관해서도 적어야 합니다. 문서화 주석이 없다면 자바독도 그저 공개..

자바 8 전에는 메서드가 특정 조건에서 값을 반환할 수 없을 때 취할 수 있는 선택지가 두 가지 있었습니다. 예외를 던지거나, (반환 타입이 객체 참조라면) null을 반환하는 것입니다. 두 방법 모두 허점이 존재합니다. 예외 예외는 진짜 예외적인 상황에서만 사용해야 하며 (아이템 69) 예외를 생성할 때 스택 추적 전체를 캡처하므로 비용도 만만치 않습니다. null 반환 null을 반환하면 위같은 문제는 생기지 않지만, 그 나름의 문제가 있습니다. null을 반환할 수 있는 메서드를 호출할 때는, (null이 반환될 일이 절대 없다고 확신하지 않는 한) 별도의 null 처리 코드를 추가해야 합니다. null 처리를 무시하고 반환된 null 값을 어딘가에 저장해두면 언젠가 NullPointerExcept..

다음은 주변에서 흔히 볼 수 있는 메서드입니다. private final List cheeseInStock = ...; /** * @return 매장 안의 모든 치즈 목록을 반환한다. * 단, 재고가 하나도 없다면 null을 반환한다. */ public List getCheeses() { return cheeseInStock.isEmpty() ? null : new ArrayList(cheeseInstock); } 사실 재고가 없다고 해서 특별한 취급할 이유는 없습니다. 그럼에도 이 코드처럼 null을 반환한다면, 클라이언트 역시 이 null 상황을 처리하는 코드를 추가로 작성해야 합니다. List cheeses = shop.getCheeses(); if (cheeses != null && cheeses..
- Total
- Today
- Yesterday
- Kotlin
- BAEKJOON
- C++
- Olympiad
- JPA
- 코테
- 클린 코드
- BOJ
- 클린 아키텍처
- 테라폼
- MSA
- AWS
- Algorithm
- 이팩티브 자바
- 프로그래머스
- node.js
- kotest
- 정규표현식
- 알고리즘
- Spring Boot
- 디자인패턴
- 이펙티브 자바
- Effective Java
- 객체지향
- Spring
- programmers
- Java
- 디자인 패턴
- 백준
- kkoon9
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |