Chapter 8 λ©μλ
Item 49 맀κ°λ³μκ° μ ν¨νμ§ κ²μ¬νλΌ
λ©μλμ μμ±μ λλΆλΆμ μ λ ₯ 맀κ°λ³μ κ°μ΄ νΉμ 쑰건μ λ§μ‘±νκΈ°λ₯Ό λ°λλ€.
- μΈλ±μ€ κ°μ μμλ₯Ό μ μΈν μ μμ΄λ€
- κ°μ²΄ μ°Έμ‘°λ
null
μ΄ μλμ¬μΌ νλ€
μ λκ°μ§ μκ° λνμ μΈ μ μ½ μ¬νμ΄λ€.
μ΄λ¬ν μ μ½ μ¬νμ λ°λμ λ¬Έμν ν΄μΌ νλ©° λ©μλμ body
κ° μ€ννκΈ° μ΄μ μ κ²μ¦λλκ²μ΄ μ’λ€
λ©μλ body
κ° μ€νλκΈ° μ μ 맀κ°λ³μκ°μ νμΈνλ€λ©΄ μλͺ»λ κ°μ΄ λμ΄μμλ μ¦κ°μ μ΄κ³ κΉλν λ°©μμΌλ‘ μμΈλ₯Ό λμ§μ μλ€.
맀κ°λ³μ κ²μ¬μ μ€ν¨νλ©΄ μ€ν¨ μμμ± (failure atomicity) μ μ΄κΈ°λ κ²°κ³Ό λ₯Ό λ³μμ μλ€.
public BigInteger mod(BigInteger m) {
if (m.signum() <= 0) {
throw new ArithmeticException("κ³μ(m)λ μμμ¬μΌ ν©λλ€. " + m);
}
/* statement */
}
μ λ©μλλ m
μ΄ null
μ΄λ©΄ m.signum()
μ νΈμΆνλ©΄ NPE (Null Pointer Exception) μ λμ§λ€.
νμ§λ§ NPE κ²μ¬λ₯Ό μννλ€λ λ§μ μ ν μμ§λ§ BigInteger
ν΄λμ€ κ΄μ μμ κΈ°μ νμμΌλ λ¬Έμ κ° μλ€.
Item 50 μ μμ λ°©μ΄μ 볡μ¬λ³Έμ λ§λ€λΌ
ν΄λΌμ΄μΈνΈκ° λΆλ³μμ κΉ¨λλ¦¬λ €κ³ νμμ΄ λμ΄ μλ€λ κ°μ μνμ λ°©μ΄μ μΌλ‘ νλ‘κ·Έλλ° ν΄μΌ νλ€.
public final class Period {
private final Date start;
private final Date end;
public Period(Date start, Date end) {
if (start.compareTo(end) > 0) {
throw new IllegalArgumentException(start + " after " + end);
}
this.start = start;
this.end = end;
}
public Date start() {
return start;
}
public Date end() {
return end;
}
}
μ μ½λμμ λ΄λΆλ₯Ό μμ νλ €λ©΄ λ€μκ³Ό κ°μ΄ μμ± κ°λ₯νλ€.
Date start = new Date();
Date end = new Date();
Period p = new Period(start, end);
end.setYear(78);
μΈλΆ 곡격μΌλ‘ Period
μΈμ€ν΄μ€ λ΄λΆλ₯Ό 보νΈνλ €λ©΄ μμ±μμκ² λ°μ κ°λ³ 맀κ°λ³μλ₯Ό κ°κ° λ°©μ΄μ μΌλ‘ λ³΅μ¬ (Defensive Copy) ν΄μΌ νλ€.
μ΄νμλ Period
μΈμ€ν΄μ€ μμμλ μλ³Έμ΄ μλ 볡μ¬λ³Έμ νμ©ν΄μΌ νλ€.
public Period(Date start, Date end) {
this.start = new Date(start.getTime());
this.end = new Date(end.getTime());
if (this.start.compareTo(this.end) > 0) {
throw new IllegalArgumentException(this.start + " after " + this.end);
}
}
맀κ°λ³μμ μ ν¨μ±μ κ²μ¬νκΈ° μ μ λ°©μ΄μ 볡μ¬λ³Έμ λ§λ€κ³ , μ΄ λ³΅μ¬λ³ΈμΌλ‘ μ ν¨μ±μ κ²μ¬νλ€.
맀κ°λ³μκ° μ 3μμ μν΄ νμ₯λ μ μλ νμ
μ΄λΌλ©΄ λ°©μ΄μ 볡μ¬λ³Έμ λ§λ€ λ clone()
μ μ¬μ©ν΄μλ μλλ€.
Date start = new Date();
Date end = new Date();
Period p = new Period(start, end);
p.end().setYear(78)
νλμ λ°νμλ λ°©μ΄μ 볡μ¬λ³Έμ λ°ν νλ€.
public Date start() {
return new Date(this.start.getTime());
}
public Date end() {
return new Date(this.end.getTime());
}
TIP
ν΄λμ€κ° ν΄λΌμ΄μΈνΈλ‘ λ°μ νΉμ ν΄λΌμ΄μΈνΈλ‘ λ°ννλ μμκ° κ΅¬μ±μμκ° κ°λ³μ΄λΌλ©΄ κ·Έ μμλ λ°λμ λ°©μ΄μ μΌλ‘ λ³΅μ¬ (Defensive Copy) ν΄μ μ¬μ© ν΄μΌ νλ€.
λ¨ λ°©μ΄μ 볡μ¬λ₯Ό μννλλ° λ§μ λΉμ©μ΄ μμκ° λλ€λ©΄ ν΄λΉ ꡬμ±μμλ₯Ό μμ νμλ κ·Έμ λν μ±
μμ ν΄λΌμ΄μΈνΈμ μμμ λ¬Έμμ λͺ
μνλλ‘ νμ
Item 51 λ©μλ μκ·Έλμ²λ₯Ό μ μ€ν μ€κ³νλΌ
- λ©μλ μ΄λ¦μ μ μ€ν μ§μ
- κ°μ ν¨ν€μ§μ μν λ€λ₯Έ μ΄λ¦λ€κ³Ό μΌκ΄λκ² μ§λλ€.
- νΈμ λ©μλλ₯Ό λ§μ΄ λ§λ€μ§ λ§μ
- ν΄λμ€λ μΈν°νμ΄μ€λ μμ μ κ° κΈ°λ₯μ μλ²½ν μννλ λ©μλλ‘ μ 곡ν΄μΌ νλ€.
- 맀κ°λ³μ λͺ©λ‘μ μ§§κ² μ μ§νμ
- 맀κ°λ³μ κ°―μλ 4κ° μ΄νλ‘ μ μ§νμ
- κ°μ νμ μ 맀κ°λ³μκ° μ¬λ¬κ° μ°λ¬μ λμ€λ κ²½μ°λ ν΄λ‘λ€.
Item 52 λ€μ€μ μλ μ μ€ν μ¬μ©νλΌ
λ€μ€μ μ (Overloading : μ€λ²λ‘λ©) μ μ΄λ€ λ©μλλ₯Ό νΈμΆν μ§λ μ»΄νμΌ νμμ κ²°μ (Static Dispatch : μ μ λμ€ν¨μΉ) λλ€.
μ¬μ μ (Overriding : μ€λ²λΌμ΄λ©) μ λμ μΌλ‘ κ²°μ (Dynamic Dispatch : λμ λμ€ν¨μΉ) λλ€.
맀κ°λ³μκ° κ°μ λλ λ€μ€μ μλ₯Ό νΌνλκ²μ΄ μ’λ€.
κΈ°μ‘΄ ν΄λμ€λ₯Ό μμ νμ¬ μλ‘μ΄ μΈν°νμ΄μ€λ₯Ό ꡬνν΄μΌ ν λλ κ°μ κ°μ²΄λ₯Ό μ
λ ₯ λ°λ λ€μ€ μ μ λ©μλλ€μ΄ λͺ¨λ λμΌνκ² λμλμ΄μΌ νλ€.
Item 53 κ°λ³μΈμλ μ μ€ν μ¬μ©νλΌ
ν©μ ꡬνλ λ©μλ
static int sum (int... args) {
int sum = 0;
for (int arg : args) {
sum += arg;
}
return sum;
}
static int min (int... args) {
if (args.length === 0) {
throw new IllegalArgumentException("μΈμκ° 1κ° μ΄μ νμν©λλ€.");
}
int min = args[0];
for (int i = 1; i < args.length; i++) {
if (args[i] < min) {
min = args[i];
}
}
return min;
}
μ μ½λλ μΈμλ₯Ό 0κ°λ‘ λκΈ°λ©΄ λ°νμ μλ¬κ° λ°μνλ€. (μ½λλ λμ λΆ νλ€.)
λλ¬Έμ μλμ κ°μ΄ 리ν ν λ§μ΄ νμνλ€.
static int min (int firstArg, int... remainingArgs) {
int min = firstArg;
for (int arg : remainingArgs) {
if (arg < min) {
min = arg;
}
}
return min;
}
μΈμμ κ°μκ° μΌμ νμ§ μμλμλ λ©μλλ₯Ό μ μν΄μΌ νλ€λ©΄ κ°λ³μΈμκ° λ°λμ νμνλ€.
λ©μλλ₯Ό μ μν λλ νμ 맀κ°λ³μλ κ°λ³μΈμ μμ λκ³ , κ°λ³μΈμλ₯Ό μ¬μ©ν λλ μ±λ₯λ¬Έμ κΉμ§ κ³ λ €νμ
Item 54 nullμ΄ μλ, λΉ μ»¬λ μ μ΄λ λ°°μ΄μ λ°ννλΌ
νΉμ λ©μλ μ¬μ©μ 컬λ μ
μ΄λ λ°°μ΄κ³Ό κ°μ 컨ν
μ΄λκ° λΉμμ λ null
μ λ°ν νμμλ
μ΄ λ©μλλ₯Ό μ¬μ©νλ ν΄λΌμ΄μΈνΈ μ½λλ μ΄ μν©μ μ²λ¦¬ κ°λ₯ν λ°©μ΄μ½λλ₯Ό νμ λ£μ΄μ€μΌ νλ€.
λλ¬Έμ λΉ μ»¨ν μ΄λλ₯Ό λ°ννλ μͺ½μ΄ λ μμ νλ€.
public List<Cheese> getCheeses() {
return cheesesInStock.isEmpty() ? Collections.emptyList() : new ArrayList<>(cheesesInStock);
}
private static final Cheese[] EMPTY_CHEESE_ARRAY = new Cheese[0];
public Cheese[] getCheeses() {
return cheesesInStock.toArray(EMPTY_CHEESE_ARRAY);
}
Item 55 μ΅μ λ λ°νμ μ μ€ν νλΌ
Java SE 8
μμ μΆκ°λ Optional<T>
λ μμλ₯Ό μ΅λ 1κ°λ₯Ό κ°μ§ μ μλ λΆλ³ 컬λμ
μ΄λ€.
μ΅μ
λμ λ°ννλ λ©μλμμλ λ°λμ null
μ λ°ννμ§ λ§μ.
λ€μμ 컬λ μ
μμ μ΅λκ°μ κ΅¬ν΄ Optional<E>
λ‘ λ°ννλ μ½λμ΄λ€.
public static <E extends Comparable<E>> Optional<E> max(Collection<E) c) {
if (c.isEmpty()) {
return Optional.empty();
}
E result = null;
for (E e : c) {
if (result = null || e.compareTo(result) > 0) {
result = Objects.requireNonNull(e);
}
return Optional.of(result);
}
}
μ΅μ λμ λ°λ ν΄λΌμ΄μΈνΈλ κ·Έμ λ§λ μ μ± λ€ (κΈ°λ³Έκ° νΉμ μμΈ λ±λ±) μ μΈμλκ³ ν΄λΉ μ μ± μ λ§κ² κ°μ μ€μ νλ€.
λ°μ±λ κΈ°λ³Έ νμ μ λ΄μ μ΅μ λμ λ°ννλ μΌμ μλλ‘ νμ (μλμ κ°μ λ°μ±λ μ΅μ λ νμ μ μ¬μ©)
OptionalInt
OptionalLong
OptionalDouble
Item 56 곡κ°λ API μμμλ νμ λ¬Έμν μ£Όμμ μμ±νλΌ
μμ±ν API λ₯Ό μ¬λ°λ₯΄κ² λ¬Έμν νλ €λ©΄ 곡κ°λ λͺ¨λ ν΄λμ€, μΈν°νμ΄μ€, λ©μλ νλ μ μΈμ λ¬Έμν μ£Όμμ λ¬μμΌ νλ€.
λ¬Έμν μ£Όμμ΄ μλ€λ©΄ API κ° μ°κΈ° μ΄λ €μ°λ©° μ€λ₯λ₯Ό λ΄κΈ° μ½λ€.
μ μ 쑰건 λ° μ¬ν쑰건, μ€λ₯μ¬ν κ°μ λΆμμ© λν λ¬Έμν ν΄μΌ νλ€.