# [Java] λžŒλ‹€μ‹ - 1. λžŒλ‹€μ‹ μž‘μ„±λ²•μ— λŒ€ν•΄
Study Repository

[Java] λžŒλ‹€μ‹ - 1. λžŒλ‹€μ‹ μž‘μ„±λ²•μ— λŒ€ν•΄

by rlaehddnd0422

μžλ°”μ—λŠ” 두 번의 큰 λ³€ν™”κ°€ μžˆμ—ˆλŠ”λ°, κ·Έ 쀑 ν•œλ²ˆμ€ JDK 1.6λΆ€ν„° μΆ”κ°€λœ Generics κΈ°λŠ₯, ν•œ λ²ˆμ€ JDK 1.8 (SE 8) λΆ€ν„° μΆ”κ°€λœ λžŒλ‹€μ‹ κΈ°λŠ₯μž…λ‹ˆλ‹€.

특히 λžŒλ‹€μ‹ λ„μž…μœΌλ‘œ μžλ°”λŠ” 객체 지ν–₯ μ–Έμ–΄μ΄μž λ™μ‹œμ— ν•¨μˆ˜ν˜• μ–Έμ–΄κ°€ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

 

ν•¨μˆ˜ν˜• μ–Έμ–΄ : Haskell, Scala λ“± 

 

객체 지ν–₯ μ–Έμ–΄κ°€ ν•¨μˆ˜ν˜• μ–Έμ–΄μ˜ κΈ°λŠ₯κΉŒμ§€ κ°–μΆ”κΈ°λŠ” μ–΄λ ΅λ‹€κ³  ν•©λ‹ˆλ‹€. 이번 ν¬μŠ€νŒ…μ—μ„œ λžŒλ‹€μ‹μ„ λ°°μ›Œλ΄„μœΌλ‘œμ¨ Java 8 λ²„μ „μ—μ„œ ν•¨μˆ˜ν˜• μ–Έμ–΄μ˜ μž₯점을 μ–΄λ–»κ²Œ μ ‘λͺ©ν•˜μ˜€λŠ”지 μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

λžŒλ‹€μ‹μ΄λž€ λ¬΄μ—‡μΌκΉŒ?

λžŒλ‹€μ‹(Lambda Expression)은 κ°„λ‹¨νžˆ 말해 λ©”μ†Œλ“œλ₯Ό ν•˜λ‚˜μ˜ μ‹μœΌλ‘œ ν‘œν˜„ν•˜λŠ” 것을 λ§ν•©λ‹ˆλ‹€.

 

λ©”μ†Œλ“œ ➑️ 식 
How ?
ex) int[] arr = new int[5];
Arrays.setAll(arr, (i) -> (int) (Math.random()*5));

μ—¬κΈ°μ„œλŠ” Math.random()*5 κ°€ λ°”λ‘œ 'λžŒλ‹€μ‹'μž…λ‹ˆλ‹€. 이 λžŒλ‹€μ‹μ΄ ν•˜λŠ” 일을 λ©”μ†Œλ“œλ‘œ ν‘œν˜„ν•΄λ³΄λ©΄ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

int method(){
	return (int) (Math.random()*5);
}

μœ„ λ©”μ†Œλ“œλ³΄λ‹€ λžŒλ‹€μ‹μœΌλ‘œ ν‘œν˜„ν•˜λŠ” 것이 훨씬 κΉ”λ”ν•˜κ³  κ°„κ²°ν•©λ‹ˆλ‹€.

 

λ©”μ†Œλ“œλŠ” ν΄λž˜μŠ€μ— import λ˜μ–΄μ•Ό ν•  뿐 μ•„λ‹ˆλΌ, 객체도 μƒμ„±ν•΄μ•Όλ§Œ λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•  수 μžˆμŠ΅λ‹ˆλ‹€. 

public class MethodClass {

    int method() {
        return (int) (Math.random() * 5);
    }
}
public class ArrayFillExample {
    public static void main(String[] args) {
        MethodClass methodClass = new MethodClass();
        int arr[] = new int[5];

        for (int i : arr) {
            arr[i] = methodClass.method();
            System.out.println("arr[i] = " + arr[i]);
        }
    }
}

 

μœ„ μ˜ˆμ‹œλ₯Ό 보면 Methodλ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•΄ 객체λ₯Ό μƒμ„±ν•˜κ³  메인 ν•¨μˆ˜μ—μ„œ 객체의 λ©”μ†Œλ“œλ₯Ό λΆˆλŸ¬μ™€ μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€.

 

ν•˜μ§€λ§Œ λžŒλ‹€μ‹μ€ μœ„ κ³Όμ •μ—μ„œ 객체λ₯Ό μƒμ„±ν•˜λŠ” 과정을 μƒλž΅ν•˜κ³ , λžŒλ‹€μ‹ 자체만으둜 이 λ©”μ†Œλ“œμ˜ 역할을 λŒ€μ‹ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

