🎽 μΈν”„λŸ° μ›Œλ°μ—… 클럽 0κΈ° λ°±μ—”λ“œ μ„Έ 번째 과제

nyangΒ·2024λ…„ 2μ›” 21일
0

μΈν”„λŸ°

λͺ©λ‘ 보기
3/7
post-thumbnail

μΈν”„λŸ° μ›Œλ°μ—… 클럽 0κΈ° μ„Έ 번째 과제의 μ§ˆλ¬Έμ€ λ‹€μŒκ³Ό κ°™λ‹€.

좜처
https://inf.run/XKQg
질문1. μžλ°”μ˜ λžŒλ‹€μ‹μ€ μ™œ λ“±μž₯ν–ˆμ„κΉŒ?
질문2. λžŒλ‹€μ‹κ³Ό 읡λͺ… ν΄λž˜μŠ€λŠ” μ–΄λ–€ 관계가 μžˆμ„κΉŒ? - λžŒλ‹€μ‹μ˜ 문법은 μ–΄λ–»κ²Œ 될까?

μ—¬λŸ¬ 레퍼런슀λ₯Ό 읽고 κ³΅λΆ€ν•œ ν›„. λ‚˜λ¦„μ˜ 생각을 λ°”νƒ•μœΌλ‘œ μ €λ§Œμ˜ 닡변을 μ μ–΄λ³΄κ³ μž ν•©λ‹ˆλ‹€.


λžŒλ‹€μ‹μ΄ λ“±μž₯ν•˜κ²Œ 된 이유λ₯Ό μ‚΄νŽ΄λ³΄κΈ° 전에 읡λͺ… 클래슀, ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μ— λŒ€ν•΄ μ•Œμ•„λ³΄μž.

1. ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€(Functional Interface, Single Abstract Method)

  • ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λŠ” 였직 ν•˜λ‚˜μ˜ 좔상 λ©”μ†Œλ“œλ₯Ό 가지고 μžˆλŠ” μΈν„°νŽ˜μ΄μŠ€μ΄λ‹€.
    ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μ˜ 좔상 λ©”μ†Œλ“œ μ‹œκ·Έλ‹ˆμ²˜(signature)λŠ” λžŒλ‹€μ‹μ΄ ν•΄λ‹Ή μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•  λ•Œ μ‚¬μš©λ˜λŠ” ν˜•νƒœλ₯Ό μ •μ˜ν•  수 μžˆλ‹€.

    예λ₯Ό λ“€μ–΄, Runnable μΈν„°νŽ˜μ΄μŠ€λŠ” void run(); 좔상 λ©”μ†Œλ“œλ₯Ό 가지고 μžˆλ‹€. 이 μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜λŠ” λžŒλ‹€μ‹λ„ λ™μΌν•œ μ‹œκ·Έλ‹ˆμ²˜λ₯Ό κ°€μ Έμ•Ό ν•˜λŠ” 것이닀.
Runnable rn = () -> {..}

Signatureλž€?
λ©”μ†Œλ“œμ˜ 이름, λ§€κ°œλ³€μˆ˜μ˜ νƒ€μž… 및 μˆœμ„œ, λ°˜ν™˜ νƒ€μž… 등을 λͺ¨λ‘ ν¬ν•¨ν•œ λ©”μ†Œλ“œμ˜ κ³ μœ ν•œ νŠΉμ„±μ„ λ‚˜νƒ€λ‚Έ 것이닀.

  • @FunctionInterface μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•  수 μžˆλ‹€.
    이 μ–΄λ…Έν…Œμ΄μ…˜μ€ ν•΄λ‹Ή μΈν„°νŽ˜μ΄μŠ€κ°€ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ 쑰건에 λ§žλŠ”μ§€ 컴파일 μ‹œμ μ— 검사할 수 μžˆμœΌλ―€λ‘œ μΈν„°νŽ˜μ΄μŠ€ 검증과 μœ μ§€λ³΄μˆ˜λ₯Ό μœ„ν•΄ μ‚¬μš©μ„ ꢌμž₯ν•œλ‹€.

2. 읡λͺ… 클래슀 (Anoymous Class)

λžŒλ‹€μ‹μ΄ λ„μž…λ˜κΈ° μ „, 읡λͺ… 클래슀λ₯Ό μ‚¬μš©ν•˜μ—¬ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν–ˆλ‹€.

