2μ₯ κ°μ²΄ μμ±κ³Ό νκ΄΄
κ°μ²΄λ₯Ό ‘λ§λ€μ΄μΌ νλ μκΈ°'λ₯Ό ꡬλΆνλ λ°©λ²
λΆνμν μμ±μ νΌνλ λ°©λ²
μ λ νκ΄΄λ¨μ 보μ₯νκ³ νκ΄΄μ μ μνν΄μΌν μμ μ²λ¦¬ λ°©λ²
μμ΄ν 1 : μμ±μ λμ μ μ ν©ν°λ¦¬ λ©μλλ₯Ό κ³ λ €νλΌ
ν΄λμ€λ μμ±μμ λ³λλ‘ μ μ ν©ν°λ¦¬ λ©μλλ₯Ό μ 곡ν μ μλ€.
μ μ ν©ν 리 λ©μλ
- μ΄λ¦μ κ°μ§ μ μλ€. (λ°ν κ°μ²΄μ νΉμ± μ€λͺ κ°λ₯)
- νΈμΆ μλ§λ€ μλ‘μ΄ μΈμ€ν΄μ€λ₯Ό μμ±νμ§ μμλ λλ€.
- λ°ν νμ
μ νμ νμ
κ°μ²΄λ₯Ό λ°νν μ μλ λ₯λ ₯μ΄ μλ€.
- λ°νν κ°μ²΄μ ν΄λμ€λ₯Ό μμ λ‘κ² μ νν μ μλ ‘μ μ°μ±'μ μ 곡
- ν©ν 리 λ©μλ μ΄λ¦μ λ°λΌ κ°κΈ° λ€λ₯Έ κΈ°λ₯μ ꡬν체 μμ± κ°λ₯ (λ°ν μ°Έμ‘° κ°μ²΄λ κ°λ€)
- λ°νν κ°μ²΄μ ν΄λμ€λ₯Ό μμ λ‘κ² μ νν μ μλ ‘μ μ°μ±'μ μ 곡
- μ λ ₯ 맀κ°λ³μμ λ°λΌ λ§€λ² λ€λ₯Έ ν΄λμ€μ κ°μ²΄λ₯Ό λ°νν μ μλ€.
- **μ μ ν©ν°λ¦¬ λ©μλλ₯Ό μμ±νλ μμ μλ λ°νν κ°μ²΄μ ν΄λμ€κ° μ‘΄μ¬νμ§ μμλ λλ€. ****
μλΉμ€ μ 곡μ νλ μμν¬ (JDBC)
μλΉμ€ μ 곡μ νλ μμν¬μμ μλΉμ€μ ꡬν체μ μ 곡μ ν΅μ νμ¬ ν΄λΌμ΄μΈνΈλ₯Ό ꡬν체λ‘λΆν° λΆλ¦¬ν΄μ€λ€.
μλΉμ€ μΈν°νμ΄μ€ : ꡬν체μ μ μ
μ 곡μ λ±λ‘ API : μ 곡μκ° κ΅¬ν체λ₯Ό λ±λ‘ν λ μ¬μ©
μλΉμ€ μ κ·Ό API : μλΉμ€μ μΈμ€ν΄μ€λ₯Ό μ»μ λ μ¬μ©
→ ν΄λΌμ΄μ΄μΈνΈλ μλΉμ€ μ κ·Ό APIλ₯Ό μ¬μ©ν λ μνλ ꡬν체μ 쑰건μ λͺ μνκ³ λ°ν λ°μ μ μλ€.
μ μ ν©ν 리 λ©μλμμ νν μ¬μ©νλ λͺ λͺ λ²
- from : λ§€κ° λ³μλ₯Ό νλ λ°μμ ν΄λΉ νμ
μ μΈμ€ν΄μ€λ₯Ό λ°ννλ νλ³ν λ©μλ
Date d = Date.from(instant); - of : μ¬λ¬ 맀κ°λ³μλ₯Ό λ°μ μ ν©ν νμ
μ μΈμ€ν΄μ€λ₯Ό λ°ννλ μ§κ³ λ©μλ
Set<Rank> faceCards = EnumSet.of(jack, queen, king) - valueOf : fromκ³Ό ofμ λ μμΈν λ²μ
BigInteger prime = BigInteger.valueOf(Integer.MAX_VALUE) - instance νΉμ getInstance(맀κ°λ³μλ₯Ό λ°λ κ²½μ°) 맀κ°λ³μλ‘ λͺ
μν μΈμ€ν΄μ€λ₯Ό λ°ννμ§λ§ κ°μ μΈμ€ν΄μ€μμ 보μ₯νμ§ μμ
StackWalker = luke = StackWalker.getInstance(options) - create νΉμ newInstance : Instance νΉμ getInstanceμ κ°μ§λ§, λ§€λ² μλ‘μ΄ μΈμ€ν΄μ€λ₯Ό μμ±ν΄ λ°νν¨μ 보μ₯νλ€
Object newArray = Array.newInstance(classObject, arrayLen); - getType : getInstanceμ κ°μΌλ μμ±ν ν΄λμ€κ° μλ λ€λ₯Έ ν΄λμ€μ νν°λ¦¬ λ©μλλ₯Ό μ μν λ μ΄λ€.
FileStore fs = Files.getFileStore(path) - newType : newInstance μ κ°μΌλ, μμ±ν ν΄λμ€κ° μλ λ€λ₯Έ ν΄λμ€μ ν©ν°λ¦¬ λ©μλλ₯Ό μ μν λ μ΄λ€.
BufferedReader br = Files.newBufferedReader(path) - type : getTypeκ³Ό newTypeμ κ°κ²°ν λ²μ
List<Complaint> litany = Collections.list(legacyLitany)
μμ΄ν 2: μμ±μμ 맀κ°λ³μκ° λ§λ€λ©΄ λΉλλ₯Ό κ³ λ €ν΄λΌ
μ μ ν©ν 리μ μμ±μλ 맀κ°λ³μκ° λ§μ λ μ μ΄μΌ λ κ² λ§κ³ κ°κ°μ 맀κ°λ³μ μμΉκ° μ΄λ€ κ°μ μλ―Ένλμ§ μκΈ° μ΄λ ΅λ€.
맀κ°λ³μκ° λ§μμ§λ©΄..
- κ° μμΉμ 맀κ°λ³μκ° μ΄λ€ μλ―ΈμΈμ§ μκΈ° μ΄λ ΅λ€.
- νμν 맀κ°λ³μμ λ°λΌ μμ±μλ₯Ό λ€ λ°λ‘ λ§λ€μ΄μ€μΌλ§ νλ€.
→ ν΄λΌμ΄μΈνΈμ μ€μλ₯Ό μ λ°νκ² λλ€.
setterλ‘ νλλ₯Ό λͺ νν νλ©΄... (μλ°λΉμ¦ν¨ν΄)
- κ°μ²΄ νλλ₯Ό λ§λ€κΈ° μν΄μ λ©μλλ₯Ό μ¬λ¬κ° νΈμΆν΄μΌνκ³ λͺ¨λ νΈμΆνκΈ° μ κΉμ§ **‘μΌκ΄μ±'**μ΄ λ¬΄λμ§ μνκ° λλ€.
- λΆλ³ ν΄λμ€λ‘ λ§λ€ μ μμ
λμ ⇒ μ μΈ΅μ μμ±μ ν¨ν΄ + μλ°λΉμ¦ ν¨ν΄μ κ°λ μ±
[λΉν°ν¨ν΄]
- ν΄λΌμ΄μΈνΈλ νμν κ°μ²΄λ₯Ό μ§μ λ§λ€μ§ μκ³ νμ 맀κ°λ³μλ§μ νΈμΆν΄ λΉλ κ°μ²΄λ₯Ό μ»λλ€.
- λΉλ κ°μ²΄κ° μ 곡νλ μΈν° λ©μλλ‘ μνλ 맀κ°λ³μλ₯Ό μ€μ νλ€.
// μ½λ 2-3 λΉλ ν¨ν΄ - μ μΈ΅μ μμ±μ ν¨ν΄κ³Ό μλ°λΉμ¦ ν¨ν΄μ μ₯μ λ§ μ·¨νλ€. (17~18μͺ½)
public class NutritionFacts {
private final int servingSize;
private final int servings;
private final int calories;
private final int fat;
private final int sodium;
private final int carbohydrate;
public static class Builder {
// νμ 맀κ°λ³μ
private final int servingSize;
private final int servings;
// μ ν 맀κ°λ³μ - κΈ°λ³Έκ°μΌλ‘ μ΄κΈ°ννλ€.
private int calories = 0;
private int fat = 0;
private int sodium = 0;
private int carbohydrate = 0;
public Builder(int servingSize, int servings) {
this.servingSize = servingSize;
this.servings = servings;
}
public Builder calories(int val)
{ calories = val; return this; }
public Builder fat(int val)
{ fat = val; return this; }
public Builder sodium(int val)
{ sodium = val; return this; }
public Builder carbohydrate(int val)
{ carbohydrate = val; return this; }
public NutritionFacts build() {
return new NutritionFacts(this);
}
}
private NutritionFacts(Builder builder) {
servingSize = builder.servingSize;
servings = builder.servings;
calories = builder.calories;
fat = builder.fat;
sodium = builder.sodium;
carbohydrate = builder.carbohydrate;
}
public static void main(String[] args) {
NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8)
.calories(100).sodium(35).carbohydrate(27).build();
}
}
μ΄ ν΄λμ€λ λΆλ³μ΄λ©°, λΉλμ μΈν° λ©μλλ€μ λͺ¨λ λΉλ μμ μ λ°ννλ€. (λ¬Όνλ₯΄λ―νΈμΆ - ν루μΈνΈλ©μλ, λ©μλ μ°μ). λ§μ§λ§μ build()μμ μ΄ κ°μ²΄μ μμ±μμ builderμΈμ€ν΄μ€λ₯Ό λ겨μ€μ μμ±νκ² λλ€.
λΉλ ν¨ν΄μ μμ± λΉμ©μ΄ λ€μ§λ§ 맀κ°λ³μκ° μ μ°¨ λμ΄λλ©΄ κ΄λ¦¬κ° λ μ΄λ ΅λ€.
→ 맀κ°λ³μκ° λ§λ€λ©΄ λΉλ ν¨ν΄μ ννμ. (κ°κ²°νκ³ μμ νλ€)
μμ΄ν 3 : private μμ±μλ μ΄κ±° νμ μΌλ‘ μ±κΈν΄μμ 보μ¦νλΌ
-νΉμ§-
- μ±κΈν€ : μΈμ€ν΄μ€λ₯Ό μ€μ§ νλλ§ μμ±ν μ μλ ν΄λμ€λ₯Ό λ§νλ€.
- ν΄λμ€λ₯Ό μ±κΈν€μΌλ‘ λ§λ€λ©΄ μ΄λ₯Ό μ¬μ©νλ ν΄λΌμ΄μΈνΈλ₯Ό ν μ€νΈνκΈ°κ° μ΄λ €μμ§λ€.
- → μ±κΈν΄ μΈμ€ν΄μ€λ₯Ό κ°μ§ mock ꡬνμΌλ‘ λ체ν μ μμ
μ μ ν©ν°λ¦¬ λ°©μμ μ±κΈν΄
// μ½λ 3-2 μ μ ν©ν°λ¦¬ λ°©μμ μ±κΈν΄ (24μͺ½)
public class Elvis {
private static final Elvis INSTANCE = new Elvis();
private Elvis() { }
public static Elvis getInstance() { return INSTANCE; }
public void leaveTheBuilding() {
System.out.println("Whoa baby, I'm outta here!");
}
// μ΄ λ©μλλ λ³΄ν΅ ν΄λμ€ λ°κΉ₯(λ€λ₯Έ ν΄λμ€)μ μμ±ν΄μΌ νλ€!
public static void main(String[] args) {
Elvis elvis = Elvis.getInstance();
elvis.leaveTheBuilding();
}
}
© 2022 GitHub, Inc.
- μνλ€λ©΄ μ μΌν μΈμ€ν΄μ€κ° μλ νΈμΆλ§λ€ λ€λ₯Έ μΈμ€ν΄μ€λ₯Ό λ겨주λ ν©ν°λ¦¬ λ©μλλ‘ λ§λ€ μ μλ€.
λ¬Έμ μ μ μ±κΈν΄ ν΄λμ€λ₯Ό μ§λ ¬ννλ©΄ μμ§λ ¬ν μ μλ‘μ΄ μΈμ€ν΄μ€κ° μκΈ΄λ€λ μ μ΄λ€.
μ΄λ₯Ό ν΄κ²°νκΈ° μν΄ readResoverλ©μλλ₯Ό μ μν΄ μ±κΈν΄μ 보μ₯νλ€.
// readResolve λ©μλλ₯Ό μ μνλ€. μμ§λ ¬ν μ νΈμΆ
private Object readResolve() {
// μ±κΈν΄μ 보μ₯νκΈ° μν¨!
return INSTANCE;
}
μ΄κ±° νμ λ°©μμ μ±κΈν΄μ΄ κ°κ²°νκ³ μ’λ€κ³ νλ€..
μμ΄ν 4 : μΈμ€ν΄μ€νλ₯Ό λ§μΌλ €κ±°λ private μμ±μλ₯Ό μ¬μ©νλΌ
μ μ λ©€λ²λ§ λ΄μ μ νΈλ¦¬ν° ν΄λμ€μ κ²½μ° μΈμ€ν΄μ€λ‘ λ§λ€μ΄ μ¬μ©νλ €λ κ²μ΄ μλλ€. (μμ±μλ₯Ό λ§λ€ νμλ μ¬μ©ν μ΄μ λ μλ€)
νμ§λ§, μμ±μλ₯Ό μ μνμ§ μμΌλ©΄ κΈ°λ³Έμμ±μκ° μλμΌλ‘ μμ±λλ€.
κ·Έλ¬λ―λ‘ μμ±μλ₯Ό privateμΌλ‘ μ μν΄μ ν΄λμ€μ μΈμ€ν΄μ€νλ₯Ό λͺ μμ μΌλ‘ λ§μ μ μλ€.
μμ΄ν 5 : μμμ μ§μ λͺ μνμ§ λ§κ³ μμ‘΄ κ°μ²΄ μ£Όμ μ μ¬μ©νλΌ
λ§μ ν΄λμ€κ° νλ μ΄μμ μμμ μμ‘΄νλ€. μ¬μ©νλ μμμ λ°λΌ λμμ΄ λ¬λΌμ§λ ν΄λμ€μλ μ μ μ νΈλ¦¬ν° ν΄λμ€λ μ±κΈν΄ λ°©μμ΄ μ ν©νμ§ μλ€.
ν΄λμ€κ° μ¬λ¬ μμ μΈμ€ν΄μ€λ₯Ό μ§μνλλ‘ μΈμ€ν΄μ€λ₯Ό μμ±ν λ νμν μμμ λ겨주λ λ°©μμ μ¬μ©νμ (μμ‘΄ κ°μ²΄ μ£Όμ )
- ν©ν 리λ₯Ό μ£Όμ ν΄μ λͺ μν νμ μ νμνμ μ μ΄λ€ κ²μ΄λ μ§ μμ±ν μλ μλ€.
- μμ‘΄ κ°μ²΄ μ£Όμ μ ν΄λμ€μ μ μ°μ±, μ¬μ¬μ©μ±, ν μ€νΈ μ©μ΄μ±μ κ°μ νλ€.
μμ΄ν 6 : λΆνμν κ°μ²΄ μμ±μ νΌνλΌ
λκ°μ κΈ°λ₯μ μ 곡νλ κ°μ²΄λ₯Ό μ¬μ©νλ€λ©΄ λ§€λ² μμ±νμ§λ§κ³ κ°μ²΄ νλλ₯Ό μ¬μ¬μ©ν΄λΌ.
λ§€λ² μλ‘μ΄ κ°μ²΄λ₯Ό λ§λλ κ²μ λΉμ©μ΄λ€.
μ¬μ¬μ©μ΄ νμνλ©΄ μμ±μ λμ μ μ ν©ν 리 λ©μλλ₯Ό μ¬μ©ν΄ μμ±λ κ°μ²΄λ₯Ό μ¬μ¬μ©νμ.
μ€ν λ°μ±μ λΆνμν κ°μ²΄ μμ±μ μ λ°ν μ μλ€. μ‘°μ¬νμ.
private static long sum(){
Long sum = 0L;
for(long i = 0; i<= Integer.MAX_VALUE; i++)
sum +=i;
return sum;
}
// Long μΈμ€ν΄μ€ 2^31κ° μμ±νκ² λ¨
μμ¦μλ JVM κ°λΉμ§ 컬λ ν°κ° μ΅μ νκ° μλμ΄μμ΄ κ°μ²΄ νμ μμ±νλ κ²λ³΄λ€ λΉ λ₯΄λ€. μλͺ»λ λ°λ³΅μ μ¬μ©μ λ§μ νΌν΄λ₯Ό λΆλ¬μ€λ―λ‘ μ‘°μ¬ν΄μ μ¬μ©ν΄μΌνλ€.
μμ΄ν 7 : λ€ μ΄ κ°μ²΄ μ°Έμ‘°λ₯Ό ν΄μ νλΌ
κ°λ°μ§ 컬λ ν°λ λ©λͺ¨λ¦¬ κ΄λ¦¬λ₯Ό ν΄μ£Όμ§λ§ κ°λ°μκ° λ©λͺ¨λ¦¬ κ΄λ¦¬λ₯Ό μμ μν΄λ λλκ²μ μλλ€.
package effectivejava.chapter2.item7;
import java.util.*;
// μ½λ 7-1 λ©λͺ¨λ¦¬ λμκ° μΌμ΄λλ μμΉλ μ΄λμΈκ°? (36μͺ½)
public class Stack {
private Object[] elements;
private int size = 0;
private static final int DEFAULT_INITIAL_CAPACITY = 16;
public Stack() {
elements = new Object[DEFAULT_INITIAL_CAPACITY];
}
public void push(Object e) {
ensureCapacity();
elements[size++] = e;
}
public Object pop() {
if (size == 0)
throw new EmptyStackException();
return elements[--size];
}
/**
* μμλ₯Ό μν 곡κ°μ μ μ΄λ νλ μ΄μ ν보νλ€.
* λ°°μ΄ ν¬κΈ°λ₯Ό λλ €μΌ ν λλ§λ€ λλ΅ λ λ°°μ© λλ¦°λ€.
*/
private void ensureCapacity() {
if (elements.length == size)
elements = Arrays.copyOf(elements, 2 * size + 1);
}
// // μ½λ 7-2 μ λλ‘ κ΅¬νν pop λ©μλ (37μͺ½)
// public Object pop() {
// if (size == 0)
// throw new EmptyStackException();
// Object result = elements[--size];
// elements[size] = null; // λ€ μ΄ μ°Έμ‘° ν΄μ
// return result;
// }
public static void main(String[] args) {
Stack stack = new Stack();
for (String arg : args)
stack.push(arg);
while (true)
System.err.println(stack.pop());
}
}
μ μ½λλ λ©λͺ¨λ¦¬ λμκ° λ°μνλ€.
μ€νμ΄ pop() νκ³ λ μ¬μ ν λ€ μ΄ μ°Έμ‘°λ₯Ό κ°μ§κ³ μκΈ° λλ¬Έμ κ°λ°μ§ 컬λ ν°κ° λ©λͺ¨λ¦¬λ₯Ό νμνμ§ λͺ»νλ€.
μ΄λ¬ν λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄μλ λ¨μν elements[size] = null; μ²λ¦¬λ§ νλ©΄ λλ€. (μ°Έμ‘° ν΄μ )
λ©λͺ¨λ¦¬λ₯Ό μ§μ κ΄λ¦¬νλ ν΄λμ€λΌλ©΄ λ©λͺ¨λ¦¬ λμμ μ£Όμνμ.
μμ΄ν 8 : finalizerμ cleaner μ¬μ©μ νΌνλΌ
λ κ°μ§ κ°μ²΄ μλ©Έμ.
finalizer
cleaner
- λ λ€ κ²°κ΅ μμΈ‘ν μ μκ³ μΌλ°μ μΌλ‘ λΆνμν¨.
- μ¦μ μμμ νμνλ€λ 보μ₯ μμ. (νμνλ€κ³ μμνκ³ μ€ν μ μκΈ°μΉ λͺ»ν μ€λ₯λ₯Ό λ§λ μ μμ)
- νΉν λ°μ΄ν°λ² μ΄μ€ λ½ μμ ν΄μ κ°μ κ²μ μ΄ λμ 맑겨 λμΌλ©΄ μμ€ν μμ²΄κ° μμν λ©μΆ μ μλ€.
- 보μμμ·¨μ½ν¨
- μ±λ₯ νλ½
μμ΄ν 9 : try-finally 보λ€λ try-with-resourcesλ₯Ό μ¬μ©ν΄λΌ
μμλ«κΈ°μ μμ λ§μΌλ‘ finallizerλ₯Ό μ¬μ©νκΈ°λ νμ§λ§ λ§€μ° λ―Ώμ λ§ νμ§ λͺ»νλ€ (μ΄μ μμ΄ν )
try-finallyλ₯Ό μ¬μ©νλ©΄ μμμ νμν μ μλ€. νμ§λ§ μμμ΄ μ¬λ¬κ°λΌλ©΄..?
// μ½λ 9-2 μμμ΄ λ μ΄μμ΄λ©΄ try-finally λ°©μμ λ무 μ§μ λΆνλ€! (47μͺ½)
static void copy(String src, String dst) throws IOException {
InputStream in = new FileInputStream(src);
try {
OutputStream out = new FileOutputStream(dst);
try {
byte[] buf = new byte[BUFFER_SIZE];
int n;
while ((n = in.read(buf)) >= 0)
out.write(buf, 0, n);
} finally {
out.close();
}
} finally {
in.close();
}
}
κ°λ μ±λ λ¨μ΄μ§μ§λ§
λ λ²μ§Έ tryμμ μμΈ λ°μ μ 첫λ²μ§Έ μμΈλ₯Ό λ¨Ήμ΄λ²λ¦°λ€. μ΄λ μΆμ λ΄μμ λν μ λ³΄κ° λ¨μ§ μμ λλ²κΉ μ μ΄λ ΅κ² νλ€.
try-with-resourcesλ₯Ό μ¬μ©νλ©΄μ μ΄λ¬ν λ¬Έμ κ° ν΄κ²°λμλ€.
static void copy(String src, String dst) throws IOException{
try(InputStream in = new FileInputStream(src);
OutputStream out = new FileOutputStream(dst)) {
byte[] buf = new byte[BUFFER_SIZE];
int n;
while ((n = in.read(buf)) >= 0)
out.write(buf, 0,n);
}
}
tryλ¬Έμ μ€μ²©νμ§ μκ³ μ¬μ©ν μ μκ³ μ½κ² μμμ νμν μ μλ€.
'πμ½μ μ± μ 리 > μ΄νν°λΈμλ°' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[μ΄νν°λΈ μλ°] 7μ₯ : λλ€μ μ€νΈλ¦Ό (0) | 2022.03.23 |
---|---|
[μ΄νν°λΈ μλ°] 6μ₯ : μ΄κ±° νμ κ³Ό μ λν μ΄μ (0) | 2022.03.21 |
[μ΄νν°λΈ μλ°] 5μ₯ : μ λ€λ¦ (0) | 2022.03.14 |
[μ΄νν°λΈ μλ°] 4μ₯ : ν΄λμ€μ μΈν°νμ΄μ€ (0) | 2022.03.14 |
[μ΄νν°λΈ μλ°] 3μ₯ : λͺ¨λ κ°μ²΄μ κ³΅ν΅ λ©μλ (0) | 2022.03.09 |