728x90
반응형
함수 만드는 것은 java와 동일하다.
앞에 타입을 명시하고 뒤에 함수명 그리고 파라메터를 지정한다.
일반 함수 만드는 방법
void : 반환 타입이 없는 함수
// void는 함수가 아무것도 가지고 있지 않음을 말함
// 그래서 return해주는 것이 없음
void sayHello(String name) {
print("Hello World $name");
}
return : 반환 타입이 있는 함수
// return하는 값이 있으려면
String sayHello(String name) {
return "Hello $name nice to meet you";
}
함수 내부에 결과만 표출하는 경우
// return을 지울 수 있다
// '=>' fat arrow syntax
// 코드가 한 줄인 경우 사용하면 좋다
String sayHello(String potato) => "Hello $potato";
함수 parameter
: argument에 명시를 하고 싶은 경우
: parameter들을 중괄호로 감싼다.
positional parameter(normal)
: 파라메터 타입에 맞게 '순서'를 잘지켜서 값을 넣어주면 문제 없다.
// normal
String sayHello(String name, int age, String country) {
return "Hello $name, you are $age, and you come from $country";
}
named parameter
: 그냥 중괄호만 하면 'null safety'에러가 발생한다.
: 그러므로 default value를 넣어주거나, 또는 required modifier를 해주어 null safety 룰을 지키자
// named arguments
String sayHello({String name, int age, String country}) {
return "Hello $name, you are $age, and you come from $country";
}
// 하지만 이렇게 사용하면 컴파일이 안된다. null safety를 설정해주어야 한다.
// 최초 초기화 default value
String sayHello({String name = '', int age = 12, String country = 'korea'}) {
return "Hello $name, you are $age, and you come from $country";
}
// required modifier
// 또 default value로 지정하고 싶지 않은 경우엔
// 앞에 'required'를 명시한다.
// 그럼 sayHello함수 호출시 compiler가 parameter값을 넣으라고 신호를 준다.
String sayHello({required String name, required int age, required String country}) {
return "Hello $name, you are $age, and you come from $country";
}
main code
: kotlin처럼 parameter 값에 '='을 붙이는 것이 아닌 ':' 콜론을 붙인다.
void main() {
print(sayHello('neander', 30, 'korea'));
// 하지만 이렇게 값만 넣으면 좋지 않다.
// kotlin이나 swift처럼 명시하는 것을 추천한다.
// named argument
print(sayHello(
age: 12,
country: 'korea',
name: 'neander'
))
}
optional positional parameter
위에는 모든 parameter를 중괄호로 감싼다.
하지만 parameter하나만 default value를 넣거나 null safety를 하고 싶은 경우는?
: 대괄호를 사용해서 parameter를 감싸주고, question mark를 넣어서 nullable을 허용한다.
: [String? country = 'korea']
// 괄호에 대괄호를 씌우면 된다.
String sayHello(
String name,
int age,
String country) => "Hello $name, you are $age years old from $country";
// String? country 이건 not required라는 뜻~?
String sayHello(
String name,
int age,
[String? country = 'korea'])
void main() {
sayHello('neader', 32, 'korea'); // korea를 빼주고,
sayHello('neader', 32);
}
??, ??= qq문법
: kotlin의 '?:' 와 동일하다.
: fat arrow를 사용할 때 삼항 연산자로 return이 가능하다.
: ??은 좌측이 null인 경우 우측의 값을 반환하고,
: ??= 앞의 값이 null인 경우 우측의 값을 넣어준다는 의미이다.
// qq ??
// ?=
// 문자를 대문자로 변환해주는 함수를 만들 것
String capitalizeName(String name) => name.toUpperCase();
String capitalizeName(String? name) {
if (name != null) {
return name.toUpperCase();
}
return 'NONE';
}
// 또는 더 짧게 'fat arrow'
// java의 3항 연산자와 같다
String capitalizeName(String? name) => name != null ? name.toUpperCase() : 'NONE';
// 더더 짧게
// dart의 '??' qq는 kotlin의 ?: 과 동일한 기능이다.
String capitalizeName(String? name) => name.toUpperCase() ?? 'NONE';
// name.toUpperCase() 결과가 null이면 'NONE'을 반환하라는 코드
// 하지만 더 나아가서 name자체가 null이면 toUpperCase를 호출할 수 없기 때문에 '?'를 붙여 nullable(Optional)하게 함
String capitalizeName(String? name) => name?.toUpperCase() ?? 'NONE';
void main() {
capitalizeName('neander');
capitalizeName(null); // 이렇게 null을 넣고 싶은 경우 String에 '?'넣어 준다. nullable
}
// '??=' 은 무엇인가
void main() {
String? name;
name ??= 'neander';
name ??= 'another';
print(name); // neander null이면 값을 넣어준다. 하지만 null이 아니면 값을 넣지 않는다.
}
typedef 자료형 만들기
: 미리 자료형을 변수처럼 만들어서 필요한 곳에 사용
// 자료형이 헷갈릴 때 사용하는거라..?
// class
typedef ListOfInts = List<int>;
List<int> reverseListOfNumbers(List<int> list) {
var reversed = list.reversed;
return reversed.toList();
}
ListOfInts reverseListOfNumbers(ListOfInts list) {
var reversed = list.reversed;
return reversed.toList();
}
typedef UserInfo = Map<String, String>;
String sayHi(Map<String, String> userInfo) {
return "Hi ${userInfo['name']}";
}
String sayHi(UserInfo userInfo) {
return "Hi ${userInfo['name']}";
}
void main() {
print(reverseListOfNumbers([1,2,3]));
}
728x90
반응형
'lan > dart' 카테고리의 다른 글
[Dart] Dart SDK 위치 (0) | 2023.12.13 |
---|---|
[Dart] StringBuffer : like java's StringBuilder (0) | 2023.12.08 |
[Dart] 4. 클래스 생성자(Constructor) (1) | 2023.12.06 |
[Dart] 2. Data Types (0) | 2023.12.05 |
[Dart] 1. Dart 언어시작 (0) | 2023.12.05 |