2020. 12. 19. 00:50ㆍFlutter
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 속성으로 갈아치웁니다.
(메서드를 호출하고 실제로 괄호를 추가하고, 기능을 트리거할 때는 필요할 수 있습니다)
이렇게 함수의 유연성을 알아봤습니다.
'Flutter' 카테고리의 다른 글
[Flutter] Stateful 위젯 생명주기 메서드 (0) | 2020.12.31 |
---|---|
[Flutter] Routes 와 Navigation (feat. 멀티스크린) (0) | 2020.12.26 |
[Flutter] Flutter에서 Dart 문법 (enum 타입 , 삼항 연산자, Map 타입) (0) | 2020.12.13 |
[Flutter] 사용자 동작(제스터)를 감지하는 GestureDetector위젯 (0) | 2020.12.12 |
[Flutter] 정적 이미지 파일 가져오기 (화면에 따른 조정법) (0) | 2020.09.13 |