λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

빈 ꡬ멍 μ±„μš°κΈ°

[μš©μ–΄][Java] ν΄λ‘œμ €(Closure)

좜처

ChatGPT


ν΄λ‘œμ €(Closure)λŠ” ν”„λ‘œκ·Έλž˜λ°μ—μ„œ ν•¨μˆ˜μ™€ ν•΄λ‹Ή ν•¨μˆ˜κ°€ μ •μ˜λœ ν™˜κ²½(μŠ€μ½”ν”„) μ‚¬μ΄μ˜ 관계λ₯Ό μ˜λ―Έν•œλ‹€. ν΄λ‘œμ €λŠ” ν•¨μˆ˜κ°€ μžμ‹ μ˜ μ •μ˜ λ‹Ήμ‹œμ˜ λ³€μˆ˜μ™€ μƒνƒœλ₯Ό κΈ°μ–΅ν•˜κ³  μ‚¬μš©ν•  수 μžˆλ„λ‘ ν•΄μ£ΌλŠ” κΈ°λŠ₯이닀. 이 κ°œλ…μ€ 주둜 ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μ„œ μ‚¬μš©λ˜μ§€λ§Œ, μžλ°”λ₯Ό ν¬ν•¨ν•œ 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μ„œλ„ μ‚¬μš©ν•  수 μžˆλ‹€.

 

ν΄λ‘œμ €μ˜ κ°œλ…

ν΄λ‘œμ €λŠ” 기본적으둜 ν•¨μˆ˜μ™€ κ·Έ ν•¨μˆ˜κ°€ μ •μ˜λœ ν™˜κ²½μ„ ν•¨κ»˜ μΊ‘μŠν™”ν•œλ‹€. ν΄λ‘œμ €λŠ” λ‹€μŒκ³Ό 같은 νŠΉμ§•μ„ 가지고 μžˆλ‹€.

1. ν•¨μˆ˜μ™€ μƒνƒœμ˜ κ²°ν•©

ν΄λ‘œμ €λŠ” ν•¨μˆ˜κ°€ μ •μ˜λœ ν™˜κ²½μ˜ λ³€μˆ˜μ™€ μƒνƒœλ₯Ό κΈ°μ–΅ν•œλ‹€. 즉, ν•¨μˆ˜κ°€ μ™ΈλΆ€ ν™˜κ²½μ˜ λ³€μˆ˜μ— μ ‘κ·Όν•  수 있으며, 이 λ³€μˆ˜λ“€μ˜ 값을 μ§€μ†μ μœΌλ‘œ μœ μ§€ν•œλ‹€.

2. μŠ€μ½”ν”„ μœ μ§€

ν΄λ‘œμ €λŠ” ν•¨μˆ˜κ°€ μ •μ˜λœ μŠ€μ½”ν”„μ˜ λ³€μˆ˜λ“€μ„ μ°Έμ‘°ν•  수 μžˆλ‹€. μ΄λŠ” ν•¨μˆ˜κ°€ 싀행될 λ•Œ, μ •μ˜λœ λ‹Ήμ‹œμ˜ λ³€μˆ˜ 값을 μ‚¬μš©ν•  수 있게 ν•œλ‹€.

3. μƒνƒœ μœ μ§€

ν΄λ‘œμ €λŠ” ν•¨μˆ˜ μ‹€ν–‰ 후에도 λ³€μˆ˜μ˜ μƒνƒœλ₯Ό μœ μ§€ν•  수 μžˆλ‹€. μ΄λŠ” ν•¨μˆ˜κ°€ 호좜될 λ•Œλ§ˆλ‹€ λ³€μˆ˜μ˜ μƒνƒœλ₯Ό λ³€κ²½ν•  수 있게 ν•΄μ€€λ‹€.

 

μžλ°”μ—μ„œμ˜ ν΄λ‘œμ €

μžλ°”μ—μ„œλŠ” ν΄λ‘œμ € κ°œλ…μ΄ 주둜 읡λͺ… λ‚΄λΆ€ ν΄λž˜μŠ€μ™€ λžŒλ‹€ ν‘œν˜„μ‹μœΌλ‘œ κ΅¬ν˜„λœλ‹€. λ‹€μŒμ€ μžλ°”μ—μ„œ ν΄λ‘œμ €λ₯Ό ν™œμš©ν•˜λŠ” 방법이닀.

1. 읡λͺ… λ‚΄λΆ€ 클래슀(Anonymous Inner Class)

읡λͺ… λ‚΄λΆ€ ν΄λž˜μŠ€λŠ” μ™ΈλΆ€ 클래슀의 λ³€μˆ˜μ™€ λ©”μ†Œλ“œμ— μ ‘κ·Όν•  수 있으며, 이 λ³€μˆ˜μ™€ λ©”μ†Œλ“œμ˜ 값을 μΊ‘μ²˜ν•  수 μžˆλ‹€.

