[JAVA] ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€

2021. 6. 21. 15:57γ†κ°œλ… 정리 μž‘μ—…μ‹€/Java

728x90
λ°˜μ‘ν˜•

μ•ˆλ…•ν•˜μ„Έμš”? μ£Όλ‹ˆν•˜λž‘ μž…λ‹ˆλ‹€!

μ˜€λŠ˜μ€ Lamda에 κ°œλ…μ—μ„œ μ—°μž₯선상인 ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μ— λŒ€ν•΄ 곡뢀 ν•΄ 보도둝 ν•˜λŠ” κ²ƒμ΄μ—μš”.

Lamdaκ°€ 무엇인지 λͺ¨λ₯΄μ‹ λ‹€λ©΄? λžŒλ‹€ ν”Όλ“œμ— 관심을 μ£Όμ„Έμš”!


 

πŸ“Œ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λž€?


πŸ‘‰ 단 ν•˜λ‚˜μ˜ 좔상 Method만 μ„ μ–Έλœ μΈν„°νŽ˜μ΄μŠ€

interface MyFunction { /* ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ 예제 μ½”λ“œ */
	public abstract int max ( int a, int b );
}

 

μœ„μ™€ 같을 λ•Œ μ•„λž˜μ™€ 같이 ν•΄ μ£ΌλŠ” 것이 쒋은 κ²ƒμ΄μ—μš”!

@FunctionalInterface
interface MyFunction {
	public abstract int max ( int a, int b);
}

μ»΄νŒŒμΌλŸ¬κ°€ Annotation을 보고, μ˜¬λ°”λ₯Έμ§€λ₯Ό 확인 ν•΄ μ£ΌκΈ° λ•Œλ¬Έμ— μ„ μ–Έν•˜λŠ” 것이 μ’‹λ‹΅λ‹ˆλ‹€.

 

MyFunction f = new MyFunction() {	/* 읡λͺ… Class의 μ„ μ–Έκ³Ό 객체 생성 λ™μ‹œμ— 진행 */
	public int max ( int a, int b ) {
    	return a > b ? a : b;
    }
}

int value = f.max(3, 5);	// 정상 MyFunction에 max()κ°€ μžˆλ‹€.

 

πŸ‘‰ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ νƒ€μž…μ˜ μ°Έμ‘°λ³€μˆ˜λ‘œ λžŒλ‹€μ‹ μ°Έμ‘° κ°€λŠ₯

단, ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μ˜ Method와 Lamdaμ‹μ˜ λ§€κ°œλ³€μˆ˜ κ°œμˆ˜μ™€ λ°˜ν™˜νƒ€μž… 일치 ν–ˆμ„ μ‹œ!

MyFunction f = (a, b) -> a > b ? a : b;
int value = f.max(3, 5);		//	μ‹€μ œλ‘œλŠ” λžŒλ‹€μ‹(읡λͺ… ν•¨μˆ˜)이 호좜

 

κ²°κ΅­ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λŠ” λžŒλ‹€μ‹μ„ 닀루기 μœ„ν•΄ μ‚¬μš©λœλ‹€λŠ” κ²ƒμ΄μ§€μš”.

 

 

πŸ“ 예제 μ½”λ“œ

@FunctionalInterface		// ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λŠ” 단, ν•˜λ‚˜μ˜ 좔상 λ©”μ„œλ“œλ§Œ κ°–λŠ”λ‹€.
interface MyFunction { /* ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ μ„ μ–Έ */
//	public abstract int max ( int a, int b );
	int max ( int a, int b );		// public, abstractλŠ” μƒλž΅ κ°€λŠ₯
}

class lamda_ex { 
	public static void main (Stringp[] args) { 
    // Object obj = (a, b) -> a > b ? a : b // λžŒλ‹€μ‹ μž‘μ„± (읡λͺ… 객체) 
    // μœ„μ™€ 같이 ν•˜λ©΄ ν•¨μˆ˜ν˜•μœΌλ‘œ 닀루지 μ•ŠλŠ”λ‹€κ³  Error λ°œμƒ // κ²°κ΅­ μœ„μ™€ μ•„λž˜ μ½”λ“œλŠ” κ°™λ‹€. 
      MyFunction mf = new MyFunction() { 
         public int max ( int a, int b ) { // μ˜€λ²„λΌμ΄λ”© - μ ‘κ·Ό μ œμ–΄μžλŠ” μ˜€λ²„λΌμ΄λ”© λŒ€μƒλ³΄λ‹€ 쒁게 μ„€μ •ν•  수 μ—†λ‹€.
              	return a > b ? a : b; 
          } 
      }; 
     int value = mf.max(3, 5); // ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€
    // μœ„μ™€ 같을 λ•Œ ν˜•λ³€ν™˜μ„ ν•΄μ€˜μ•Ό ν•˜λŠ”λ°, 이런 경우 ν˜•λ³€ν™˜μ„ ν•  수 μ—†λ‹€. 
    System.out.println(" value = " + value );
 	}
}