읡λͺ… ν΄λž˜μŠ€λŠ” λ³΄μΌλŸ¬ν”Œλ ˆμ΄νŠΈ μ½”λ“œ(boilerplate code)λ₯Ό ν”Όν•˜κΈ° μœ„ν•΄ 단 ν•œ 번만 μ‚¬μš©ν•  클래슀λ₯Ό λ§Œλ“€ λ•Œ μ‚¬μš©ν•œλ‹€.
즉, 클래슀의 μ„ μ–Έκ³Ό λ™μ‹œμ— 객체λ₯Ό μƒμ„±ν•˜λ―€λ‘œ 단 ν•˜λ‚˜μ˜ κ°μ²΄λ§Œμ„ μƒμ„±ν•˜λŠ” 일회용 ν΄λž˜μŠ€μ΄λ‹€.
λ”°λΌμ„œ μƒμ„±μžλ₯Ό μ„ μ–Έν•  수 μ—†κ³ , ν•˜λ‚˜μ˜ 클래슀 λ˜λŠ” ν•˜λ‚˜μ˜ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μƒμ†λ°›κ±°λ‚˜ κ΅¬ν˜„ν•  수 μžˆλ‹€.

3-1. λžŒλ‹€ ν‘œν˜„μ‹ (Lambda Expression)

Java 8은 λžŒλ‹€ ν‘œν˜„μ‹(Lambda Expression)κ³Ό ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€(Functional Interface) κ°œλ…μ„ 언어에 λ„μž…ν•˜μ—¬ 읽기 쉽고 κ΄€λ¦¬ν•˜κΈ° μ‰¬μš΄ 효율적인 μ½”λ“œλ₯Ό μž‘μ„±ν•˜κΈ° μœ„ν•΄ λ„μž…λ˜μ—ˆλ‹€.

λžŒλ‹€ ν‘œν˜„μ‹μ€ ν•˜λ‚˜μ˜ 좔상 λ©”μ†Œλ“œλ§Œμ„ κ°–λŠ” ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μ— μ‚¬μš©λ  수 μžˆλ‹€.
λžŒλ‹€ ν‘œν˜„μ‹μ΄ λ„μž…λ˜κΈ° 전에, 읡λͺ… 클래슀λ₯Ό μ‚¬μš©ν•˜μ—¬ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν–ˆλ‹€.

Animal cat = new Animal() {
    @Override
    public String cry(String sound) {
        return "Cat " + sound;

    }
};

ν•˜μ§€λ§Œ, λžŒλ‹€ ν‘œν˜„μ‹μ΄ λ„μž…λ˜λ©΄μ„œ ν•΄λ‹Ή μ½”λ“œλ₯Ό ν•œ μ€„λ‘œ κ°„κ²°ν•˜κ²Œ ν‘œν˜„ν•  수 있게 λ˜μ—ˆλ‹€.

Animal cat = (sound) -> "Cat " + sound;

3-2. λžŒλ‹€ ν‘œν˜„μ‹ 문법

(1) κΈ°λ³Έ 문법

(parameters) -> expression
  • (parameters): λ§€κ°œλ³€μˆ˜ λͺ©λ‘. 없을 경우 빈 κ΄„ν˜Έλ‘œ ν‘œν˜„ν•œλ‹€.
  • ->: λžŒλ‹€ μ—°μ‚°μž. λ§€κ°œλ³€μˆ˜μ™€ λžŒλ‹€ λ°”λ””λ₯Ό ꡬ뢄 μ§“λŠ”λ‹€.
  • expression: λžŒλ‹€ 바디에 ν•΄λ‹Ήν•˜λŠ” ν‘œν˜„μ‹. ν‘œν˜„μ‹μ˜ κ²°κ³Όκ°€ λ°˜ν™˜κ°’μœΌλ‘œ μ‚¬μš©λœλ‹€.

(2) λ§€κ°œλ³€μˆ˜κ°€ μ—†λŠ” 경우

() -> System.out.println("Hello, World!");

(3) ν•˜λ‚˜μ˜ λ§€κ°œλ³€μˆ˜κ°€ μžˆλŠ” 경우

name -> System.out.println("Animal Name is " + name);

(4) 두 개 μ΄μƒμ˜ λ§€κ°œλ³€μˆ˜κ°€ μžˆλŠ” 경우

