[Java] μλ° ν ν¬ μΈν°λ·° part3
ππ»Java 8
βΌ μ€νΈλ¦ΌStream APIμ λν΄ μ€λͺ
ν΄μ£ΌμΈμ.
- Java 8μμ λμ¨ ν¨μν μΈν°νμ΄μ€, μΌλ ¨μ element λ€μ λν μ°μ°μ μμ°¨μ , λλ λ³λ ¬μ μΌλ‘ μ²λ¦¬ν΄ μ€λ€.
- λ°μ΄ν° μμ€μ λν 곡ν΅λ μ κ·Ό λ°©μμ μ 곡νλ€.
- μ€νΈλ¦Όμ μλ³Έ λ°μ΄ν°λ₯Ό λ³κ²½νμ§ μλλ€.
- μ€νΈλ¦Όμ μΈλΆ λ°λ³΅μ ν΅ν΄ μμ νλ 컬λ μ κ³Όλ λ¬λ¦¬ λ΄λΆ λ°λ³΅(internal iteration)μ ν΅ν΄ μμ μ μννλ€.
- μ€νΈλ¦Όμ μ¬μ¬μ©μ΄ κ°λ₯ν 컬λ μ κ³Όλ λ¬λ¦¬ λ¨ ν λ²λ§ μ¬μ©ν μ μλ€.
- μ€νΈλ¦Όμ μ°μ°μ νν°(filter)-λ§΅(map) κΈ°λ°μ APIλ₯Ό μ¬μ©νμ¬ μ§μ°(lazy) μ°μ°μ ν΅ν΄ μ±λ₯μ μ΅μ ννλ€.
- μ€νΈλ¦Όμ parallelStream() λ©μλλ₯Ό ν΅ν μμ¬μ΄ λ³λ ¬ μ²λ¦¬λ₯Ό μ§μνλ€.
- μ€νΈλ¦Όμ [μ€νΈλ¦Όμ μμ± -> μ€νΈλ¦Όμ μ€κ° μ°μ° -> μ€νΈλ¦Όμ μ΅μ’ μ°μ°] μ μΈ κ°μ§ λ¨κ³μ κ±Έμ³μ λμνλ©°, μ€κ° μ°μ°μ κ²½μ° Streamννλ‘ κ²°κ³Όλ₯Ό λ°ννκΈ° λλ¬Έμ μ°μμ μΌλ‘ μ°κ²°ν΄μ μ¬μ©ν μ μλ€.
βΌ μ€νΈλ¦Όμ΄ λμ€κ²λ μ΄μ λ?
- μλ°μμ λ°°μ΄μ΄λ 컬λ μ μ μ¬μ©ν λ μ¬κΈ°μ μ μ₯λ λ°μ΄ν°μ μ κ·ΌνκΈ° μν΄μλ λ°λ³΅λ¬Έμ΄λ λ°λ³΅μ(Iterator)λ₯Ό μ¬μ©νμ¬ λ°μ΄ν°μ μ κ·Όν΄μΌνλλ°, κ·Έλ κ² λλ©΄ μ½λκ° λ무 κΈΈμ΄μ§κ³ κ°λ μ±λ λ¨μ΄μ§κ³ , μ½λμ μ¬μ¬μ©μ΄ κ±°μ λΆκ°λ₯ν μνμ μ½λκ° νμνλ€. μ΄λ¬ν λ¬Έμ μ μ 극볡νκΈ° μν΄ μ€νΈλ¦Όμ΄ λ±μ₯νλ€.
βΌ μΌλ°μ μΈ for-loop λ³΄λ€ μ€νΈλ¦Όμ for-eachκ° λλ¦°μ΄μ λ₯Ό μ€λͺ ν΄μ£ΌμΈμ.
- μ΅μ νλ¬Έμ
Streamμ κ²½μ° λΉκ΅μ μ΅κ·Όμ λμ¨ κΈ°λ₯μ΄κΈ° λλ¬Έμ Streamμ λν΄μ μΆ©λΆν μ΅μ νκ° μ§νλμ§ μμμ κ²μ΄λΌλ μΆμΈ‘ - forλ¬Έμ λ¨μ μΈλ±μ€ κΈ°λ°
forλ¬Έμ λ¨μ μΈλ±μ€ κΈ°λ°μΌλ‘ λλ λ°λ³΅λ¬ΈμΌλ‘ λ©λͺ¨λ¦¬ μ κ·Όμ΄κΈ° λλ¬Έμ Streamμ λΉν΄ λΉ λ₯΄κ³ μ€λ²ν€λλ μλ€.
streamμ κ²½μ°λ JVMμ΄ μ²λ¦¬ν΄μ€μΌνλ κ²λ€μ΄ λ§μ μ€ν μ λ릴 μ λ°μ μλ€.
βΌ ν¨μν μΈν°νμ΄μ€μλν΄ μ€λͺ ν΄μ£ΌμΈμ.
- ν¨μν μΈν°νμ΄μ€λ 1 κ°μ μΆμ λ©μλλ₯Ό κ°λ μΈν°νμ΄μ€λ₯Ό λ§νλ€.
β‘ μΆμ λ©μλκ° νλλΌλ λ»μ default method λλ static method λ μ¬λ¬ κ° μ‘΄μ¬ν΄λ μκ΄ μλ€λ λ»μ λλ€. - Java8 λΆν° μΈν°νμ΄μ€λ κΈ°λ³Έ ꡬν체λ₯Ό ν¬ν¨ν λν΄νΈ λ©μλ (default method) λ₯Ό ν¬ν¨ν μ μλ€.
- μ¬λ¬ κ°μ λν΄νΈ λ©μλκ° μλλΌλ μΆμ λ©μλκ° μ€μ§ νλλ©΄ ν¨μν μΈν°νμ΄μ€μ΄λ€.
- μλ°μ λλ€ ννμμ ν¨μν μΈν°νμ΄μ€λ‘λ§ μ¬μ© κ°λ₯νλ€.
- @FunctionalInterface μ΄λ Έν μ΄μ μ μ¬μ©νλλ°, μ΄ μ΄λ Έν μ΄μ μ ν΄λΉ μΈν°νμ΄μ€κ° ν¨μν μΈν°νμ΄μ€ 쑰건μ λ§λμ§ κ²μ¬ν΄μ€λ€.
- @FunctionalInterface μ΄λ Έν μ΄μ μ΄ μμ΄λ ν¨μν μΈν°νμ΄μ€λ‘ λμνκ³ μ¬μ©νλ λ° λ¬Έμ λ μμ§λ§, μΈν°νμ΄μ€ κ²μ¦κ³Ό μ μ§λ³΄μλ₯Ό μν΄ λΆμ¬μ£Όλ κ² μ’λ€.
βΌ Javaμμ κΈ°λ³Έ μ 곡νλ ν¨μν μΈν°νμ΄μ€μλν΄ μ€λͺ ν΄μ£ΌμΈμ.
//κΈ°λ³Έ μμ νμ
@FunctionalInterface
public interface Predicate<T> {
boolean test(T t);
}
- Predicate
Predicate ν¨μν μΈν°νμ΄μ€λ T νμ μ μΈμλ₯Ό λ°μ boolean κ°μ λ°νν©λλ€.
β‘ boolean test(T t); - Consumer
μ΄λ¦μμ μ μ μλ―μ΄ Consumer ν¨μν μΈν°νμ΄μ€λ λ°μ΄ν°λ§ μλΉνκ³ μ무κ²λ μμ±νμ§ μμ΅λλ€. T νμ μ μΈμμ λν΄ λͺ¨λ μμ μ μνν μ μμΌλ©°, λ°ν νμ μ voidμ λλ€.
β‘ void accept(T t); - Supplier
Supplier ν¨μν μΈν°νμ΄μ€λ λ§€κ°λ³μκ° μ‘΄μ¬νμ§ μμΌλ©°, 곡κΈμλΌλ μ΄λ¦μ²λΌ μ무κ²λ λ°μ§ μκ³ T νμ μ κ°μ²΄λ₯Ό λ°νν©λλ€.
β‘ T get(); - Function
Function ν¨μν μΈν°νμ΄μ€λ T νμ μ μΈμλ₯Ό λ°μ νΉμ μμ μ μν ν R νμ μ κ°μ²΄λ₯Ό λ°νν©λλ€.
μνμμμμ ν¨μμ²λΌ νΉμ κ°μ λ°μμ λ€λ₯Έ κ°μΌλ‘ λ°νν΄μ£Όλ©°, T μ R μ κ°μ νμ μ μ¬μ©ν μλ μμ΅λλ€.
Consumerμ Supplierμ μ‘°ν©μ λλ€.
β‘ R apply(T t); - Runnable
Runnable ν¨μν μΈν°νμ΄μ€λ λ§€κ°λ³μμ λ°ν νμ μ΄ μ‘΄μ¬νμ§ μμ΅λλ€. run() λ©μλμ μ μλ μ½λλ§ μ€νν©λλ€.
Runnable μ΄λΌλ μ΄λ¦μ λ§κ² "μ€ν κ°λ₯ν" μ΄λΌλ λ»μ λνλ΄λ©° μ΄λ¦ κ·Έλλ‘ μ€νλ§ ν μ μλ€κ³ μκ°νλ©΄ λ©λλ€.
βΌ Optional μλν΄ μ€λͺ ν΄μ£ΌμΈμ.
- Java8μμλ Optional<T> ν΄λμ€λ₯Ό μ¬μ©ν΄ NPE(NullPointerException)λ₯Ό λ°©μ§ν μ μλλ‘ λμμ€λ€.
- Optional<T>λ nullμ΄ μ¬ μ μλ κ°μ κ°μΈλ Wrapper ν΄λμ€λ‘, μ°Έμ‘°νλλΌλ NPEκ° λ°μνμ§ μλλ‘ λμμ€λ€. Optional ν΄λμ€λ μλμ κ°μ valueμ κ°μ μ μ₯νκΈ° λλ¬Έμ κ°μ΄ nullμ΄λλΌλ λ°λ‘ NPEκ° λ°μνμ§ μμΌλ©°, ν΄λμ€μ΄κΈ° λλ¬Έμ κ°μ’ λ©μλλ₯Ό μ 곡ν΄μ€λ€.
β‘ μ¦, Optionalμ null λλ κ°μ κ°μΈμ NPE(NullPointerException)λ‘λΆν° λΆλ΄μ μ€μ΄κΈ° μν΄ λ±μ₯ν Wrapper ν΄λμ€μ΄λ€.
ππ»Modifier
βΌ μ μ΄μλ(modifier) ?
λ³μ, λ©μλ, ν΄λμ€ μ μΈλΆμ νμλμ΄ λΆκ°μ μΈ μλ―Έλ₯Ό λΆμ¬νλ ν€μλλ₯Ό λ§νλ€. μ μ΄μλ μ κ·Ό μ μ΄μμ κ·Έ μΈμ μ μ΄μ, λ κ°μ§ μ’ λ₯λ‘ λλ μ μλ€.
- μ κ·Όμ μ΄μλ
λ³μ λλ λ©λͺ¨λ¦¬ μ κ·Ό λ²μλ₯Ό μ€μ ν΄μ£ΌκΈ° μν΄ μ¬μ©νλ Javaμ μμ½μ΄λ₯Ό μλ―Έν©λλ€. μ΄ 4κ°μ§ μ’ λ₯κ° μμ΅λλ€.
μ κ·Ό μ μ΄μλ ν λ²μ λ€ κ°μ§ μ€ νλλ§ μ νν΄μ μ¬μ©ν μ μμ΅λλ€.- publicμ μ κ·Ό μ νμ΄ μμΌλ―λ‘, κ°μ νλ‘μ νΈ λ΄ μ΄λμλ μ¬μ© κ°λ₯ν©λλ€.
- protectedλ ν΄λΉ ν¨ν€μ§ λ΄, λ€λ₯Έ ν¨ν€μ§μμ μμλ°μ μμ ν΄λμ€μμ μ¬μ©μ΄ κ°λ₯ν©λλ€.
- defaultλ ν΄λΉ ν¨ν€μ§ λ΄μμλ§ μ κ·Όμ΄ κ°λ₯ν©λλ€.
- privateλ ν΄λΉ ν΄λμ€ λ΄μμλ§ μ κ·Όμ΄ κ°λ₯ν©λλ€.
- κ·ΈμΈμ μ μ΄μ
- staticμ ν΄λμ€μ, 곡ν΅μ μΈμ μλ―Έλ₯Ό κ°μ§κ³ μλ€. staticμ΄ λΆμ λ©€λ²λ³μμ λ©μλ, μ΄κΈ°ν λΈλμ μΈμ€ν΄μ€κ° μλ ν΄λμ€μ κ΄κ³λ κ²μ΄κΈ° λλ¬Έμ, μΈμ€ν΄μ€ μμ± μ¬λΆμ κ΄κ³ μμ΄ μ¬μ©μ΄ κ°λ₯νλ€.
- finalμ λ§μ§λ§μ, λ³κ²½λ μ μλ μλ―Έλ₯Ό κ°μ§κ³ μκ³ , κ±°μ λͺ¨λ λμμ μ¬μ©μ΄ κ°λ₯νλ€.
- abstractμ μΆμμ, λ―Έμμ±μ μλ―Έλ₯Ό κ°μ§κ³ μλ€. λ©μλμ μ μΈλΆμλ§ μμ±νκ³ , μ€μ μνλ΄μ©μ ꡬννμ§ μμ μΆμ λ©μλλ₯Ό μ μΈνλλ° μ¬μ©λλ€
βΌ λ©μλ parameter μ final μ λΆμ΄λ κ²½μ°λ₯Ό μ΄λ»κ² μκ°νμλμ§ μ€λͺ ν΄μ£ΌμΈμ
- λΆλ³ μ±μ§μ κ°μ‘°νλ €λ κ²½μ° final ν€μλλ₯Ό λΆμ¬ μ΄ λ§€κ°λ³μμ κ°μ΄ λ©μλ λ΄μμ λ³κ²½λμ§ μμμΌ ν¨μ λͺ μμ μΌλ‘ 보μ₯νκ³ μ νλ μλλ‘ μ¬μ©ν μ μλ€κ³ μκ°ν©λλ€.
- νμ§λ§, final ν€μλλ₯Ό λ무 λ¨λ°νλ©΄ μ½λκ° λ³΅μ‘ν΄μ§κ³ κ°λ μ±μ΄ λ¨μ΄μ§ μ μμ΅λλ€. λ°λΌμ λ©μλμ λ‘μ§μ΄ 볡μ‘ν΄μ§μ§ μλλ€λ©΄, μΌλ°μ μΌλ‘ λ©μλ λ§€κ°λ³μμ finalμ κ΅³μ΄ λΆμ΄μ§ μλ κ²μ΄ μΌλ°μ μ λλ€.
- μ€λ²λΌμ΄λ©μ΄ λΆκ°νκ³ μ€λ²λ‘λ©λ§ κ°λ₯ν΄μ§λ€.
ππ»Synchronization
βΌ λκΈ°ν(synchronization) λ?
μ¬λ¬ κ°μ μ°λ λκ° ν κ°μ μμμ μ¬μ©νκ³ μ ν λ, νμ¬ λ°μ΄ν°λ₯Ό μ¬μ©νκ³ μλ μ°λ λλ₯Ό μ μΈνκ³ λλ¨Έμ§ μ°λ λλ€μ λ°μ΄ν°μ μ κ·Όν μ μκ² λ§λ κ°λ μ λλ€.
- λ©ν°μ€λ λ μ κ·Ό μ ν ν€μλ μ΄λ€.
- λ©μλ λ¨μ, λΈλ‘ λ¨μ μ μ© κ°λ₯νλ€.
- λ¨, μκ³μμμ΄ μμμλ‘ μ’κΈ° λλ¬Έμ λΈλ‘ λ¨μμ μ¬μ©μ κΆμ₯νλ€.
βΌ synchronized λ₯Ό μ¬μ©ν μ sychronized method, sychronized block, static sychronized method, static synchonized block μ 4κ°μ§ μ°μμ κ²½μ°μ λν΄ μ€λͺ ν΄μ£ΌμΈμ.
- sychronized method
- ν΄λμ€ μΈμ€ν΄μ€ μ lockμ κ²λλ€.
- μΈμ€ν΄μ€μ lockμ κ±°λ synchronized ν€μλλ synchronizedκ° μ μ©λ λ©μλλΌλ¦¬ μΌκ΄μ μΌλ‘ lockμ 곡μ ν©λλ€.
- static sychronized method
- staticμ΄ λΆμ synchronized methodλ μΌλ°μ μΌλ‘ μκ°νλ static μ±μ§μ κ°μΌλ―λ‘ μΈμ€ν΄μ€κ° μλ ν΄λμ€ λ¨μ λ‘ lockμ κ²λλ€.
- λ€λ₯Έ μΈμ€ν΄μ€λλΌλ static λ©μλμ synchronizedκ° λΆμ κ²½μ° lockμ 곡μ νλ κ²μ νμΈν μ μμ΅λλ€.
- static synchronized methodμ synchronized methodμ lockμ 곡μ λμ§ μμ΅λλ€.
- sychronized block
- μΈμ€ν΄μ€μ block λ¨μ λ‘ lockμ κ±Έκ³ lock κ°μ²΄λ₯Ό μ§μ ν΄μΌ ν©λλ€.
- blockμ thisλ₯Ό λͺ μν κ²½μ° methodμ synchornizedλ₯Ό λΆμΈ κ²μ²λΌ μΈμ€ν΄μ€ λ¨μλ‘ lockμ΄ κ±Έλ¦½λλ€.
- blockμλ κ°μ²΄λ₯Ό μ§μ ν μλ μκ³ class νμμΌλ‘ λκΈ°λ©΄ ν΄λΉ classμ lockμ κ±Έ μ μμ΅λλ€.
- static synchonized block
- thisμ κ°μ΄ νμ¬ κ°μ²΄λ₯Ό κ°λ₯΄ν€λ ννμ μ¬μ©ν μ μμ΅λλ€.
- static synchronized method λ°©μκ³Όμ μ°¨μ΄λ lock κ°μ²΄λ₯Ό μ§μ νκ³ block λ²μλ₯Ό νμ μ§μ μ μλ€λ μ μ λλ€. ν΄λμ€ λ¨μλ‘ lockμ 곡μ νλ€λ μ μ κ°μ΅λλ€.
- blockμ μΈμλ‘ μ μ μΈμ€ν΄μ€λ ν΄λμ€λ§ μ¬μ©ν©λλ€.
- thisμ κ°μ΄ νμ¬ κ°μ²΄λ₯Ό κ°λ₯΄ν€λ ννμ μ¬μ©ν μ μμ΅λλ€.
βΌ synchronized μ¬μ© μ λ°λλ½μ΄ λ°μνλ μν©μ μ€λͺ ν΄μ£ΌμΈμ.
- μνΈ λ°°μ (Mutual Exclusion) : ν μμμ λν΄ μ¬λ¬ μ°λ λ λμ μ κ·Ό λΆκ°
- μ μ μ λκΈ° (Hold and Wait) : μμμ κ°μ§κ³ μλ μνμμ λ€λ₯Έ μ°λ λκ° μ¬μ©νκ³ μλ μμ λ°λ©μ κΈ°λ€λ¦¬λ κ²
- λΉμ μ (Non Preemptive) : λ€λ₯Έ μ°λ λμ μμμ μ€ν μ€κ°μ κ°μ λ‘ κ°μ Έμ¬ μ μμ
- ννλκΈ° (Circle Wait) : κ° μ°λ λκ° μνμ μΌλ‘ λ€μ μ°λ λκ° μꡬνλ μμμ κ°μ§κ³ μλ κ²
μμ 4κ°μ§ 쑰건μ λͺ¨λ μΆ©μ‘±ν κ²½μ° λ°λλ½μ΄ λ°μνμ¬ μλ¬΄λ° μ€ννμ§ λͺ»ν μ± λ¬΄νμ λκΈ°νκ² λ©λλ€.
βΌ volatile ν€μλμ λν΄ μ€λͺ ν΄μ£ΌμΈμ.
λκΈ°ν λ¬Έμ λ°©μ§λ₯Ό μν΄ volatileν€μλλ₯Ό μ¬μ©ν©λλ€.
λ³μλ₯Ό volatileλ‘ μ μΈνλ©΄ λ©μΈ λ©λͺ¨λ¦¬ μμμ μ°Έμ‘°νκ² λλ―λ‘ λ€λ₯Έ μ€λ λλΌλ κ°μ λ©λͺ¨λ¦¬ μ£Όμλ₯Ό μ°Έμ‘°νκ² λ©λλ€.
νΉμ§μ μλμ κ°μ΅λλ€.
- volatileλ‘ μ μΈλ λ³μκ° μλ μ½λλ μ΅μ νλμ§ μμ΅λλ€.
- volatile ν€μλλ λ³μλ₯Ό 'Main Memoryμ μ μ₯νκ² λ€'λΌκ³ λͺ μνλ κ²μ λλ€.
- λ³μμ κ°μ Readν λλ§λ€ CPU cacheμ μ μ₯λ κ°μ΄ μλ, Main Memoryμμ μ½μ΅λλ€.
βΌ lockμ μ¬μ©νμ μμ volatileμ μ¬μ©ν μμ, volatile λ¨μ μ λν΄μ μ€λͺ ν΄μ£ΌμΈμ.
- Multi Thread νκ²½μμ μ¬λ¬κ°μ Threadκ° writeνλ μν©μ΄λΌλ©΄ race conditionraceμ ν΄κ²°ν μ μμ΅λλ€. μ΄λ΄ κ²½μ°μλ synchronizedλ₯Ό μ¬μ©νμ¬ μμμ±(atomic)μ 보μ₯ν΄μΌ ν©λλ€.
ππ»Thread
βΌ μλ°μμ thread λ₯Ό μμ±νλ λ°©λ²κ³Ό μ€ννλ λ°©λ²μ μ€λͺ ν΄μ£ΌμΈμ.
μλ°μμ μ€λ λλ₯Ό μμ±νλ λ°©λ²μ λ κ°μ§κ° μμ΅λλ€.
- Threadλ₯Ό μμλ°λ λ°©λ²
- Thread ν΄λμ€λ₯Ό μμν ν΄λμ€ μ μνλ€.
- run() λ©μλλ₯Ό μ€λ²λΌμ΄λνμ¬ μ€λ λ μ½λ μμ±νλ€.
- μ€λ λ κ°μ²΄λ₯Ό μμ±νλ€.
- start() λ©μλλ‘ μ€λ λλ₯Ό μμνλ€.
- Runnable μΈν°νμ΄μ€λ₯Ό ꡬννλ λ°©λ²
- Runnable μΈν°νμ΄μ€λ₯Ό ꡬννλ ν΄λμ€λ₯Ό μ μνλ€.
- run() λ©μλλ₯Ό μ€λ²λΌμ΄λνμ¬ μ€λ λ μ½λλ₯Ό μμ±νλ€.
- Runnable κ°μ²΄λ₯Ό μμ±νλ€.
- Thread κ°μ²΄λ₯Ό μμ±νλ€.
- start() λ©μλλ‘ μ€λ λλ₯Ό μμνλ€.
μλ°λ λ€μ€ μμμ νμ©νμ§ μκΈ° λλ¬Έμ Thread ν΄λμ€λ₯Ό μμλ°κ² λλ©΄ λ€λ₯Έ ν΄λμ€λ₯Ό μμλ°μμκ° μμ΅λλ€. κ·Έλμ μΈν°νμ΄μ€μΈ Runnableλ‘ κ΅¬ννλ λ°©λ²μ΄ μΌλ°μ μ λλ€. λν μ¬μ¬μ©μ±(reusability)μ΄ λκ³ μ½λμ μΌκ΄μ±(consistency)μ μ μ§ν μ μκΈ° λλ¬Έμ λ³΄λ€ κ°μ²΄μ§ν₯μ μΈ λ°©λ²μ΄λ€.
μ°Έκ³ λ‘, μ¬μ©μκ° μ€λ λ κ°μ²΄λ₯Ό μμ±νκ³ μ€νμμ²μ νλλΌλ μ€λ λκ° μ€νλλ κ²μ μ μ μΌλ‘ JVMμ μν μ€μΌμ₯΄λ¬μ λ°λ¦ λλ€. μ¬μ©μλ Threadμ μ¬λ¬ λ©μλλ€μ ν΅ν΄μ JVMμ ν΄λΉ λͺ λ Ήλ€μ΄ μ€νλλλ‘ μμ²νλ κ²μ λλ€.
*μ€λ λ Thread λ?
μ€λ λλ νλ‘μΈμ€μμμ μ€μ§μ μΌλ‘ μμ
μ μ€ννλ λ¨μλ₯Ό λ§ν©λλ€. μλ°μμλ JVM(Java Virtual Machine)μ μν΄ κ΄λ¦¬λ©λλ€.
νλ‘μΈμ€μλ μ μ΄λ νκ° μ΄μμ μ€λ λκ° μμΌλ©°, Main μ€λ λ νλλ‘ μμνμ¬ μ€λ λλ₯Ό μΆκ° μμ±νκ² λλ©΄ λ©ν° μ€λ λ νκ²½μ΄ λ©λλ€. μ΄λ¬ν μ€λ λλ€μ νλ‘μΈμ€μ 리μμ€λ₯Ό 곡μ νκΈ° λλ¬Έμ ν¨μ¨μ μ΄κΈ΄ νμ§λ§ μ μ¬μ μΈ λ¬Έμ μ μ λ
ΈμΆλ μλ μμ΅λλ€.
βΌ Thread μ€ν μ run()μΌλ‘ μνν λμ start()λ‘ μνν λμμ μ°¨μ΄λ₯Ό μ€λͺ ν΄μ£ΌμΈμ.
- run()
run()μ νΈμΆνλ κ²μ λ¨μν ν΄λμ€μ μ μΈλ λ©μλλ₯Ό νΈμΆνλ κ²μ΄λ€. - start()
start()λ μλ‘μ΄ μ°λ λκ° μμ μ μ€ννλλ° νμν νΈμΆμ€ν(call stack)μ μμ±ν λ€μμ run()μ νΈμΆν΄μ μμ±λ νΈμΆμ€νμ run()μ΄ μ²«λ²μ§Έλ‘ μ¬λΌκ°κ² νλ€.
βΌ μΌλ° λ°©μμμ main threadκ° μ’ λ£λλ©΄ μ΄ν리μΌμ΄μ μ΄ μ’ λ£λ ν λ°, λ©ν°μ€λ λ λ°©μμμ main threadλ μΈμ μ’ λ£λλμ?
- μλ° μ΄ν리μΌμ΄μ μ main μ€λ λκ° main() λ©μλλ₯Ό μ€ννλ©΄μ μμλ©λλ€. main μ€λ λμ νλ¦ μμμ λ©ν° μ€λ λ μ΄ν리μΌμ΄μ μ νμμ λ°λΌ μμ μ€λ λλ₯Ό λ§λ€μ΄ λ³λ ¬λ‘ μ½λλ₯Ό μ€νν μ μκ² λ©λλ€.
- μ±κΈ μ€λ λμ κ²½μ°, λ©μΈ μ€λ λκ° μ’ λ£λλ©΄ νλ‘μΈμ€λ μ’ λ£λμ§λ§, λ©ν° μ€λ λλ λ©μΈ μ€λ λκ° μ’ λ£λλλΌλ μ€ν μ€μΈ μ€λ λκ° νλλΌλ μλ€λ©΄ νλ‘μΈμ€κ° κ³μ μ€νλκ² λ©λλ€. (μ€λ λλ λ³λ ¬μ μΌλ‘ μμ νκΈ° λλ¬Έ)
κ²°κ³Όμ μΌλ‘, λ©ν° μ€λ λμμ λ©μΈ μ€λ λλ return μ λ§λκ±°λ, main λ©μλμ λμ΄μ€λ©΄ μ’ λ£νκ² λλ€.
*μ§λ¬Έμμ μνλ λ΅μ΄ μλ κ² κ°μ λλμ΄ λλλ° λ μ°Ύμλ΄μΌκ² λ€..
βΌ ThreadLocal μ λν΄μ μ€λͺ ν΄μ£ΌμΈμ.
- ThreadLocalμ ν μ°λ λμμ μ½κ³ μ°μ¬μ§ μ μλ λ³μλ₯Ό ν λΉνμ¬ μ κ·Όν μ μλλ‘ ν©λλ€.
- λ©ν° μ°λ λ νκ²½μμ κ° μ°λ λλ§λ€ get(), set() λ©μλλ₯Ό ν΅ν΄ λ 립μ μΌλ‘ λ³μμ μ κ·Όν μ μμ΅λλ€. λ§κ·Έλλ‘ Thread λ΄λΆμμ μ¬μ©νλ μ§μλ³μμ λλ€.
- ThreadLocalμ κΈ°λ³Έ μ¬μ©λ²μ λ€μκ³Ό κ°μ΅λλ€.
- ThreadLocal κ°μ²΄λ₯Ό μμ±ν©λλ€.
- ThreadLocal.set() λ©μλλ₯Ό μ΄μ©νμ¬ νμ¬ threadμ λ‘컬 λ³μμ κ°μ μ μ₯ν©λλ€.
- ThreadLocal.get() λ©μλλ₯Ό μ΄μ©νμ¬ νμ¬ threadμ λ‘컬 λ³μκ°μ μ½μ΄μ΅λλ€.
- ThreadLocal.remove() λ©μλλ₯Ό μ΄μ©νμ¬ νμ¬ thread λ‘컬 λ³μκ°μ μμ ν©λλ€.
βΌ λ©ν°μ°λ λ νκ²½μμ ThreadLocal μ μ¬μ©ν λ μ μν μ μ λν΄ μ€λͺ ν΄μ£ΌμΈμ.
- μ€λ λ λ‘컬μ μ€λ λ ν(thread pool)μ μ¬μ©νλ νκ²½μμλ μ£Όμν΄μΌ ν©λλ€. μ€λ λκ° μ¬νμ©λ μ μκΈ° λλ¬Έμ μ¬μ©μ΄ λλ¬λ€λ©΄ μ€λ λ λ‘컬μ λΉμμ£Όλ κ³Όμ μ΄ νμμ μ΄λ€.
ππ»Error & Exception
βΌ μμΈμ²λ¦¬λ₯Ό νλ λ°©λ²μ λν΄ μ€λͺ ν΄ μ£ΌμΈμ.
- try, catch
μμΈκ° λ°μνμλ μ°λ¦¬λ try ... catch ... finally λΌλ ν€μλλ‘ μμΈλ₯Ό μ²λ¦¬ν μ μκ±°λ λ©μλλ₯Ό νΈμΆν κ³³μΌλ‘ λμ§ μ μμ΅λλ€. ν κ°μ§ μ€μν μ μ μλ°μμ λͺ¨λ μμΈλ Exceptionμ΄λΌλ ν΄λμ€λ₯Ό μμλ°μ΅λλ€.- try λΈλ‘ : κ°μ₯ λ¨Όμ μ€νλλ μ½λλ‘ μ¬κΈ°μμ λ°μν μμΈλ catch λΈλ‘μμ μ²λ¦¬λλ€.
- catch λΈλ‘ : try λΈλ‘μμ λ°μν μμΈ μ½λλ μμΈ κ°μ²΄λ₯Ό μΈμλ‘ μ λ¬λ°μ μ²λ¦¬νλ€.
- finally λΈλ‘ : μμΈμ λ°μ μ 무μ μκ΄μμ΄ λ§μ§λ§μ 무쑰건 μ€νλλ€.
- throws
λ§κ·Έλλ‘ μμΈλ₯Ό λμ§λ κ²μ λ»ν©λλ€.- μμΈλ₯Ό μ¬κΈ°μ μ²λ¦¬νμ§ μμν λ λλ₯Ό λΆλ¬λ€κ° μ°λ λ μμκ² μλ¬ μ²λ¦¬λ₯Ό μ κ°νκ² λ€λ μλ―Έμ΄λ©° μ½λλ₯Ό μ§λ μ¬λμ΄ μ΄ μ μΈλΆλ₯Ό λ³΄κ³ μ΄λ€ μμΈκ° λ°μν μ μλμ§λ μκ² ν΄μ€λλ€.
βΌ Checked Exception κ³Ό Unchecked Exception μ transaction μμΈ μ²λ¦¬ λ°©μμ μ€λͺ ν΄μ£ΌμΈμ.
- Checked Exception
- λͺ μμ μΌλ‘ μμΈ μ²λ¦¬λ₯Ό κ°μ νκΈ° λλ¬Έμ checked exceptionμ΄λΌ λΆλ₯Έλ€.
- μ΄λ Exception ν΄λμ€λ₯Ό μ§μ μμνκ±°λ IOException, SQLException κ°μ νμ ν΄λμ€λ₯Ό μ¬μ©νλ κ²½μ°μ ν΄λΉν©λλ€.
- try~catch, throws λ±μ μ¬μ©νμ¬ μμΈλ₯Ό λμ§λ€.
- μμΈμ²λ¦¬λ₯Ό νμ§ μμΌλ©΄ IDEμμ μ»΄νμΌμ μλ¬λ₯Ό λ±λλ€.
- compile ExceptionμΌλ‘ runtime exception νμ exceptionμ μ μΈνκ³ λ§νλ€.
- Unchecked Exception
- κ°μ νμ§ μκΈ° λλ¬Έμ UnChecked Exceptionμ΄λΌ λΆλ₯Έλ€.
- μ΄ μμΈλ€μ λ°νμ μ λ°μνλ©°, νλ‘κ·Έλλ¨Έμ μ€μλ‘ λνλλ κ²½μ°μ΄λ€.
- μμΈμ²λ¦¬λ₯Ό νμ§ μμλ IDEμμ μλ¬λ₯Ό λ±μ§ μλλ€.
- Runtime ExceptionμΌλ‘ μ€ν μ€ λ°μνλ Exceptionμ λ§νλ€.
- Runtime Exception νμμ NullPointException, IndexOutOfBoundException λ±μ΄ μλ€.
- νΈλμμ μ κ·Έλ₯rollback
- check λ rollback μμν€κ³ 컀λ°νλ€κ³ νλ€
βΌ @Transactional λ μ΄λ»κ² ꡬνλλμ?
- @Transactionalμ λ©μλ λλ ν΄λμ€μ λͺ
μνλ©΄,
AOPλ₯Ό ν΅ν΄ Targetμ΄ μμνκ³ μλ μΈν°νμ΄μ€ λλ Target κ°μ²΄λ₯Ό μμν Proxy κ°μ²΄κ° μμ±λλ©°,
Proxy κ°μ²΄μ λ©μλλ₯Ό νΈμΆνλ©΄ Target λ©μλ μ νλ‘ νΈλμμ μ²λ¦¬λ₯Ό μνν©λλ€.
βΌ @Transactional μ΄ λΆμ§ μμ λ©μλμ λ΄λΆμμ @Transactional μ΄ λΆμ λ©μλλ₯Ό μ¬μ©ν μ, μ΄ λ΄λΆ λ©μλλ @Transactionalμ΄ μ μ©λ κΉμ?
- μ μ©λμ§ μλλ€.
- λ©μλ λ¨μλ‘ νΈλμμ μ΄ λμνλλ°, νΈμΆλλ λ©μλμλ νΈλμμ μ΄ λΆμ΄μμ΄μΌ μ μ©λλ€. λ΄λ¬΄ λ©μλμλ νλ‘μκ°μ²΄κ° μμ΄μ λμνμ§ μλλ€.
μ°Έκ³
- https://brorica.tistory.com/entry/java-stream
- https://bcp0109.tistory.com/313
- https://kangyb.tistory.com/17
- https://icarus8050.tistory.com/95
- https://kadosholy.tistory.com/121
- https://backtony.github.io/java/2022-05-04-java-50/#synchronized-method
- https://ttl-blog.tistory.com/238#%F0%9F%A7%90%20volatile%EC%9D%98%20%EB%AC%B8%EC%A0%9C-1