// 좜λ ₯ κ²°κ³Ό : value = 5

 

μœ„μ˜ μ½”λ“œλ₯Ό λžŒλ‹€μ‹ μŠ€νƒ€μΌλ‘œ 쀄이면?

@FunctionalInterface		// ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λŠ” 단, ν•˜λ‚˜μ˜ 좔상 λ©”μ„œλ“œλ§Œ κ°–λŠ”λ‹€.
interface MyFunction { /* ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ μ„ μ–Έ */
//	public abstract int max ( int a, int b );
	int max ( int a, int b );		// public, abstractλŠ” μƒλž΅ κ°€λŠ₯
} // MyFunction 끝

class lamda_ex { 
	public static void main (Stringp[] args) { 
    	
        // λžŒλ‹€μ‹(읡λͺ… 객체)을 닀루기 μœ„ν•œ μ°Έμ‘°λ³€μˆ˜μ˜ νƒ€μž…μ€ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ‘œ ν•œλ‹€.
    	Myfunction mf = (a, b) -> a > b ? a : b;
    
     int value = mf.max(3, 5); // ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€
    // μœ„μ™€ 같을 λ•Œ ν˜•λ³€ν™˜μ„ ν•΄μ€˜μ•Ό ν•˜λŠ”λ°, 이런 경우 ν˜•λ³€ν™˜μ„ ν•  수 μ—†λ‹€. 
    System.out.println(" value = " + value );
 	}
}


// 좜λ ₯ κ²°κ³Ό : value = 5

 

λžŒλ‹€μ‹μ€ 이름이 μ—†λŠ” κ²ƒμ΄μ—μš”. κ·Έλ ‡λ‹€λ©΄ λžŒλ‹€μ‹μ€ ν•˜λ‚˜μ˜ Method인데, 이것을 μ‚¬μš©ν•˜λ €λ©΄ μ–΄λ–»κ²Œ ν•΄μ•Ό ν•˜λŠ” κ²ƒμΌκΉŒμš”?

κ²°κ΅­ 이름이 μžˆμ–΄μ•Ό κ·Έ Methodλ₯Ό ν˜ΈμΆœν•  수 μžˆλŠ” κ²ƒμ΄μž–μ•„μš”?

이것을 μœ„ν•΄μ„œ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ„ μ–Έν•˜κ³ , κ·Έ μ•ˆμ— 좔상 λ©”μ„œλ“œλ₯Ό λ§Œλ“€μ–΄ μ£ΌλŠ” κ²ƒμ΄μ—μš”.

μœ„μ˜ μ½”λ“œλ₯Ό 톡해 mfλΌλŠ” μ°Έμ‘° κ°μ²΄μ—λŠ” int maxλΌλŠ” Methodκ°€ μžˆλ‹€λŠ” 것을 μ•Œ 수 μžˆλŠ” κ²ƒμ΄μ—μš”.

λžŒλ‹€μ‹μ„ mf에 λ„£κ³ , 이것을 μ‚¬μš©ν•  λ•Œ mf.max(λ§€κ°œλ³€μˆ˜)λ₯Ό ν•΄ μ€€λ‹€λ©΄ 호좜이 κ°€λŠ₯ ν•΄ μ§€λŠ” κ²ƒμ΄μ§€μš”.

 

 

    πŸ“ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ - example

πŸ‘‰ 읡λͺ… 객체λ₯Ό λžŒλ‹€μ‹μœΌλ‘œ λ°”κΎΈλ©΄?

@FunctionalInterface
interface Comparator<T> {
	int compare ( T o1, T o2);
} // Comparator 끝

List<String> list = Arrays.asList("abc", "aaa", "bbb", "ddd", "aaa");