즉 λžŒλ‹€μ‹μ€ 객체의 μ„ μ–Έ, 생성을 λžŒλ‹€μ‹μœΌλ‘œ ν‰μΉœλ‹€λŠ”μ μ—μ„œ "읡λͺ… 객체 μ—­ν• "을 ν•©λ‹ˆλ‹€. 

 

Q. λ©”μ†Œλ“œμ™€ ν•¨μˆ˜μ˜ 차이가 λ¬΄μ—‡μΌκΉŒ?
A. κΈ°λŠ₯적으둜 λ™μΌν•œ 의미λ₯Ό 가짐.
차이가 μžˆλ‹€λ©΄, ν•¨μˆ˜λŠ” ν΄λž˜μŠ€μ— 독립, λ©”μ†Œλ“œλŠ” ν΄λž˜μŠ€μ— 쒅속
객체지ν–₯ μ–Έμ–΄μ—μ„œλŠ” 객체의 ν–‰μœ„, λ™μž‘μ„ μ˜λ―Έν•˜λŠ” 의미둜 'λ©”μ†Œλ“œ'λΌλŠ” μš©μ–΄λ‘œ μ‚¬μš©ν•©λ‹ˆλ‹€.
λžŒλ‹€μ‹μ€ ν•¨μˆ˜ν˜• μ–Έμ–΄λ₯Ό μ ‘λͺ©ν•œ κΈ°λŠ₯이라고 ν–ˆκΈ° λ•Œλ¬Έμ—, μ΄μ œλΆ€ν„° λžŒλ‹€μ‹μ— κ΄€ν•˜μ—¬ μ„€λͺ…ν•  λ•ŒλŠ” 'λ©”μ†Œλ“œ' λŒ€μ‹  'ν•¨μˆ˜' λΌλŠ” μš©μ–΄λ₯Ό μ‚¬μš©ν•˜κ² μŠ΅λ‹ˆλ‹€.

λžŒλ‹€μ‹ μž‘μ„±λ²•

λžŒλ‹€μ‹μ€ κΈ°μ‘΄ λ©”μ†Œλ“œμ—μ„œ λ©”μ†Œλ“œ 이름과 λ°˜ν™˜νƒ€μž…μ„ μ œκ±°ν•˜κ³ , λ§€κ°œλ³€μˆ˜ 선언뢀와 μ€‘κ΄„ν˜Έ {} 사이에 ->λ₯Ό μΆ”κ°€ν•΄μ£Όλ©΄ λ©λ‹ˆλ‹€.

// κΈ°μ‘΄ λ©”μ†Œλ“œ μ‚¬μš© 방식
λ°˜ν™˜νƒ€μž… λ©”μ†Œλ“œμ΄λ¦„(λ§€κ°œλ³€μˆ˜){
	λ¬Έμž₯λ“€
}


// λžŒλ‹€μ‹ μ‚¬μš©λ°©μ‹
(λ§€κ°œλ³€μˆ˜) -> { λ¬Έμž₯λ“€ }

예λ₯Ό λ“€μ–΄ λ΄…μ‹œλ‹€.

// κΈ°μ‘΄ λ©”μ†Œλ“œ μ‚¬μš© 방식
int max(int a, int b){
	return a > b ? a : b;
}

// λžŒλ‹€μ‹ μ‚¬μš©λ°©μ‹
(int a, int b) -> { return a > b ? a : b; }
  • 이 λ•Œ, μœ„μ²˜λŸΌ λ°˜ν™˜ 값이 μžˆλŠ” λ©”μ†Œλ“œμ˜ 경우, return λ¬Έ λŒ€μ‹  '식'으둜 λŒ€μ²΄κ°€ κ°€λŠ₯ν•©λ‹ˆλ‹€.
// λžŒλ‹€μ‹ μ‚¬μš©λ°©μ‹
(int a, int b) -> { return a > b ? a : b; }

// μ‹μœΌλ‘œ λŒ€μ²΄
(int a, int b) -> { a > b ? a : b }
  • return 문이 제거되고 λ¬Έμž₯ 끝에 μ„Έλ―Έμ½œλ‘ μ΄ μƒλž΅λ©λ‹ˆλ‹€.
  • 여기에 더해 μž…λ ₯ 맀개 λ³€μˆ˜μ— λŒ€ν•œ νƒ€μž…μ€ 좔둠이 κ°€λŠ₯ν•œ 경우 μƒλž΅ν•  수 μžˆμŠ΅λ‹ˆλ‹€. (거의 λŒ€λΆ€λΆ„μ˜ νƒ€μž…μ΄ μΆ”λ‘ κ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ— μƒλž΅ κ°€λŠ₯)
(int a, int b) -> { a > b ? a : b }

// νƒ€μž… μƒλž΅ ( μΆ”λ‘  κ°€λŠ₯ν•œ 경우 )
(a, b) -> { a > b ? a : b }
주의 ! 
1. 맀개 λ³€μˆ˜κ°€ μ—¬λŸ¬ 개인 경우 ν•˜λ‚˜μ˜ νƒ€μž…λ§Œ μƒλž΅ν•˜λŠ” 것은 ν—ˆμš©λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
ex) (int a, b), (a, int b)

