[Flutter] Flutter에서 Dart 문법(2) - Functions as First Order Objects

2020. 12. 19. 00:50Flutter

Dart에서 특이한 부분은 짚고 넘어가려고 합니다.

말이 이해하는 데 어려운 부분이 있었습니다.  "첫번째 순서 객체로서의 함수?!" 말이 너무 어렵다.....

 


"function은 첫 번째 클래스 object이다" 이 말은 function은 다른 인자처럼 전달될 수 있고! value나 variable, constant 등으로 설정될 수 있다는 뜻이다.

 

-->  문서에서 나온 문장을 해석해봤습니다. 뭔가 함수를 인자처럼 보낼 수 있다고 하는 것 같습니다. 이럴 땐 코드로 

예시를 보고 이해하는 게 훨씬 효율적일 거 같다고 생각합니다. 백문이 불여일타

 

void main(){
   // add 함수
   int add( int num1, int num2 ){
   		return num1 + num2;
   }
   
   // multiply 함수
   int multiply( int num1, int num2 ){
   		return num1 * num2;
   }

   // 계산기 함수 - 계산된 값 리턴
   int calculartor ( int  num1 , int num2 , Function calculation ){
       return calculation(num1 , num2);
   }
    
   int result1 = calculartor( 5 , 8 , multiply );
   print(result1) // multiply 함수를 인자로 넣을 수 있다. - 40 리턴
    
   int result2 = calculartor( 5 , 8 , add);
   print(result2) // add 함수를 인자로 넣을 수 있다. - 13리턴
}

 

 

calculartor라는 계산기 함수에 num1 , num2라는 계산할 수를 넣는 건 좋은데 Function이 껴있습니다!

Function타입으로 인자를 받아 입력받은 function에 따라 다른 값을 리턴하고 있습니다. 

 

함수를 변수의 값으로 할당

 Function calculartor = () { ... }  

 

   void main(){
   	  int result1 = calculartor( 5 , 8 , multiply );
   	  print(result1) // multiply 함수를 인자로 넣을 수 있다. - 40 리턴
    
   	  int result2 = calculartor( 5 , 8 , add);
   	  print(result2) // add 함수를 인자로 넣을 수 있다. - 13리턴
   }
   
   // 계산기 함수 - 계산된 값 리턴
    Function calculartor = ( int  num1 , int num2 , Function calculation ){
       return calculation(num1 , num2);
   };

   // add 함수
   int add( int num1, int num2 ){
   		return num1 + num2;
   }
   
   // multiply 함수
   int multiply( int num1, int num2 ){
   		return num1 * num2;
   }

final로  선언된 calculator가 이제 클래스 밖에서도 함수를 만들고 있는 지 봅시다. 여기서 Dart의 함수의 유연성과 특이한 전달 방법을 확인할 수 있습니다. main함수 안에 없어도 최상위 기능을 가지며 클래스/객체와 연관되지 않습니다.

 

 


클래스 내부에서 사용하는 법

//기능
void slowDrive(){
  print('driving slowly');
}
    
void fastDrive(){
  print('driving fastly');
}

// trigger 함수
void main(){

	// Car클래스로 객체 생성해보자
    // ca1.drive는 slowDrive 기능과 바로 연결된다.
    // 그래서 간단히 print(car1.drive)로 slowDrive를 실행시킨다.
    // car1의 Function타입 drive === slowDrive
    Car car1 = new Car( drive : slowDrive );
    
    // 'driving slowly'를 출력!
    car1.drive(); 
    
    // drive속성을 fastDrive로 변경
    car1.drive = fastDrive;
    
    // 'driving fastly'를 출력!
    car1.drive();
    
    
    Car car2 = new Car( drive : fastDrive );
    // 'driving fastly'를 출력!
    car2.drive(); 

    
}

class Car{

	// 생성자
    Car({this.drive});
    
    // Function타입 속성 drive를 가진다
    Function drive;
}

 

Car car1 = new Car( drive : slowDrive )

 

함수의 속성을 전달할 때 (  car1.drive = fastDrive ) 그냥 단지 그 이름을 할당합니다.. 어떤 괄호로 감싸지도 않고 단순히 그 네임을 써도 Function 속성으로 갈아치웁니다.

(메서드를 호출하고 실제로 괄호를 추가하고, 기능을 트리거할 때는 필요할 수 있습니다)

 

이렇게 함수의 유연성을 알아봤습니다.