public class Outer {
    private String message = "Hello";

    public void showMessage() {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                System.out.println(message); // 캑처된 λ³€μˆ˜
            }
        };
        new Thread(r).start();
    }
}

 

이 μ˜ˆμ œμ—μ„œ, 읡λͺ… λ‚΄λΆ€ ν΄λž˜μŠ€λŠ” Outer 클래슀의 μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ messageλ₯Ό μΊ‘μ²˜ν•œλ‹€. messageλŠ” 읡λͺ… λ‚΄λΆ€ 클래슀의 run λ©”μ†Œλ“œμ—μ„œ μ‚¬μš©λœλ‹€.

 

2. λžŒλ‹€ ν‘œν˜„μ‹(Lambda Expressions)

μžλ°” 8λΆ€ν„° λžŒλ‹€ ν‘œν˜„μ‹μ€ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° μŠ€νƒ€μΌμ„ μ§€μ›ν•˜λ©°, ν΄λ‘œμ €μ˜ κ°œλ…μ„ κ°„νŽΈν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλ„λ‘ ν•΄μ€€λ‹€. λžŒλ‹€ ν‘œν˜„μ‹μ€ μ™ΈλΆ€ μŠ€μ½”ν”„μ˜ λ³€μˆ˜μ— μ ‘κ·Όν•  수 있으며, μ΄λŸ¬ν•œ λ³€μˆ˜λ“€μ€ μΊ‘μ²˜λœλ‹€.

public class Example {
    public static void main(String[] args) {
        String greeting = "Hello";
        Runnable r = () -> System.out.println(greeting); // 캑처된 λ³€μˆ˜
        r.run();
    }
}

 

이 μ˜ˆμ œμ—μ„œ, λžŒλ‹€ ν‘œν˜„μ‹μ€ greeting λ³€μˆ˜λ₯Ό μΊ‘μ²˜ν•˜μ—¬ System.out.printlnμ—μ„œ μ‚¬μš©ν•œλ‹€.

 

ν΄λ‘œμ €μ˜ μž₯점

1. μƒνƒœ μœ μ§€

  • ν΄λ‘œμ €λŠ” ν•¨μˆ˜κ°€ μƒμ„±λœ ν™˜κ²½μ˜ μƒνƒœλ₯Ό μœ μ§€ν•  수 있기 λ•Œλ¬Έμ—, μƒνƒœλ₯Ό μΆ”μ ν•˜κ³  κ΄€λ¦¬ν•˜λŠ” 데 μœ μš©ν•˜λ‹€.

2. μ½”λ“œμ˜ μž¬μ‚¬μš©μ„±

  • ν΄λ‘œμ €λ₯Ό μ‚¬μš©ν•˜λ©΄, ν•¨μˆ˜μ™€ κ·Έ ν•¨μˆ˜κ°€ μ •μ˜λœ ν™˜κ²½μ„ ν•¨κ»˜ μΊ‘μŠν™”ν•˜μ—¬ μž¬μ‚¬μš© κ°€λŠ₯ν•œ μ½”λ“œ 블둝을 λ§Œλ“€ 수 μžˆλ‹€.

3. κ°„κ²°ν•œ μ½”λ“œ μž‘μ„±

  • ν΄λ‘œμ €λ₯Ό μ‚¬μš©ν•˜λ©΄, μƒνƒœλ₯Ό μœ μ§€ν•˜λŠ” ν•¨μˆ˜λ₯Ό κ°„κ²°ν•˜κ²Œ μž‘μ„±ν•  수 있으며, 특히 ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° μŠ€νƒ€μΌμ˜ μž₯점을 ν™œμš©ν•  수 μžˆλ‹€.

 

μš”μ•½

  • ν΄λ‘œμ €(Closure)λŠ” ν•¨μˆ˜μ™€ ν•΄λ‹Ή ν•¨μˆ˜κ°€ μ •μ˜λœ ν™˜κ²½μ˜ λ³€μˆ˜μ™€ μƒνƒœλ₯Ό ν•¨κ»˜ μΊ‘μŠν™”ν•˜λŠ” κ°œλ…μ΄λ‹€.
  • μžλ°”μ—μ„œ ν΄λ‘œμ €λŠ” 읡λͺ… λ‚΄λΆ€ ν΄λž˜μŠ€μ™€ λžŒλ‹€ ν‘œν˜„μ‹μ„ 톡해 κ΅¬ν˜„λ˜λ©°, μ™ΈλΆ€ 클래슀의 λ³€μˆ˜μ™€ λ©”μ†Œλ“œλ₯Ό μΊ‘μ²˜ν•˜κ³  μ‚¬μš©ν•  수 있게 ν•΄μ€€λ‹€.
  • μž₯점: ν΄λ‘œμ €λŠ” μƒνƒœ μœ μ§€, μ½”λ“œ μž¬μ‚¬μš©μ„±, κ°„κ²°ν•œ μ½”λ“œ μž‘μ„±μ„ κ°€λŠ₯ν•˜κ²Œ ν•œλ‹€.