2. λ§€κ°œλ³€μˆ˜κ°€ ν•˜λ‚˜μΈ 경우, κ΄„ν˜Έ μƒλž΅ κ°€λŠ₯. λ‹€λ§Œ 맀개 λ³€μˆ˜μ˜ νƒ€μž…μ„ λͺ…μ‹œν•΄μ•Ό ν•˜λŠ” κ²½μš°λŠ” μƒλž΅ λΆˆκ°€λŠ₯
ex) (a) -> a* a
a -> a*a

int a -> a*a (X)
(int a) -> a*a (O)

3. λ¬Έμž₯이 ν•˜λ‚˜μΈ 경우 μ€‘κ΄„ν˜Έ μƒλž΅ κ°€λŠ₯ 
  • λ”°λΌμ„œ 결둠적으둜 μ΄λ ‡κ²Œ μ“Έ 수 μžˆμŠ΅λ‹ˆλ‹€.
int max(int a, int b){
	return a > b ? a : b;
}

(a, b) -> a > b ? a : b // λ¬Έμž₯이 ν•˜λ‚˜μ΄λ―€λ‘œ μ€‘κ΄„ν˜ΈκΉŒμ§€ μƒλž΅

 

λžŒλ‹€μ‹ μ˜ˆμ‹œλ₯Ό λͺ‡ 개 더 μ‚΄νŽ΄λ³΄λ©΄μ„œ 감을 μž‘μ•„λ΄…μ‹œλ‹€.

// 1
int max(int a, int b){
	return a > b ? a : b;
}
// 1의 λžŒλ‹€μ‹ 
(a, b) -> { a > b ? a : b }


// 2 
int printVar(String name, int i){
	System.out.println(name + "=" + i);
}
// 2의 λžŒλ‹€μ‹
(String name, int i) -> { System.out.println(name + "=" + i); }
(name, i) -> { System.out.println(name + "=" + i); } 
(name, i) -> System.out.println(name + "=" + i)


// 3
int square(int x){
	return x * x;
}
// 3의 λžŒλ‹€μ‹
(int x) -> { return x * x; };
(x) -> { x * x }
x -> x * x


// 4 
int roll(){
	return (int) (Math.random()*6);
}
// 4의 λžŒλ‹€μ‹
() -> { return (int)(Math.random() * 6);}
() -> (int)(Math.random() * 6)

 

μžλ°”μ—μ„œ λͺ¨λ“  λ©”μ†Œλ“œλŠ” μ–΄λ– ν•œ 클래슀 내에 ν¬ν•¨λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

public class MethodClass {
    // methodλŠ” methodClass에 ν¬ν•¨λ˜μ–΄ 있음
    int method(int a, int b) {
        return a > b ? a : b;
    }
}


public class ArrayFillExample {
    public static void main(String[] args) {
        MethodClass methodClass = new MethodClass();
        int c = methodClass.method(1,2);
    }
}

κ·Έλ ‡λ‹€λ©΄ λžŒλ‹€μ‹μ€ μ–΄λ–€ ν΄λž˜μŠ€μ— ν¬ν•¨λ κΉŒμš”? 

예λ₯Ό λ“€μ–΄ λ³΄κ² μŠ΅λ‹ˆλ‹€.

public class ArrayFillExample {
    public static void main(String[] args) {
        // λ©”μ†Œλ“œ ν‘œν˜„ 
        Object obj = new Object(){
            int max(int a, int b) {
                return a > b ? a : b;
            }
        };

        // λžŒλ‹€μ‹(읡λͺ… 객체) ν‘œν˜„ 
        Object obj = (a, b) -> a > b ? a : b;


        int value = obj.max(3, 5); // 읡λͺ… 객체의 νƒ€μž…μ΄ Object이기 λ•Œλ¬Έμ— μ‚¬μš© λΆˆκ°€. 

    }
}
// (a, b) -> a > b? a : b λŠ” λžŒλ‹€μ‹(읡λͺ… 객체), κ·Έλ ‡λ‹€λ©΄ 읡λͺ… 객체의 νƒ€μž…μ€ 무엇?
νƒ€μž… obj = (a, b) -> a > b ? a : b

λžŒλ‹€μ‹(읡λͺ… 객체)λ₯Ό 닀루기 μœ„ν•œ μ°Έμ‘°λ³€μˆ˜κ°€ ν•„μš”ν•œλ° μ°Έμ‘°λ³€μˆ˜μ˜ νƒ€μž…μ€ μ–΄λ–»κ²Œ 지정해야 ν• κΉŒμš”? 

 

이 λ•Œ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

 

μ—¬κΈ°μ„œ ν•œ 번 끊고 λ‹€μŒ ν¬μŠ€νŒ…μœΌλ‘œ μ΄μ–΄κ°€κ² μŠ΅λ‹ˆλ‹€.

 

 

 

λΈ”λ‘œκ·Έμ˜ 정보

Study Repository

rlaehddnd0422

ν™œλ™ν•˜κΈ°