π‘ Commentμ Annotation (λ λ€ μ£Όμ)
- μ 보λ₯Ό μ λ¬νλ λμμ μ°¨μ΄κ° μμ
- Commentλ κ°λ°μκ° κ°λ°νλ©΄μ μ°Έκ³ νκΈ° μν΄ (μ½λ©ν λ μ£Όλ‘ μ¬μ©νλ μ£Όμ)
( μ½λ μ€νμ μν₯ X )
@Override
μμν΄λμ€μ λ©μλλ₯Ό μ€λ²λΌμ΄λ© ν νμ λ©μλμμ μ΄λ¦μ΄ κ°μ§ μκ±°λ λ°νμμλ¬κ° λ°μν λ λΉ¨κ°μ€λ‘ μλ¬λ₯Ό λ°μμμΌμ€
(μ€λ²λΌμ΄λ©ν λ©μλ μμλ§ λΆμΌ μ μμ)
(μλΆμ¬λ 무κ΄νμ§λ§ κ·Έλ₯ μ 보 μ£Όλ κ²)
@Deprecated
μλ‘μ΄ λ²μ μ΄ μμ΄ λ체λμμΌλ μ΄ κΈ°μ‘΄μ κ²μ μ¬μ©νμ§ λ§λΌ
@FunctionalInterface
ν¨μν μΈν°νμ΄μ€ μ μΈ μμ μ΄ μ μΈμ΄ λ°λ₯΄κ² λμλμ§ νμΈνκ³ μλ κ²½μ° μλ¬ λ°μμμΌμ€
( μ½λ μμ±μ μ€μ λ°©μ§λ₯Ό μν νμΈμ© μ λν
μ΄μ
)
@SuppressWarning
μ»΄νμΌ κ²½κ³ λ©μΈμ§κ° λνλμ§ μκ² ν΄λΌ
( λ€μ κ΄νΈλ₯Ό λΆμ¬ κ·Έ μμ μ΄λ€ κ²½κ³ λ₯Ό μ΅μ ν μ§ μΈ μ μμ )
νΉμ μ λν μ΄μ μ μ μ© λμ μ μ§ κΈ°κ° λ±μ λ€μ κ΄λ¦¬νκΈ° μν μ λν μ΄μ
@Target({})
μ€κ΄νΈ μμ μ λν
μ΄μ
μ μ© λμ μ§μ
@Documented
μ λν
μ΄μ
μ 보λ₯Ό javadoc λ¬Έμμ ν¬ν¨λλλ‘ ν¨
(@Overfide, @SuppressWarning λΉΌκ³ λͺ¨λ μ΄ μ λν
μ΄μ
μ΄ μ μ©λμ΄ μμ)
@Inherited
ν΄λΉ ν΄λμ€μ νμν΄λμ€μλ μ λν
μ΄μ
μμλ°λλ‘ν¨
@Retention
νΉμ μ λν
μ΄μ
μ μ§μ μκ° κ²°μ
-> μΌλ§λ μ μ§λ μ§ < SOURCE (μμ€νμΌμ μ‘΄μ¬) / CLASS (κΈ°λ³Έκ°) / RUNTIME (μ€νμ μ¬μ©) > λ‘ κ²°μ
@Repeatable
μ λν
μ΄μ
μ¬λ¬λ² λΆμΌ μ μλλ‘ νμ©
(μ¬λ¬κ° μ ν μ λν
μ΄μ
λ€μ νλλ‘ λ¬Άμ΄μ£Όλ μ λν
μ΄μ
λ λ³λλ‘ μμ±ν΄μΌν¨)
μ¬μ©μκ° μ§μ μ λν μ΄μ μ μ ν μ¬μ©νλ κ²
@interface μ λν μ΄μ λͺ { //μ λν μ΄μ μ μ νμ μμλͺ (); //μ λν μ΄μ μμ μ μΈ }
λ©μλλ₯Ό κ°λ΅νκ² νννκΈ° μν λ¬Έλ² μμ ( λ λλνκ³ λ κ°νΈν μ½λλ₯Ό μν΄!! )
( λ©μλλ₯Ό μ°Έμ‘°ν΄μ λ§€κ° λ³μμ μ 보 λ° λ¦¬ν΄ νμ
μ μμλ΄μ΄, λλ€μμμ λΆνμν λ§€κ° λ³μλ₯Ό μ κ±° )
Stream μ¬μ©μ νμ©
μ΅λͺ κ°μ²΄(μ΅λͺ ν΄λμ€) π λ°ννμ / μ΄λ¦ μλ΅ κ°λ₯
π‘ μ΅λͺ ν΄λμ€λ?
- κ°μ²΄μ μ μΈκ³Ό μμ±μ λμμ νμ¬ μ€μ§ νλμ κ°μ²΄λ₯Ό μμ±νκ³ , λ¨ νλ²λ§ μ¬μ©λλ μΌνμ© ν΄λμ€
λ°νκ°μ΄ μλ λ©μλμ κ²½μ° π returnλ¬Έ / μΈλ―Έμ½λ‘ (;) λ μλ΅ κ°λ₯
맀κ°λ³μ νμ μ μ½κ² μ μΆν μ μλ κ²½μ° π 맀κ°λ³μ νμ λ μλ΅ κ°λ₯
Ex. β¬οΈ λλ€μ μ¬μ©
// κΈ°μ‘΄ λ°©μ void example (String str) { System.out.println(str); } ---------------------------------------------------------------------------------- // λλ€μ (String str) -> { System.out.println(str);}
Ex. β¬οΈ νΉμ 쑰건μ μΆ©μ‘±ν κ²½μ°
//κΈ°μ‘΄ λ°©μ int sum(int num1, int num2) { //맀κ°λ³μμ νμ μ½κ² μ μΆ κ°λ₯ return num1 + num2; //λ°ννμ μ΄ μμ } ---------------------------------------------------------------------------------- // λλ€μ (num1, num2) -> num1 + num2 //μ€νλ¬Έ νλλ§ μ‘΄μ¬ν΄ {}μλ΅
λλ€μμ κ°μ²΄μ²λΌ λ€λ£¨κΈ° μν΄ μ¬μ©νλ μΈν°νμ΄μ€
( κΈ°μ‘΄μ μΈν°νμ΄μ€ λ¬Έλ²μ νμ©νμ¬ λλ€μμ λ€λ£¨λ κ² )
ν¨μν μΈν°νμ΄μ€μλ λ¨ νλμ μΆμλ©μλλ§ μ μΈ
( λλ€μκ³Ό μΈν°νμ΄μ€μ λ©μλλ 1:1λ‘ λ§€μΉλκΈ° λλ¬Έ )
π 1. 맀κ°λ³μμ 리ν΄κ°μ΄ μλ λλ€μ (맀κ°λ³μ, 리ν΄κ°μ΄ μλ μΆμλ©μλλ₯Ό κ°μ§ ν¨μν μΈν°νμ΄μ€)
//κΈ°μ‘΄ λ°©μ public interface Example { public void accept(); } ---------------------------------------------------------------------------------- //λλ€μ Example ex1 = () -> { ... } //μ€νλ¬Έμ΄ νλλ©΄ {} μλ΅ κ°λ₯ ex1.accept(); λ©μλ νΈμΆ β { ... } μ λ΄μ©μ΄ μΆλ ₯λ¨
π 2. 맀κ°λ³μκ° μλ λλ€μ (λ§€κ° λ³μκ° μκ³ λ¦¬ν΄κ°μ΄ μλ μΆμ λ©μλλ₯Ό κ°μ§ ν¨μν μΈν°νμ΄μ€)
//κΈ°μ‘΄ λ°©μ public interface Example { public void accept(int x); } ---------------------------------------------------------------------------------- //λλ€μ Example ex1 = (x) -> { ... } //μ€νλ¬Έμ΄ νλλ©΄ {} μλ΅ κ°λ₯ ex1.accept(xμ λμ λ μ); λ©μλ νΈμΆ β { ... } μ λ΄μ©μ΄ μΆλ ₯λ¨
π 3. 리ν΄κ°μ΄ μλ λλ€μ (λ§€κ° λ³μμ 리ν΄κ°μ κ°μ§λ μΆμ λ©μλλ₯Ό ν¬ν¨νλ ν¨μν μΈν°νμ΄μ€)
//κΈ°μ‘΄ λ°©μ public interface Example { public int accept(int x, int y); //voidκ° μλ int -> 리ν΄κ° O } ---------------------------------------------------------------------------------- //λλ€μ Example ex1 = (x) -> { ... } //return κ° μμ΄μΌν¨ //μ€νλ¬Έμ΄ νλμΌ κ²½μ° {}, returnκ° μλ΅ κ°λ₯ ex1.accept(x, yμ λμ λ μ); λ©μλ νΈμΆ β { ... } μ λ΄μ©μ΄ μΆλ ₯λ¨
//λλ€μ String name = memberList.stream().map(element -> element.getName()).collect(Collectors.toList()); -------------------------------------------------------------------------- //λ©μλ μ°Έμ‘° ννμ String name = memberList.stream().map(Member::getName()).collect(Collectors.toList());
β λλ€μμ
μΈμ€ν΄μ€ -> μΈμ€ν΄μ€.λ©μλλͺ
μ λ©μλ μ°Έμ‘° ννμΌλ‘
μΈμ€ν΄μ€μ ν΄λμ€λͺ ::λ©μλλͺ
μΌλ‘ λ³κ²½
κΈ°λ³Έ λ©μλ μ°Έμ‘° β ν΄λμ€λͺ
:: λ©μλλͺ
( ν΄λμ€λͺ
.λ©μλλͺ
κ³Ό κ°μ λ§₯λ½ )
μ μ λ©μλ μ°Έμ‘° β ν΄λμ€λͺ
:: μ μ λ©μλλͺ
( ν΄λμ€λͺ
.μ μ λ©μλλͺ
κ³Ό κ°μ λ§₯λ½ )
μΈμ€ν΄μ€ λ©μλ μ°Έμ‘° β (μμ±ν μΈμ€ν΄μ€μ)μ°Έμ‘° λ³μλͺ
:: μΈμ€ν΄μ€ λ©μλλͺ
μμ±μλ₯Ό μ°Έμ‘°νλ€ = κ°μ²΄ μμ± β ν΄λμ€λͺ
:: new
( κ°μ²΄ μμ±νμ λ μ€λ₯Έμͺ½ μμ±μ )
μμ±μκ° μ€λ²λ‘λ©λμ΄ μ¬λ¬κ° μμ κ²½μ° β ν¨μν μΈν°νμ΄μ€μ μΆμλ©μλμ λμΌν 맀κ°λ³μ νμ κ³Ό κ°μ κ°μ§κ³ μλ μμ±μ μ°Ύμ μ€ν
//λλ€μ List<Member> memberList = memberNameList.stream().map(name -> new Member(name)).collect(Collectors.toList()); ----------------------------------------------------------------------------------- //λ©μλ μ°Έμ‘° ννμ List<Member> memberList = memberNameList.stream().map(Member::new).collect(Collectors.toList());
β λλ€μμ
(리μ€νΈμ μΈμλ‘ λ€μ΄κ° κ°μ²΄ -> new ν΄λμ€λͺ (μΈμλ‘ λ€μ΄κ° κ°μ²΄))
λ₯Ό
λ©μλ μ°Έμ‘° ννμΌλ‘(ν΄λμ€λͺ ::new)
μΌλ‘ λ³κ²½
λ€μν λ°μ΄ν° μμ€(컬λμ /λ°°μ΄)λ₯Ό νμ€ννμ¬ ν΅ν©λ λ°©μμΌλ‘ λ€λ£¨λ μ μΈν νλ‘κ·Έλλ° λ°©μ
Collection μΈν°νμ΄μ€ μμ μ μλμ΄μκΈ° λλ¬Έμ ꡬν κ°μ²΄λ€(List, Set, Map) λͺ¨λ μ€νΈλ¦Ό μ¬μ© κ°λ₯ (λ°°μ΄λ μ¬μ© κ°λ₯)
λ°μ΄ν° μμ€λ‘λΆν° λ°μ΄ν°λ₯Ό μ½κΈ°λ§ ν λΏ λ³κ²½ X ( Read-only )
( μλ³Έμ λ³κ²½νμ§ μμ μλ³Έμ μν₯ X )
μ€νΈλ¦Όμ μΌνμ© (one-time only)
( ν λ² μ¬μ©νλ©΄ λ«ν β νμνλ€λ©΄ μλ‘μ΄ μ€νΈλ¦Όμ λ§λ€μ΄μΌν¨ )
< μ€νΈλ¦Ό μμ± / μ€κ° μ°μ° / μ΅μ’ μ°μ° > μ΄ μΈ λ¨κ³λ‘ ꡬμ±
π‘ 컬λ μ vs μ€νΈλ¦Ό
- 곡ν΅μ
β μ°μλ μμνμμ κ°μ μ μ₯νλ μλ£κ΅¬μ‘° μΈν°νμ΄μ€λ₯Ό μ 곡
β λλ€ μμ°¨μ μΌλ‘ μμμ μ κ·Ό
β - μ°¨μ΄μ
- 컬λ μ
β κ° κ³μ°μμ λ§λ λλ§λ€ λ°μ΄ν°κ° κ³μ°
β λ°μ΄ν°μ μ κ·Ό, μ½κΈ°, λ³κ²½, μ μ₯μ΄ μ£Όμ λͺ©μ
β λ°μ΄ν°μ μ κ·Όνλ λ°©λ²μ μ§μ μμ±
β Iteratorλ‘ λͺ¨λ μμλ₯Ό μν
β λ©λͺ¨λ¦¬μ λͺ¨λ μμκ° μ¬λΌκ° μλ μνμμ μμλ€μ λμ μν€λ©° κ²°κ³Όλ₯Ό κ³μ°
β λ©λͺ¨λ¦¬ μ¬μ©λμ΄ λμ΄λ¨
β
π λ¬Όμ νλ²μ λ§μλ 건 컬λ μ
β - μ€νΈλ¦Ό
β μ΅μ’ μ°μ°μ΄ μ€ν λ λμ λ°μ΄ν°κ° κ³μ°
β κ³μ°μ(λλ€)μ νννλ κ²μ΄ μ£Όμ λͺ©μ
β λ°μ΄ν°μ μ κ·Όνλ λ°©λ²μ΄ μΆμνλμ΄μμ
β κ³μ°μμ 미리 μ μ΄λκ³ κ³μ°μμ λλ€μμΌλ‘ JVMμ λκΉ
β λ΄λΆμμ μμλ€μ μ΄λ»κ² λ©λͺ¨λ¦¬μ μ¬λ¦¬λ μ§λ μκ΄ X
β λ©λͺ¨λ¦¬ μ¬μ©λμ΄ μ€μ΄λ¦
β λμ©λ λ°μ΄ν°μ κ°κ³΅μ²λ¦¬ κ°λ₯
( λ§μ λ°μ΄ν°λ₯Ό λ³λ ¬λ‘ μͺΌκ°μ λμμ νλ²μ μ²λ¦¬νκΈ° λλ¬Έμ )
β β
π λ¬Όμ κΏκΊ½κΏκΊ½ λ¨κ³μ λ§μΆ° λ§μλ 건 μ€νΈλ¦Ό
μ μΈνμΌλ‘ λ°μ΄ν° μμ€ μ²λ¦¬
(λ΄λΆλμ μ리λ₯Ό λͺ°λΌλ μ μΈλμ΄μλ μ½λλ₯Ό λ³΄κ³ μ½λκ° λ¬΄μ¨ μΌ νλμ§ μ΄ν΄ κ°λ₯)
λλ€μμΌλ‘ μμ μ²λ¦¬ μ½λ μ 곡
λ΄λΆ λ°λ³΅μλ₯Ό μ¬μ©νμ¬ λ³λ ¬μ²λ¦¬κ° μ¬μ (λ³λ ¬ μ€νΈλ¦Ό - parallel()λ©μλ μ¬μ© )
μ€κ° μ°μ°κ³Ό μ΅μ’ μ°μ°μ ν μ μμ
π‘ λ°λ³΅μ μ’ λ₯
β
1. μΈλΆ λ°λ³΅μ (external iterator)
- κ°λ°μκ° μ½λλ‘ μ§μ 컬λ μ μ μμλ₯Ό λ°λ³΅ν΄μ κ°μ Έμ€λ μ½λ ν¨ν΄
(컬λ μ μμ μ¬μ©νλ iterator)
- λ΄λΆ λ°λ³΅μ (internal iterator)
- 컬λ μ λ΄λΆμμ μμλ€μ λ°λ³΅μν€κ³ κ°λ°μλ μμλΉ μ²λ¦¬ν΄μΌν μ½λλ§ μ 곡νλ μ½λ ν¨ν΄
π‘ λ³λ ¬μ²λ¦¬λ?
- ν κ°μ§ μμ μ μλΈ μμ μΌλ‘ λλκ³ , μλΈ μμ λ€μ λΆλ¦¬λ μ€λ λμμ λ³λ ¬μ μΌλ‘ μ²λ¦¬νλ κ²
λλμ λ°μ΄ν°λ₯Ό κ°κ³΅ν΄μ μΆμνλ κ²
-> λ°μ΄ν°μ ν©κ³, νκ· κ°, μΉ΄μ΄ν
, μ΅λκ°, μ΅μκ° λ±μ΄ λνμ μΈ κ²°κ³Όλ¬Ό
π‘ λͺ λ Ήν νλ‘κ·Έλλ° vs μ μΈν νλ‘κ·Έλλ°
- λͺ λ Ήνμ if / forλ¬Έ
- μ μΈνμ stream
( 체μΈμ²λΌ λμ΄λμ΄ μμ΄μ 체μΈνμ΄λΌκ³ νκΈ°λ ν¨ )
β
β κ° μ₯μ μ΄ μμΌλ μν©μ λ§μΆμ΄ μ μ¬μ©νκΈ° !
κ°μ²΄μ μ°Έμ‘°λ³μλͺ
.stream()
μ£Όμ λ©μλ
- νν°λ§
distinct()
β μ€λ³΅ μ κ±°
filter()
β Stream μ‘°κ±΄μ΄ μ°Έμ΄ λλ(μ‘°κ±΄μ΄ λ§λ) λ°μ΄ν°λ§ μΆμΆ
β - 맀ν
map()
β κΈ°μ‘΄ Stream μμλ€μ λ체νλ μμλ‘ κ΅¬μ±λ μλ‘μ΄ Stream νμ±νλ μ°μ°
β μ§μ λ κ°μ νΉμ ν ννλ‘ λ³ννλλ° μ£Όλ‘ μ¬μ©
Ex. λͺ¨λ μμλ€μ λλ¬Έμλ‘ λ°κΎΈκΈ°
β Streamμ Streamμ λ°ν
flatMap()
β Streamμ λ°ν
Ex. Srting κ°μ²΄λ€μ μ€νΈλ¦Όμ΄ λκ°κ° μμ λ, κ·Έκ²λ€μ μ¬λ¬ λ°°μ΄μ μμλ€μ flatνκ² ν λ°°μ΄μ λͺ°μμ λ§λ€μ΄μ€λ€ν μ€νΈ
β - μ λ ¬
sorted()
β μ€λ¦μ°¨μ μ λ ¬
sorted(Comparator.reverseOrder())
β λ΄λ¦Όμ°¨μ μ λ ¬
β - μ°μ° κ²°κ³Ό νμΈ
peek()
β μ°μ° μ€κ° κ²°κ³Όλ₯Ό νμΈνμ¬ λλ²κΉ νκ³ μν λ μ¬μ©
β - μ€νΈλ¦Ό λκ° ν©μΉκΈ°
concat()
β κ΄νΈ μμ ν©μΉ streamμ μ°Έμ‘°κ°λ€μ λ£μΌλ©΄ ν©μ³μ§
μ£Όμ λ©μλ
- μ°μ° κ²°κ³Ό νμΈ
forEach()
β νμ΄νλΌμΈ λ§μ§λ§μμ μμλ₯Ό νλμ© μ°μ°
β
맀μΉ
match()
β Stream μμλ€μ΄ νΉμ 쑰건μ μΆ©μ‘±νλμ§ κ²μ¬
( Predicate(ν¨μν μΈν°νμ΄μ€) λ°μμ 쑰건 κ²μ¬ ν, κ²°κ³Ό booleanμΌλ‘ λ°ν )
βallMatch()
- λͺ¨λ μμ λ§μ‘±νλμ§
βanyMatch()
- μ΅μ νλλΌλ λ§μ‘±νλμ§
βnoneMatch()
- λͺ¨λ μμ λ§μ‘±νμ§ μλμ§
β
μ§κ³
sum()
β λͺ¨λ μμ μ΄ ν©
count()
β μμμ κ°μ ( long νμ μ μ λ°ν )
average()
β νκ· ( κ° κΈ°λ³Ένμ μΌλ‘ λνλ(λνΌν΄λμ€) Optional κ°μ²΄ λ°ν )
max()
β μ΅λκ° ( κ°μ₯ ν° κ° κ°μ§λ μμλ₯Ό μ°Έμ‘°νλ Optional κ°μ²΄ λ°ν )
min()
β μ΅μκ° ( κ°μ₯ μμ κ° κ°μ§λ μμλ₯Ό μ°Έμ‘°νλ Optional κ°μ²΄ λ°ν )
reduce()
β λμ νμ¬ νλλ‘ μμΆ(reduce)νλ λ°©μ
( μμ λ μμμ μ°μ°κ²°κ³Όλ₯Ό λμ νμ¬ λ€μ μμμ μ°μ° )
β μ΅λ 3κ° λ§€κ°λ³μ λ°μ μ μμ
collect()
β Streamμ μμλ€μ List, Set, Map, λ± λ€λ₯Έ μ’ λ₯μ κ²°κ³Όλ‘ μμ§νκ³ μΆμ κ²½μ°
β Stream μμλ€μ μ΄λ»κ² μμ§ν κ²μΈκ°λ₯Ό μ μν Collector νμ μ μΈμλ‘ λ°μ
β Collector μΈν°νμ΄μ€λ₯Ό ꡬνν ν΄λμ€
Ex. collect(Collectors.toList()) -> 컬λ μ μ€ Listλ‘ μμ§
( Collectors κ°μ²΄μ toList() λ©μλλ₯Ό κ°μ Έμ 리μ€νΈλ‘ λ§λ λ€ )
Ex. collect(Collectors.toCollection(LinkedList::new)) -> LinkedListλ‘ μμ§
( Collections κ°μ²΄μ Collections μμ LinkedListμ κ°μ²΄λ₯Ό κ°μ Έμ λ§λ λ€ )
β
[μ°Έκ³ ] https://napasun-programming.tistory.com/39?category=743853
π¬ μ¬κΈ°μ λ΄κ° κΆκΈνλ μ !!
λ¬Έμ λ₯Ό ν λ μ΄λ€ μ λ€μ mapToIntλ₯Ό μ¬μ©νκ³ μ΄λ€ μ λ€μ getAsIntλ₯Ό μ¬μ©νλλ° κ·Έ μ°¨μ΄κ° 무μμΌκΉ?
mapToInt - Stream μ체λ₯Ό IntStream(κΈ°λ³Έν μ€νΈλ¦Ό)μΌλ‘ λ³ννλ κ² ( λ°λλ mapToObj() / boxed() )
getAsInt - Optionalν΄λμ€μ κ²°κ³Όκ°μ Int νμ μΌλ‘ κ°μ Έμ€λ κ²
β
[μ°Έκ³ ] https://ryan-han.com/post/dev/java-stream/
[μ°Έκ³ ] https://wickies.tistory.com/14
π‘ peek( ) μ forEach( )
- 곡ν΅μ
μμλ₯Ό νλμ© λλ©° μΆλ ₯νλ€λ μ
β - μ°¨μ΄μ
- peek()
-> μ€κ° μ°μ° λ©μλ
-> νλμ μ€νΈλ¦Όμ μ¬λ¬λ² μ¬μ© κ°λ₯- forEach()
-> μ΅μ’ μ°μ° λ©μλ
-> μΌνμ© νΈμΆ (μ¬νΈμΆ νλ €λ©΄ μ μ€νΈλ¦Ό λ§λ€μ΄μΌν¨)
orElse(κΈ°λ³Έκ°)
- Optional κ°μ²΄μ μ μ₯λ κ°μ΄ null μΌ λ μ μ κΈ°λ³Έκ° λ°νorElseGet(νμ
::new)
- Optional κ°μ²΄μ μ μ₯λ κ°μ΄ null μΌ λ μ μ κ°μ²΄ λ°νgetAsνμ
()
μΌλ‘ κ° μ»μμ΄ν΄νκΈ° νλ€μμ§λ§ μ½λλ₯Ό μ°λ©΄μ κ·Έλλ μ‘°κΈμ© μ΄ν΄νλ€ μμ§κΉμ§λ streamμ μ¬μ©λ²μ μ ννλ νμ ν μ μμ§λ§ νμ΄μ λ¬Έμ νλ©΄μ μ΅νμΌκ² λ€!!