Day15 - jeremy0405/Codesquad_CS GitHub Wiki

λ―Έμ…˜μ„ μ§„ν–‰ν•˜λ©΄μ„œ Function 클래슀λ₯Ό 직접 μ„€κ³„ν•˜λŠ”λ° μ „μ—­λ³€μˆ˜μ˜ 값을 μ°Έμ‘°ν•΄μ•Ό ν•˜λŠ” 일이 생겼닀. λ”°λΌμ„œ μˆœμˆ˜ν•¨μˆ˜λ₯Ό λ§Œμ‘±ν•˜κΈ° μœ„ν•΄μ„œ final ν‚€μ›Œλ“œλ₯Ό μ„ μ–Έν•˜κ³  μ‚¬μš©ν•˜λ©΄ λ˜κ² μ§€λΌκ³  μƒκ°ν•˜κ³  μ „μ—­λ³€μˆ˜λ₯Ό final둜 μ„ μ–Έν–ˆλ”λ‹ˆ μ—λŸ¬κ°€ λ‚¬μ—ˆλ‹€. μ—λŸ¬λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„œ κ·Έλƒ₯ μ „μ—­λ³€μˆ˜λ₯Ό Function 클래슀의 λ§€κ°œλ³€μˆ˜ (INPUT)으둜 λ„£μ–΄μ„œ ν•΄κ²°ν–ˆλŠ”λ° 노리와 BCκ°€ νŽ˜μ–΄ν”„λ‘œκ·Έλž˜λ°μ„ ν•˜λŠ” 것을 κ΅¬κ²½ν•˜λ‹€κ°€ 이 λ‘˜μ˜ μ½”λ“œμ—μ„œλ„ λ‚˜μ™€ λ˜‘κ°™μ΄ 이런 μ—λŸ¬λ₯Ό λ°œμƒμ‹œν‚¨ 것을 λ³΄μ•˜λ‹€. λ‚˜λŠ” λ‹Ήμ‹œ ν•¨μˆ˜μ˜ μŠ€μ½”ν”„λ•Œλ¬Έμ— μ—λŸ¬κ°€ λ‚˜λŠ” 것 κ°™λ‹€κ³  μ„€λͺ…ν•΄μ£Όκ³  λ„˜μ–΄κ°”μ—ˆλŠ”λ° μ€€κ³Ό λ°€λŸ¬κ°€ 이 뢀뢄에 λŒ€ν•΄ μ°Ύμ•„λ΄μ£Όμ‹œκ³  정리λ₯Ό ν•΄μ£Όμ…”μ„œ 이 뢀뢄에 λŒ€ν•΄μ„œ λ‚˜λ„ λ‚΄ λ‚˜λ¦„λŒ€λ‘œ 정리λ₯Ό 해보렀고 ν•œλ‹€.

public class App {

	private final number;

	public App(int number) {
		this.number = number;
	}

	Predicate<Integer> lambda = (n) -> number % n == 0;

	public void foo() {
		Predicate<Integer> local = (n) -> number % n ==0;
	}
}

lambdaμ—μ„œλŠ” number에 μ—λŸ¬κ°€ λ°œμƒν•˜κ³ 

localμ—μ„œλŠ” number에 μ—λŸ¬κ°€ λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€.

λ‚˜λŠ” λ‹¨μˆœνžˆ λ³€μˆ˜μ˜ μŠ€μ½”ν”„κ°€ localμ—μ„œλŠ” foo()λ©”μ„œλ“œμ΄κΈ° λ•Œλ¬Έμ— local의 numberλŠ” 항상 μ „μ—­λ³€μˆ˜κ°€ 값이 ν• λ‹Ήλœ 이후에 μ‚¬μš©λ˜λ‹ˆκΉŒ μ—λŸ¬κ°€ λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€κ³  μƒκ°ν–ˆλ‹€.

그런데 lambda도 항상 numberκ°€ 값이 ν• λ‹Ήλœ 이후에 μ‚¬μš©λœλ‹€. ν•˜μ§€λ§Œ 컴파일 μ—λŸ¬κ°€ λ°œμƒν•˜λŠ”λ° μ΄λŠ” ν•¨μˆ˜μ˜ μŠ€μ½”ν”„κ°€ App Class이기 λ•Œλ¬Έ(lexical scopeκ·œμΉ™μ„ κ°–μŒ)이닀. 이와 κ΄€λ ¨ν•΄ λ§ˆμŠ€ν„°μ¦ˆ 멀버 Kκ°€ 남겨주신 링크

λ‚˜λŠ” μ—¬κΈ°κΉŒμ§€λ§Œ μƒκ°ν•˜κ³  λ„˜μ–΄κ°”μ—ˆλŠ”λ° λ°€λŸ¬λŠ” ν•œ 단계 더 κ³ λ―Όν–ˆλ˜ 것 κ°™λ‹€. (λŒ€λ‹¨ν•˜λ‹€..)

λ°€λŸ¬λŠ” μ•„λž˜μ™€ 같이 읡λͺ…ν΄λž˜μŠ€λ‘œ μ •μ˜λ₯Ό ν–ˆμ„ μ‹œμ— 컴파일 μ—λŸ¬κ°€ λ°œμƒν•˜λŠ”μ§€ ν™•μΈν–ˆλ˜ 것 κ°™λ‹€. λ¬Όλ‘  μ—λŸ¬λŠ” λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€. (anonymous의 test()의 ν•¨μˆ˜μ˜ μŠ€μ½”ν”„κ°€ App Class 더 쒁기 λ•Œλ¬Έμ— 항상 μ΄ˆκΈ°ν™” 된 이후에 μ‚¬μš©μ΄ λ˜λ‹ˆκΉŒ)

public class App {

	private final number;

	public App(int number) {
		this.number = number;
	}

	Predicate<Integer> anonymous = new Predicate<Integer>() {
		@Override
		public boolean test(Integer n) {
			return number % n == 0;
		}
	}

	Predicate<Integer> lambda = (n) -> number % n == 0;

	public void foo() {
		Predicate<Integer> local = (n) -> number % n ==0;
	}
}

이 μ£Όμ œμ— λŒ€ν•΄ 읡λͺ…μ˜ λ§ˆμŠ€ν„°μ¦ˆ 멀버가 남긴 정리 κΈ€

⚠️ **GitHub.com Fallback** ⚠️