나만의 개발노트

[Dart] Functions (함수) 본문

[Flutter]/[Dart]

[Dart] Functions (함수)

노트포미 2024. 7. 13. 14:19

1. 함수 정의 방법

//"Hello $name, nice to meet you." 를 String 타입으로 return하는 함수
String sayHello1(String name){
	return "Hello $name, nice to meet you.";
}

//함수의 body에 return 식 밖에 없는 경우 가능
String sayHello2(String name) => "Hello $name, nice to meet you.";

void main(){
	print(sayHello1("abc"));
}
  • Parameter(매개변수) : 함수 안에서 정의 및 사용에 나열되어 있는 변수들 (여기서 String name)

 


2. Named Parameters

: function parameter에 순서 상관 없이 값을 넣게 할 수 있는 기능

[방법]

1. parameter 양쪽 끝에 { } 추가

2. 호출 시 "변수명 : 값" 입력

//position Parameters
String sayHello(String name, int age, String country){
	return "Hello $name, you are $age, and come from $country.";
}

void main(){
	//호출할 때, parameter 순서를 알고 있어야 함
	print(sayHello('abc',20,'korea'));
}

------------------------------------------------
//Named Parameters, parameter에 {}중괄호 추가
String sayHello({String name, int age, String country}){
    return "Hello $name, you are $age, and come from $country.";
}

void main(){
	//순서가 바뀌어도 괜찮
	print(sayHello(
    	name : 'abc',
        country : 'korea',
        age : 20
        ));
}

 

그런데, 그냥 이렇게 호출하면 Dart의 null-safety 기능으로 오류가 생김

=>  parameter로 값을 다 전달하지 않으면(=미입력하면) null이 발생한다!!

 

[null이 발생하지 않게 하는 방법]

1. default 값 지정

//default값은 String name = 'abc' 이렇게 입력
String sayHello({String name = 'anno', int age = 99 , String country = 'anno'}){
    return "Hello $name, you are $age, and come from $country.";
}

void main(){
	//모든 값이 전달되지 않아도 됨 -> null일 경우 default값으로 설정됨
	print(sayHello(
        country : 'korea',
        ));
}

 

2. required 사용

//각 parameter 앞에 'required' 작성
String sayHello({required String name,required int age ,required String country}){
    return "Hello $name, you are $age, and come from $country.";
}

void main(){
	//required 표시된 값이 필수로 전달되지 않으면, 컴파일 오류 발생
	print(sayHello(
        country : 'korea',
        ));
}

3. QQ Operator

: ??(QQ) 는 만약 left값이 Null이라면 오른쪽 값을 return 한다는 operator

//이름을 대문자로 변경해주는 함수
String upperName(String name) => name.toUpperCase();

void main(){
	upperName('abc');
    upperName(null); //ERROR!- null은 toUpperCase()를 사용할 수 없다
}

 

해결방법1)

: parameter에 '?' 추가 후, if 조건문 사용

//'?'추가
String upperName(String? name){
	//if문
	if(name != null){
    	return name.toUpperCase();
    }
    return "NONE";
}

해결방법2)

: ' ? : ' 연산자 사용

//'? :' 연산자 사용
//name != null 이 true 이면, name.toUpperCase()하고, false이면, "NONE"을 return한다.
String upperName(String? name) => name != null ? name.toUpperCase() : "NONE";

해결방법3)

: '??' 연산자 사용

left ?? right - left가 null이면 right return, null이 아니면 left return

//'??' 연산자 사용
//name.toUpperCase()를 return하지만, name이 null인 경우 "NONE"를 return한다.
String upperName(String? name) => name?.toUpperCase() ?? "NONE";

 

[QQ equal]

: ' ??= ' 연산

left ??= right - left가 null이면, right 할당

void main(){
	String? name;
    //??= (QQ equal)연산자
    //만약 name이 null인 경우 할당한다
    name ??= "abc";
}
  • flutter에서 자주 사용된다

4. Typedef

: 자료형에 alias(별명)을 붙여줄 수 있다

//자료형 List<int>의 별명을 ListOfInts로 정하겠다
typedef ListOfInts = List<int>;

void main(){
	ListOfInts lists = [1,2,3,];
    print(lists);
  	//output : [1,2,3]
}