- Today
- Total
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 프로그래머스 레벨2
- coding test
- 다트
- 자료구조
- 디자인 패턴
- 코딩테스트
- Design Pattern
- Algorithm
- 프로그래머스 swift
- datastructure
- dart
- 정렬 알고리즘
- 디자인패턴
- 프로그래머스
- 프로그래머스 level1
- 정렬알고리즘
- 코테
- programmer
- swift 알고리즘
- swift
- swift split
- rxswift
- sort
- 감성에세이
- swift 코딩테스트
- 정렬
- 스위프트
- 알고리즘
- 스위프트디자인패턴
- programmers
Bill Kim's Life...
[Dart] Functions(함수) 본문
Dart 언어에서의 Functions(함수)에 대하여 살펴봅니다.
#. 구독 대상
- Dart 언어를 처음 접하시면서 공부해보고 싶으신 분
- 플러터(Flutter) 개발에 관심이 있어나 해보고 싶으신 분
- 멀티 플랫폼 모바일 앱 개발을 시작하고 싶으신 분
- 기타 소프트웨어 개발과 지식에 관심이 있으신 모든 분들
Function
Dart는 순수 객체지향 언어(True object-oriented language)이므로 함수도 Function인 객체로 다룹니다. 즉 함수를 변수에 할당하거나 다른 함수에 인자로 전달 할 수 있다. Dart 클래스의 인스턴스를 함수처럼 호출할 수도 있습니다.
Dart에서의 함수가 가질 수 있는 특징들은 아래와 같습니다.
- 변수가 함수 참조 가능
- 다른 함수의 인자로 함수 전달 가능
- 이름있는 선택 매개변수
- 위치적 선택 매개변수
- 익명함수 및 람다
그렇다면 Dart에서의 함수 사용법과 특징들에 대해서 구체적으로 예제 코드와 함께 살펴보도록 하겠습니다,
Implementation
기본적인 함수 사용 형태를 보면 아래와 같습니다. 기본적으로 함수는 함수명, 함수 입력 파라미터, 함수 반화값 등으로 구성됩니다.
일반적인 다른 언어와 다른 점은 반환값에 타입 선언을 생략할 수도 있다는 점입니다.
또한 요즘 새로운 언어들의 특징 중인 하나인 함수 구현부와 반환에 대한 축약(Shorthand)도 가능합니다.
bool isNoble(int atomicNumber) {
return _nobleGases[atomicNumber] != null;
}
// 반환 타입 생략 가능
isNoble(atomicNumber) {
return _nobleGases[atomicNumber] != null;
}
// 함수 구현 및 반환에 대한 축약 가능(=> expr 은 { return expr; } 와 동일)
bool isNoble(int atomicNumber) => _nobleGases[atomicNumber] != null;
Optional parameters
함수를 호출 할 때 paramName: value 형태로 명명된 매개변수(Named parameters)를 지정할 수 있습니다.
매개변수의 순서를 상관할 필요가 없으며, 필요한 매개변수만 사용할 수 있습니다.
선택적 파라미터의 사용 방식은 {param1, param2, …} 형태로 다음과 같이 선언 합니다.
꼭 필수로 입력받아야하는 매개변수가 있다면 @required 어노테이션(Annotation)을 이용합니다. 단 @required 어노테이션을 사용하려면 meta 패키지를 설치하고 import 해야됩니다.
enableFlags(bold: true, hidden: false);
/// Sets the [bold] and [hidden] flags ...
void enableFlags({bool bold, bool hidden}) {...}
const Scrollbar({Key key, @required Widget child})
String say(String from, String msg, [String device]) {
var result = '$from says $msg';
if (device != null) {
result = '$result with a $device';
}
return result;
}
assert(say('Bob', 'Howdy') == 'Bob says Howdy');
assert(say('Bob', 'Howdy', 'smoke signal') ==
'Bob says Howdy with a smoke signal');
Positional parameters
기본 매개변수로 정의된 함수는 호출할 때 정의된 모든 매개변수를 입력하지 않으면 에러를 발생시킵니다.
선택적으로 매개변수를 생략하기를 원한다면 위치 매개변수를 사용하면 됩니다. 해당 매개변수들을 괄호[]로 감싸면 됩니다.
String say(String from, String msg, [String device]) {
var result = '$from says $msg';
if (device != null) {
result = '$result with a $device';
}
return result;
}
assert(say('Bob', 'Howdy') == 'Bob says Howdy');
assert(say('Bob', 'Howdy', 'smoke signal') ==
'Bob says Howdy with a smoke signal');
Default parameter values
일반적인 C와 같은 형태로 = 표현으로 함수 파라미터에 대한 기본값을 설정할 수 있습니다. 함수 파라미터에 대한 기본값을 별도로 설정하지 않을 경우에는 null로 설정됩니다.
/// Sets the [bold] and [hidden] flags ...
void enableFlags({bool bold = false, bool hidden = false}) {...}
// bold will be true; hidden will be false.
enableFlags(bold: true);
String say(String from, String msg,
[String device = 'carrier pigeon', String mood]) {
var result = '$from says $msg';
if (device != null) {
result = '$result with a $device';
}
if (mood != null) {
result = '$result (in a $mood mood)';
}
return result;
}
assert(say('Bob', 'Howdy') ==
'Bob says Howdy with a carrier pigeon');
void doStuff(
{List<int> list = const [1, 2, 3],
Map<String, String> gifts = const {
'first': 'paper',
'second': 'cotton',
'third': 'leather'
}}) {
print('list: $list');
print('gifts: $gifts');
}
The main() function
Dart에서의 main() 함수는 애플리케이션 진입점 역할을하는 top-level 함수입니다. 모든 애플리케이션은 반드시 main() 함수를 가지고 있어야 합니다.
main 함수는 선택적으로 List<String>를 매개변수로 가질 수 있습니다. args 라이브러리를 이용하면 명령행 인자(command-line arguments)들을 처리 할 수 있습니다.
void main() {
querySelector('#sample_text_id')
..text = 'Click me!'
..onClick.listen(reverseText);
}
// Run the app like this: dart args.dart 1 test
void main(List<String> arguments) {
print(arguments);
assert(arguments.length == 2);
assert(int.parse(arguments[0]) == 1);
assert(arguments[1] == 'test');
}
Functions as first-class objects(1급 객체)
Dart에서도 함수는 1급 객체로 사용될 수 있습니다. Dart 함수에서의 1급 객체의 조건은 아래와 같습니다.
- 변수나 데이터에 할당 할 수 있어야 한다.
- 객체의 인자로 넘길 수 있어야 한다.
- 객체의 리턴값으로 리턴할 수 있어야 한다.
void printElement(int element) {
print(element);
}
var list = [1, 2, 3];
// Pass printElement as a parameter.
list.forEach(printElement);
var loudify = (msg) => '!!! ${msg.toUpperCase()} !!!';
assert(loudify('hello') == '!!! HELLO !!!');
Anonymous functions
대부분의 함수는 main(), printElement()와 같이 이름을 가지고 있습니다. Dart를 비롯해 많은 언어들이 익명 함수, 람다(lambda), 클로저(closure)라고 부르는 이름없는 함수를 만들 수 있습니다. 익명함수는 다른 함수처럼 변수에 할당하여 컬렉션에서 추가하거나 제거 할 수 있습니다.
익명함수는 아래와 같이 정의합니다.
예제 코드를 살펴보면 아래와 같습니다.
var list = ['apples', 'bananas', 'oranges'];
list.forEach((item) {
print('${list.indexOf(item)}: $item');
// 0: apples
// 1: bananas
// 2: oranges
});
Lexical scope
Dart에서는 중첩(Nested) 함수 방식으로 함수안에 함수를 선언할 수 있습니다. 이때에 함수 내의 내부 변수의 유효범위는 코드의 레이아웃에 의해서 정적으로 결정됩니다. 변수의 유효범위는 중괄호를 따라서 내부까지로 확장됩니다.
아래는 변수의 유효 범위에 대한 예를 보여주는 코드입니다.
bool topLevel = true;
void main() {
var insideMain = true;
void myFunction() {
var insideFunction = true;
void nestedFunction() {
var insideNestedFunction = true;
assert(topLevel);
assert(insideMain);
assert(insideFunction);
assert(insideNestedFunction);
}
}
}
Lexcial closure
Lexcial closure는 closure 혹은 fcuntion closure 라고 부릅니다. 프로그래밍 언어에서 클로저는 일급 객체 함수의 개념을 이용하여 유효 범위에 묶인 변수를 바인딩 하기 위해서 사용하는 기술입니다다.
아래 코드를 보면 makeAddr 함수내부에 설정된 익명함수는 addBy정보를 저장 할 수 있습니다. 반환된 함수는 어디에서든지 addBy를 기억하게 됩니다.
/// Returns a function that adds [addBy] to the
/// function's argument.
Function makeAdder(int addBy) {
return (int i) => addBy + i;
}
void main() {
// Create a function that adds 2.
var add2 = makeAdder(2);
// Create a function that adds 4.
var add4 = makeAdder(4);
assert(add2(3) == 5);
assert(add4(3) == 7);
}
Testing functions for equality(함수 동일성 테스트)
함수도 하나의 객체로 표현됨에 따라서 서로 동일한지에 대한 비교를 할 수 있습니다.
아래의 예제는 최상위 함수, 정적 메서드, 메서드의 인스턴스가 동일한지 테스트하는 예제 코드입니다.
void foo() {} // A top-level function
class A {
static void bar() {} // A static method
void baz() {} // An instance method
}
void main() {
var x;
// Comparing top-level functions.
x = foo;
print(foo == x); // true
// Comparing static methods.
x = A.bar;
print(A.bar == x); // true
// Comparing instance methods.
var v = A(); // Instance #1 of A
var w = A(); // Instance #2 of A
var y = w;
x = w.baz;
// These closures refer to the same instance (#2),
// so they're equal.
print(y.baz == x); // true
// These closures refer to different instances,
// so they're unequal.
print(v.baz != w.baz); // true
}
Return values
모든 함수는 리턴을 가집니다. 리턴 값을 지정하지 않으면 기본적으로 null을 반환합니다.
foo() {}
assert(foo() == null);
지금까지 Dart 언어에서의 Functions(함수)의 특징과 정의에 대해서 살펴보았습니다.
감사합니다.
[참고 자료(References)]
[1] A tour of the Dart language : dart.dev/guides/language/language-tour
[2] 다트 함수 (Dart Function) : brunch.co.kr/@mystoryg/119
[3] Flutter 변수와 함수의 기본 : sysocoder.com/flutter-변수와-함수의-기본/
[4] 다트(Dart) 언어 기본기 다지기 : blog.doldol.me/dart/2019-11-16-Dart-기본기-다지기/
[5] flutter에서 사용하는 dart 언어의 함수 알아보기 : minwook-shin.github.io/flutter-dart-lang-tour-function/
'CS(컴퓨터 과학) > Dart' 카테고리의 다른 글
[Dart] Exceptions(예외 처리) (0) | 2020.08.20 |
---|---|
[Dart] Control flow statements(제어문) (0) | 2020.08.20 |
[Dart] Operators(연산자) (0) | 2020.08.19 |
[Dart] Collection : List & Set & Map (0) | 2020.08.19 |
[Dart] Variables(변수) (0) | 2020.08.19 |