collections.sort ( list, new Comparator<String>() {
	public int compare(String str1, String str2) {
    	return str2.compareTo(str1);
    }
});


// μœ„μ˜ compareλ₯Ό λžŒλ‹€μ‹μœΌλ‘œ λ°”κΎΈλ©΄?

Collections.sort( list, ( str1, str2 ) -> str2.compareTo ( str1 ) );

 

 

 

    πŸ“ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ νƒ€μž…μ˜ λ§€κ°œλ³€μˆ˜, λ°˜ν™˜νƒ€μž…

πŸ‘‰ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ νƒ€μž…μ˜ λ§€κ°œλ³€μˆ˜

@FunctionalInterface
interface MyFunction {
	void myMethod();

}	// MyFunction 끝


void aMethod ( MyFunction mf ) {
	mf.myMethod();	// MyFunction에 μ •μ˜λœ λžŒλ‹€μ‹ Method Call
}

μœ„μ˜ μ½”λ“œλŠ” aMethod의 λ§€κ°œλ³€μˆ˜λ‘œ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μΈ mfλ₯Ό λ°›κ³  μžˆλŠ” 것인데, 이것은 κ²°κ΅­ λžŒλ‹€μ‹μ„ λ°›κ² λ‹€λŠ” 의미인 κ²ƒμ΄μ—μš”.

 

MyFunction mf = () -> System.out.println( " myMethod() ");
aMethod( mf );

μœ„μ™€ 같이 λžŒλ‹€μ‹μœΌλ‘œ myMethod()을 호좜 ν•  수 μžˆλŠ” κ²ƒμ΄μ—μš”.

이것을 더 κ°„λž΅ν™”ν•˜κ²Œ 되면 μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

aMethod( () -> System.out.println( "myMethod()" ) );

 

πŸ‘‰ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ νƒ€μž…μ˜ λ°˜ν™˜ νƒ€μž…

MyFunction myMethod() {
	MyFunction mf = () -> {};
   	return mf;
}

μœ„μ˜ MyFunctiond은 λžŒλ‹€μ‹μ„ λ°˜ν™˜ν•œλ‹€λŠ” 의미인 κ²ƒμ΄μ—μš”. 이것을 λ”μš± μΆ•μ•½ν•˜κ²Œ 되면 μ•„λž˜μ™€ 같은 κ²ƒμ΄μ—μš”.

MyFunction myMethod() {
	return () -> {};
}

 

 

πŸ“ 예제 μ½”λ“œ

@FunctionalInterface
interface MyFunction {
	void run();		// public abstract void run();
} // MyFunction 끝

Class Function_Interface_ex {
	static void execute( MyFunction mf ) {	/* λ§€κ°œλ³€μˆ˜ νƒ€μž…μ΄ MyFunction인 Method
    	mf.run();
    }
    
    static MyFunction getMyFunction() {		/* λ°˜ν™˜ νƒ€μž…μ΄ MyFunction인 Method */
    	MyFunction mf = () -> System.out.println( "mf.run()" );
        return mf;
    }
    
    public static void main(String[] args) {
    // λžŒλ‹€μ‹μœΌλ‘œ MyFunction의 run() κ΅¬ν˜„
    	MyFunction mf1 = ()-> System.out.println( "mf1.run()" );
        
        Myfunction mf2 = new MyFunction() { 	/* 읡λͺ…ν΄λž˜μŠ€λ‘œ run() κ΅¬ν˜„ */
        	public void run()	{	// public ν•„μˆ˜!
            	System.out.println( "mf2.run()" );
            }
        }
        
        MyFunction mf3 = getMyFunction();
        
        mf1.run();
        mf2.run();
        mf3.run();
        
        execute( () -> System.out.println( "mf1.run()" );
        excute( () -> System.out.println( "run()" ) );
        
	}
}

// ######################################################################

// μ‹€ν–‰ κ²°κ³Ό
mf1.run()
mf2.run()
mf3.run()
mf1.run()
run()

 

 

 


μ£Όλ‹ˆν•˜λž‘μ˜ 글이 λ§ˆμŒμ— λ“œμ…¨λ‚˜μš”? ꡬ독과 곡감! 그리고, λŒ“κΈ€μ€ μ£Όλ‹ˆν•˜λž‘μ—κ²Œ λ§Žμ€ 힘이 λ©λ‹ˆλ‹€!

728x90
λ°˜μ‘ν˜•