μ΄λŸ¬ν•œ κ°œλ…μ€ 주둜 ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ—μ„œ 많이 μ‚¬μš©λ˜μ§€λ§Œ, μžλ°”μ™€ 같은 객체 지ν–₯ μ–Έμ–΄μ—μ„œλ„ μœ μš©ν•˜κ²Œ ν™œμš©λ  수 μžˆλ‹€.

 


ChatGPT κΈ€μ˜ 좜처

 

ν΄λ‘œμ €(Closure) κ°œλ…κ³Ό μžλ°”μ—μ„œμ˜ ν΄λ‘œμ € κ΅¬ν˜„ 방법에 λŒ€ν•œ μ„€λͺ…은 λ‹€μŒκ³Ό 같은 μžλ£Œλ“€μ—μ„œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€:

  1. Oracle Java Documentation:
    • Java Language Specification (JLS): μžλ°” μ–Έμ–΄ μ‚¬μ–‘μ—μ„œλŠ” μžλ°”μ˜ 읡λͺ… λ‚΄λΆ€ ν΄λž˜μŠ€μ™€ λžŒλ‹€ ν‘œν˜„μ‹μ— λŒ€ν•œ μ •μ˜λ₯Ό ν¬ν•¨ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. ν΄λ‘œμ €μ™€ κ΄€λ ¨λœ κ°œλ…μ΄ μžλ°”μ—μ„œ μ–΄λ–»κ²Œ μ μš©λ˜λŠ”μ§€μ— λŒ€ν•œ 기본적인 정보λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.
  2. Java Tutorials by Oracle:
    • Lambda Expressions: μžλ°”μ˜ λžŒλ‹€ ν‘œν˜„μ‹μ— λŒ€ν•œ 곡식 νŠœν† λ¦¬μ–Όλ‘œ, ν΄λ‘œμ €μ™€ κ΄€λ ¨λœ κ°œλ…μ„ μ„€λͺ…ν•©λ‹ˆλ‹€. λžŒλ‹€ ν‘œν˜„μ‹μ΄ μ–΄λ–»κ²Œ ν΄λ‘œμ €λ₯Ό κ΅¬ν˜„ν•˜λŠ”μ§€μ— λŒ€ν•΄ μžμ„Ένžˆ μ„€λͺ…ν•©λ‹ˆλ‹€.
    • Anonymous Classes: 읡λͺ… λ‚΄λΆ€ ν΄λž˜μŠ€μ— λŒ€ν•œ μ„€λͺ…을 μ œκ³΅ν•˜λ©°, ν΄λ‘œμ €μ˜ κ°œλ…μ„ μ΄ν•΄ν•˜λŠ” 데 도움이 λ©λ‹ˆλ‹€.
  3. Effective Java (by Joshua Bloch):
    • 이 책은 μžλ°”μ˜ λ‹€μ–‘ν•œ 기법과 섀계λ₯Ό 닀루며, 읡λͺ… λ‚΄λΆ€ ν΄λž˜μŠ€μ™€ λžŒλ‹€ ν‘œν˜„μ‹μ„ ν†΅ν•œ ν΄λ‘œμ € κ°œλ…μ„ μ„€λͺ…ν•©λ‹ˆλ‹€. μžλ°”μ—μ„œ ν΄λ‘œμ €λ₯Ό μ‚¬μš©ν•˜λŠ” 방법에 λŒ€ν•œ μ‹€μš©μ μΈ 쑰언을 μ œκ³΅ν•©λ‹ˆλ‹€.
  4. Java Concurrency in Practice (by Brian Goetz):
    • μžλ°”μ—μ„œμ˜ λ™μ‹œμ„±κ³Ό κ΄€λ ¨λœ λ‹€μ–‘ν•œ 주제λ₯Ό 닀루며, 읡λͺ… λ‚΄λΆ€ ν΄λž˜μŠ€μ™€ ν΄λ‘œμ € κ°œλ…μ΄ λ™μ‹œμ„± λ¬Έμ œμ— λ―ΈμΉ˜λŠ” 영ν–₯을 μ„€λͺ…ν•©λ‹ˆλ‹€.

이 μžλ£Œλ“€μ€ μžλ°”μ—μ„œ ν΄λ‘œμ €μ˜ κ°œλ…κ³Ό μ‚¬μš© 방법을 μ΄ν•΄ν•˜λŠ” 데 도움이 λ©λ‹ˆλ‹€. 곡식 λ¬Έμ„œμ™€ 책듀은 ν΄λ‘œμ €μ˜ 이둠적 λ°°κ²½κ³Ό μ‹€μ œ 적용 방법을 깊이 있게 μ„€λͺ…ν•©λ‹ˆλ‹€.