lan/dart

[Dart] 3. 함수 사용(Function)

캄춰 2023. 12. 5. 16:27
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