[dart] Function

hana jeong·2023년 5월 1일
0

함수 정의하기


void sayHello(String name) {
	print("hello $name!)
}

함수를 정의할 때 파라미터의 자료형과 파라미터명을 적음
함수 앞의 void는 함수가 어떤 것도 리턴하지 않는 다는 뜻임(타스랑 똑같음)
그런데 지금 문자열을 리턴하고 있으니 다음과 같이 고치면 됨

 sayHello(String name) {
	return 'hello $name';
}

void main () {
	print(sayHello('haha'));
}

혹은 

String sayHello(String name) {
	return 'hello $name';
}

void main () {
	print(sayHello('haha'));
}

named parameter

String sayHello(String name, String nickname, int age){
	return 'hello i am $name, people call me $nickname. and i am $age years old. nice to meet you!' 
}


void main () {
	print(sayHello('haha', 'one', 1);
    // hello i am haha, people call me one and i am 1 years old. nice to meet you!
}

하지만 전달해야할 요소가 많아지면 유저가 요소의 순서를 헷갈릴 수도 있고 값을 넣지 않는 상황이 생길 수도 있음

이를 방지하기 위해 다음과 같은 방법을 사용할 수 있음

named argument


String sayHello({String name, String nickname, int age}){
	return 'hello i am $name, people call me $nickname. and i am $age years old. nice to meet you!';
}


void main () {
	print(sayHello(
    age: 1,
    name: 'haha',
    nickname: 'one',
    ));
    }

함수의 파라미터 적는 곳에 중괄호를 추가한 후,
함수를 호출 할 때 순서에 상관없이 argument의 이름들을 적으면 됨

그런데 dart가 에러메세지를 띄움

각 파라미터가 null을 가질 수 없는데 지금 보면 null이 들어올 수도 있어~ (유저가 값을 안 보내는 경우가 있을 수 있음)
default value 설정하든가 아니면 require modifier 설정해~라고 친절하게 메세지를 보냄

String sayHello({String name = 'orange', String nickname = 'two', int age = 5,}){
	return 'hello i am $name, people call me $nickname. and i am $age years old. nice to meet you!';
}


void main () {
	print(sayHello(
    age: 1,
    ));
    }
    //hello i am orange, people call me two. and i am 1 years old. nice to meet you!

default value를 설정해 유저가 까먹고 다른 값들을 안 적어 보냈을 때 기본값을 적용함

근데 만약 default value를 설정하기 싫거나 혹은 실제 data를 받아야하기 때문에 default value를 사용하지 못한다면 어떻게 할까?
바로 required를 사용하면 됨

String sayHello({
 required String name, 
 required String nickname, 
 required int age,
}) {
return 'hello i am $name, people call me $nickname. and i am $age years old. nice to meet you!';
}


void main () {
	print(sayHello(
    age: 1,
    name: 'haha',
    nickname: 'one',
    ));
    }

optional positional parameters

String sayHello(
 String name, 
 String nickname, 
 int age,
) => 'hello i am $name, people call me $nickname. and i am $age years old. nice to meet you!';


void main () {
	print(sayHello('hh', 'one', 1,));
    }

named argument를 적용하고 싶지 않은데 parameter 중 하나를 require 하지 않게 하려면 다음과 같이 하면 됨

String sayHello(
 String name, 
 String nickname, 
 [int? age = 5]
) => 'hello i am $name, people call me $nickname. and i am $age years old. nice to meet you!';


void main () {
	print(sayHello('hh', 'one',));
    }
    
    // hello i am hh, people call me one. and i am 3 years old. nice to meet you!

하지만 자주 사용하는 방법은 아님

QQ operator, QQ equals

String lowercaseName(String name) {
	return name.toLowerCase();
}

void main () {
  print(lowercaseName('ABC'));
    } // abc

그런데 사용자가 null을 입력할 수 있게 하고싶음

String lowercaseName(String name) {
	return name.toLowerCase(null);
}

void main () {
  print(lowercaseName());
    } 

값이 null이 될 수도 있다는 걸 알려주기 위해서 다음과 같이 파라미터 넣는 곳에?을 사용해보자

String lowercaseName(String? name) => 
  name != null? name.toLowerCase() : 'haha';

void main () {
  print(lowercaseName());
    } // haha

삼항 연산자를 사용해 name이 null이 아니라면 name.toLowerCase()를 리턴하고 null이면 'haha'를 리턴하게 함
하지만 ??(QQ Operator)를 사용해 더 간결하게 작성할 수 있음

String lowercaseName(String? name) => 
  name?.toLowerCase() ?? 'haha';

void main () {
  print(lowercaseName());
    } // haha

??를 기준으로 좌측이 null이면 우측을 리턴
??를 기준으로 좌측이 null이 아니라면 그대로 좌측을 리턴함

??=(QQ equals or QQ assignment operator)

void main() {
	String? name;
    name ??= 'haha';
    // name이 null이면 우측의 값을 할당하라는 뜻
}

typedef

typedef는 자료형에 alias를 사용할 수 있게 해줌
하지만 좀 더 구조화된 데이터는 class를 사용하는 것이 일반적임
typedef는 간단한 데이터의 alias를 만들 때 사용함(List나 Map, set 등)

List<int> reverseNumbers(List<int> list) {
	var reversed = list.reversed;
    return reversed.toList();
}

위의 List 예시를 typedef를 통해 바꾸어보자면 다음과 같음

typedef ListOfInts = List<int>

ListOfInts reverseNumbers(ListOfInts list) {
	var reversed = list.reversed;
    return reversed.toList();
}

void main() {
 print(reverseNumbers([1,2,3,4]));
}
// [4,3,2,1]

ListOfInts라는 alias를 만들어 List<int> 대신 사용함
dart는 둘 다 같은 자료형으로 받아들이기 때문에 잘 작동함


자바스크립트하다가 다트하니까 재밌다... 헤헤
자료형을 저렇게 써주는 것도 재밌음...(물론 자바스크립트도 ts쓰면 되지만 ㅎ...)
내일은 드디어 class 듣는다 예이 너무 재밌을듯

profile
https://developer-hh.tistory.com 로 옮깁니다

0개의 댓글