[Dart] function

SSO·2023년 11월 27일
0

App-Develop-Study

목록 보기
3/6

오늘은 다트의 간단한 함수 내용들에 대해 포스팅을 해 볼 것이다!

function

앞에서 다른 문법들을 다루면서 우리는 기본적인 main함수를 기준으로 봤다.

void main(){}

이런 형태로 함수가 생겼었는데 여기서 void 는 뭘까?

void : 함수가 아무것도 값을 반환하지 않음을 명시해주는 것이다.

그럼 반환해주는 값이 있다면 그 반환값의 타입을 함수 앞에 명시해주면 된다!
함수가 간단히 한 줄이라면 단순히 fat arrow syntax를 사용해서도 표현할 수 있다.

void potato(String thing) {
  print("This is $thing");
}

void main() {
  potato('potato');
}

potato라는 함수는 void로 선언되었기 때문에 return을 넣어주면 에러가 발생한다.
위의 함수를 main에서 실행해주면

이렇게 출력되는 것을 확인할 수 있다.


그럼 함수가 값을 리턴하게 하려면 어떻게 할까?
반환할 값의 타입을 void 대신 함수 앞에 명시해주면 된다

String potato(String thing) {
  return 'This is $thing';
}

void main() {
  print(potato('potato'));
}

이렇게 해주면 potato라는 함수는 문자 타입의 값을 반환하는 함수가 된다.


위의 함수처럼 한 줄 짜리의 단순히 값을 리턴해주기만 하는 경우 fat arrow syntax를 활용해서도 표현이 가능하다

String potato(String thing) => 'This is $thing';

이렇게 해주면 위의 코드와 똑같은 의미이다.

파라미터가 하나가 아니라 두 개여도 위의 예시들처럼 각 파라미터의 타입을 명시해서 넣어주면 된다.
간단히 더하기를 구현한 함수의 예시로 작성해보면 아래와 같이 코드를 작성할 수 있다.

num plus(num a, num b) => a + b;

named parameter

파라미터가 많아지면 해당 파라미터들의 순서를 모두 기억해야 하는 것이 번거로울 수 있다.

이러한 불편함을 해소하는데에 매우 좋은 기능이 named argument이다!
즉, 파라미터들의 순서를 기억하지 않아도 함수의 정의를 보고 파라미터들의 이름에 따라서만 데이터를 넣어주면 된다.

named arguments를 사용할 거라는 것을 함수에 알려주는 것은 파라미터들을 {}로 감싸주기만 하면 된다.

원래였으면 우리는 함수를 작성하고 호출할 때 아래와 같이 했을 것이다.

String sayHello(String name, int age, String city) {
  return "My name is $name. I'm $age. I'm from $city";
}

void main() {
  print(sayHello('sso', 23, 'Korea'));
}

이러한 경우 함수 호출 시 argument들의 순서가 바껴서 타입이 달라지거나 하면 에러가 발생할 수도 있고 모든 순서를 기억하는 것이 힘들다.

위의 코드를 named argument를 활용해서 바꿔보자.

String sayHello({String name = 'name', int age = 0, String city = 'USA'}) {
  return "My name is $name. I'm $age. I'm from $city";
}

void main() {
  print(sayHello(name: 'sso', city: 'Korea', age: 23));
}

이렇게 수정해주면 함수를 호출할 때 인자들의 순서가 달라도 에러가 발생하지 않는다.

하지만 위와 같이 named argument를 사용할 경우 다트는 null safety기능을 가지고 있으므로 null값이 들어와 에러가 발생할 것을 대비해서 함수의 파라미터들의 default값을 꼭 지정해줘야 한다.

함수에 값을 넣지 않고 호출을 하면 default값을 넣어 출력되는 것을 확인할 수 있다.


만약 우리가 데이터 값을 넣어주는 것이 아닌 사용자로부터 받아와야 하는 경우라면 혹은 default값을 지정해주고 싶지 않다면 어떻게 해야 할까?

그때는 각 파라미터의 맨 앞에 required를 붙여주면 된다!

String sayHello(
    {required String name, required int age, required String city}) {
  return "My name is $name. I'm $age. I'm from $city";
}

이렇게 해주면 함수에 인자가 들어오지 않았을 경우 다트는 이를 감지하고 함수를 컴파일하지 않는다!


optional positional parameter

함수를 호출할 때 인자를 넣어주지 않더라도 함수가 잘 작동하도록 하려면 어떻게 해야 할까?-?

그때는 []로 파라미터를 감싸주고 타입 뒤에 ?를 붙여주고 해당 파라미터의 default값을 지정해주면 된다.

String sayHello(String name, int age, [String? city = "Korea"]) {
  return "My name is $name. I'm $age. I'm from $city";
}

위처럼 함수를 작성해주면 city파라미터는 함수를 호출할 때 전달되는 인자 값이 없다면 알아서 default값인 Korea가 들어가서 함수가 작동한다.


?? operator

우리는 함수를 작성하면서 간단한 조건문의 경우 삼항연산자를 자주 사용하고는 한다.

삼항 연산자란?
조건이 조건 ? 참 : 거짓 이런 형태로 조건이 참이라면 에 해당하는 것을, 거짓이라면 거짓에 해당하는 코드를 실행한다.

이런 코드를 더 간략하게 줄일 수 있는게 바로 ?? 연산자다!

하나 예시를 들어보자.
문자 타입의 name을 받아 대문자로 바꿔주는 함수를 만든다.

null값이 들어올 경우 Not 을 리턴하도록 삼항 연산자를 사용해 함수를 작성했다.

String capitalize(String? name) => name != null ? name.toUpperCase() : 'Not';

void main() {
  capitalize('sso');
  capitalize(null);
}

그럼 이제는 위의 함수를 ?? 연산자를 사용해 작성해보자.=

우선 ?? 연산자의 의미부터 알아보자.

left ?? right

?? 를 기준으로 좌항이 null일 경우 우항을 리턴하고, null이 아니라면 좌항을 그대로 리턴한다는 의미이다.

위의 코드를 바꿔보면 아래와 같이 바꿀 수 있다.

namenull일 경우에도 toUpperCase()함수를 실행할 수 있도록 name뒤에 ? 를 붙여 name?.toUpperCase() 와 같이 작성해준다.

String capitalize(String? name) => name?.toUpperCase() ?? 'Not';

void main() {
  capitalize('sso');
  capitalize(null);
}

이렇게 작성해주면 인자로 null이 들어갔을 때 함수를 실행해보면 좌항의 값이 null이므로 Not 을 리턴한다.


(에고 이미지가 너무 크게 들어가넹,,)


??= 연산자

??= 연산자는 변수의 값이 null일 경우 null 대신의 값을 설정해주는 연산자이다.

void main(){
	String? name;  //null이 될 수 있는 변수 
	name ??= 'sso';
	name = null;  //name의 값이 null이 됨
	name ??= 'another'; //name의 값이 null이므로 대신 another이라는 값을 넣어준다
}

위의 코드에서 name을 출력해보면 another이 출력되는 것을 확인할 수 있다.


다트의 함수 관련 내용은 매우 많지만 간략한 내용들에 대해서 다뤄보았다👩🏻‍💻
다음 포스팅에서는 다트의 클래스에 대해서 기본적인 내용들을 알아볼 예정이다!
-끝-

profile
Github_qkrthdus605

0개의 댓글