(x, y) -> x + y;

(5) λ°˜ν™˜κ°’μ΄ μžˆλŠ” 경우

(x, y) -> {
	return x - y;
}

(x, y) -> x - y;
  • μ€‘κ΄„ν˜Έλ₯Ό μ‚¬μš©ν•˜λŠ” 경우 λ°˜λ“œμ‹œ return ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ 값을 λ°˜ν™˜ν•œλ‹€. μ‚¬μš©ν•˜μ§€ μ•Šμ„ 경우, ν•œ μ€„λ‘œ ν‘œν˜„μ΄ κ°€λŠ₯ν•˜λ‹€.

(6) ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ μ‚¬μš©

Runnable runnable = () -> System.out.println("Running...");

4. 읡λͺ… ν΄λž˜μŠ€μ™€ λžŒλ‹€ ν‘œν˜„μ‹μ˜ 차이점

  • 읡λͺ… ν΄λž˜μŠ€λŠ” μ—¬λŸ¬ 개의 좔상 λ©”μ†Œλ“œλ₯Ό 가진 μΈν„°νŽ˜μ΄μŠ€μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“€ 수 μžˆμ§€λ§Œ, λžŒλ‹€ ν‘œν˜„μ‹μ€ ν•˜λ‚˜μ˜ 좔상 λ©”μ†Œλ“œλ₯Ό 가진 ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μ—λ§Œ μ‚¬μš©λœλ‹€.

  • 읡λͺ… ν΄λž˜μŠ€λŠ” μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ μƒνƒœλ₯Ό κ°€μ§ˆ 수 μžˆλ‹€. λ°˜λ©΄μ— λžŒλ‹€ ν‘œν˜„μ‹μ€ 간결성을 μœ„ν•΄ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠμœΌλ©°, μƒνƒœλ₯Ό κ°€μ§ˆ 수 μ—†λ‹€. λžŒλ‹€λŠ” 주둜 λΆˆλ³€(immutable)ν•œ 데이터λ₯Ό λ‹€λ£° λ•Œμ— μœ μš©ν•˜λ‹€.

  • 읡λͺ… λ‚΄λΆ€ ν΄λž˜μŠ€λŠ” μ™ΈλΆ€ λ³€μˆ˜μ— 자유둭게 μ ‘κ·Όν•  수 μžˆλ‹€. λžŒλ‹€ ν‘œν˜„μ‹μ€ μ™ΈλΆ€ λ³€μˆ˜ μ€‘μ—μ„œλ„ final λ˜λŠ” effectively final인 λ³€μˆ˜μ—λ§Œ μ ‘κ·Όν•  수 μžˆλ‹€. (finalμ΄λ‚˜ effectively final이라 함은 ν•΄λ‹Ή λ³€μˆ˜κ°€ ν•œ 번 값을 ν• λ‹Ή 받은 μ΄ν›„λ‘œ λ³€κ²½λ˜μ§€ μ•Šμ€ 경우λ₯Ό μ˜λ―Έν•œλ‹€.)

int x = 10;

Runnable runnable = new Runnable() {
	@Override
    public void run() {
        System.out.println("읡λͺ… ν΄λž˜μŠ€λŠ” μ™ΈλΆ€ λ³€μˆ˜μ— 접근이 κ°€λŠ₯ν•˜λ‹€.: " + x);
    }
}
int y = 5;
Runnable runnable = () -> {
	System.out.println("λžŒλ‹€ ν‘œν˜„μ‹μ€ final λ³€μˆ˜λ§Œ μ ‘κ·Ό κ°€λŠ₯ν•˜κ³  μˆ˜μ •ν•  수 μžˆλ‹€.: " + y);
    y = 100; // Compile Error λ°œμƒ
}

πŸ“š 참고자료
https://tecoble.techcourse.co.kr/post/2021-11-21-functional-interface-with-lambda/
https://recepinanc.medium.com/til-29-lambda-expression-prefer-lambdas-to-anonymous-classes-911876939e5
https://www.tcpschool.com/java/java_usingClass_innerClass
https://medium.com/swlh/super-basic-java-anonymous-class-functional-interface-and-lambda-expression-fba411a787
https://medium.com/@knoldus/lambda-expression-vs-anonymous-inner-class-31adb0b3e482

profile
🐾

0개의 λŒ“κΈ€