Flutter/Dart 입문

[Dart] 8. Function

Couldi 2021. 10. 15. 16:02
반응형

21. 10. 15.

- Could -

 

이 글은 프로그래밍 입문을 Flutter 때문에 Dart로 시작하는 사람들을 위한 글입니다.
프로그래밍 언어가 가지고 있는 기본 컨셉 자체를 Dart라는 언어를 통해 설명하고,
많은 분들이 Flutter를 위해 학습한다고 생각해, 추후 Flutter 학습에 도움이 되는 방향으로 작성되었습니다.
1. Function
    - 함수의 정의
    - 함수의 사용

이걸 배우기 위해서 앞서 다른 내용들을 배웠다고 해도 과언이 아니다. Function을 배우고 나서 앞선 내용들을 다시 읽어보면, 안보이던게 보이게 되는 경험을 하게 될지도 모른다! 그만큼 중요하고 프로그래밍 전반에 영향을 끼치는 구성요소라는 이야기이다.

 

1. Function

우리말로 함수다. f(x)? 라는 생각이 들며 머리가 지끈할 수도 있겠지만 좀 더 간단하고 직관적으로 설명해보고자 한다.

이것은 바로 함수상자

초등학교 수학시간에 연산문제를 풀때 저런 상자를 마주했던 기억이 있다. 저 네모난 상자 안에 숫자를 집어넣고, 상자 안에 적힌 규칙대로 사칙연산을 한 후 답을 구하는 그런 문제들이였다. 프로그래밍에서 얘기하는 함수는 저기 있는 네모난 상자를 코드로 바꾸어 표현한거라 생각하면 쉽다.

() { };

가장 기본이 되는 함수이다. 하지만 일반적으로 사용되는 함수의 모습은 아니다. (Anomymous Function이라고 하며, 함수의 일반적인 사용을 설명한 후 다시 설명한다.) () {}로 구성되어 있는 모습이 익숙해 보이지 않는가? 앞서 다뤘던 if문, while문, for문, forEach메소드에서도 (){}와 같은 모양의 괄호의 나열이 사용되었다. 생각이 안난다면 지금 보고와도 좋다.

 

하나 생각했으면 하는 개념은, 함수도 변수와 마찬가지로 상자의 일종이라는 점이다. 조금 특이한 상자다. 변수라는 상자를 만들어 데이터를 넣어두면 보관만 하는 상자라면, 함수는 데이터를 넣으면 가공을 거쳐 새로운 데이터를 만들어주는 마법상자다. 

 

함수의 정의 : 마법상자를 만드는 과정

함수를 정의한다는 건, 변수를 정의할 때랑 똑같은 과정이다.

마법상자를 만드는 과정

변수를 정의하는건 변수 안에 들어갈 데이터타입에 따라 데이터타입을 선언해주고 이름을 붙여 상자를 만들어주기만 하면 되는 간단한 과정이였다.

함수같은 경우는 데이터가 들어갔다가 새로운 데이터가 되어 나와야 하기때문에 두가지를 생각해야한다.

'들어가야하는 데이터''나와야하는 데이터'

 

함수를 정의할 때는, 뭐가 들어가서 뭐가 나오는지 정의를 해줘야한다.

 

//예제
int addTwo(int x) {
    int y = x + 2;
    return y;
}

리턴값타입 함수명(파라미터) {
	코드;
	return 리턴값;
}

 

 

위의 코드가 함수를 정의하는 일반적인 방법이다.

  • 함수명 - 이건 상자를 지칭하는 이름이다. 예제를 살펴보자면 addTwo가 이 함수의 이름이다.
  • { } 안에 적는 내용은 함수가 실행되면 동작할 코드들이다.
  • 파라미터(parameter) - 번역은 매개변수라고 이루어지지만, 그냥 파라미터라고 하는게 속편하다. 상자 안에 들어갈 데이터가 어떤 데이터인지 정의해주는 부분이다. 예제를 기준으로 설명하자면 'int타입의 데이터가 들어가고 함수 안에서는 x라고 부르겠다.' 라고 쓰여있다. 중요한건 들어가는 데이터의 타입을 사전에 정의해줘야한다는 점이다.
  • return - return은 함수에서 나갈 데이터를 정해주는 명령어이다. return 다음에 나갈 데이터를 적어주면 된다. 예제에서는 y를 적었으므로 함수를 실행하면 y의 값이 나오게 된다.
  • 리턴값 - 리턴값, 반환값, 리턴 등 개발자에 따라 다양하게 부른다. 애초에 return되는 value라 해서 return value가 옳은 표현이지만  현지화 과정 중 다양한 이름이 파생된거 같다. 함수의 결과값이라 생각하면 된다.
  • 리턴값타입 - 나와야하는 데이터의 타입을 적어주는 자리이다. 함수가 실행되고 최종적으로 나올 데이터의 타입을 적어주면 된다.

위의 내용들은 일반적인 함수일 때에 대한 설명이다. 함수에 따라 들어가는 데이터가 없을 수도 있고, 나오는 데이터가 없을 수도 있다. 심한 경우 함수에 함수를 집어 넣고 함수를 리턴값으로 받아오는 경우도 있다! (이게 무슨 개소리야 싶겠지만, 함수형 프로그래밍(functional programming)에서는 아주 자연스러운 방식이다.)

갑자기 너무 많은 내용이 쏟아져서 당황스러울 수 있다. 걱정하지말고 차근차근 따라가보자.

 

void

void는 return value가 없는 함수인 경우 사용한다. value가 있어야 데이터 타입을 적어줄텐데, return하는 value가 없으니 적어줄 데이터 타입도 없다. 그럴때 쓰는게 void다.

 

void hello() {
    print('hello');
};

 

위에 hello라는 함수를 정의했다. 이 함수는 실행시키면 'hello'를 출력하는 것이 전부인 함수이다. 한번 DartPad를 이용해 실행해보자.

 

 

함수를 실행할때는 함수명과 ()를 적어주어야한다. 

 

이 hello 함수 같은 경우에는 넣어야하는 데이터도 없고, 리턴하는 데이터도 없다. 그저 hello만 출력할 뿐이다. 그러면 한번 이름을 받아 인사를 출력하는 함수로 수정해보자.

 

void hello(String name) {
    print('hello, $name');
}

 

어떤 부분이 달라졌는지 코드와 결과를 비교해보자. Parameter에 String name을 선언해주었고, 그 결과 hello라는 함수를 사용할때마다 () 안에 String 데이터를 받아 인사를 출력하고 있다. 하지만 이 코드 역시 반환값은 존재하지 않는다.

 

저기 출력되는 'hello, James', 'hello, Harry'는 리턴값이 아닌가요?
아니다. 저건 리턴값이 아니다. 그저 console에 보여지는 메세지일 뿐이다. 처음 프로그래밍을 공부하는 사람들이 많이 헷갈려하는 내용이다. 리턴값이라는 건 하나의 데이터로, 변수 안에 담길 수 있어야 한다. 텍스트편집기 안에서 리턴값의 활용이 가능해야 한다.
전혀 이해가 안간다면, '함수 내에 return이라는 애가 없으니, return value는 존재하지 않는다!' 라고 생각하자.

 

void main() { }

드디어 이걸 설명한다. DartPad를 보면 항상 적혀있고, 우리는 {} 안에 코드를 짜왔다. 위에서 다뤘던 함수들의 경우 정의를 하고 사용하기 위해서는 별도로 호출을 해줘야했지만, void main(){} 함수는 특이한 함수라 정의와 동시에 실행되는 녀석이다. 깊게 생각할 필요는 없고, 아 이것도 함수였구나 알고 넘어가자.

 

Anomymous Functions (익명함수)

앞서 다뤘던 () { } 이 익명함수이다. flutter 공부를 시작하면 종종 보게 될 녀석이다. 일반적으로 함수는 이름을 가지고, 사용할때마다 이름을 적어 호출을 하는데, 이 Anomymous 함수는 이름이 없기 때문에 다른 곳에서 호출 할 수가 없다.

그래서 보통 정의된 곳에서 바로 사용하면 될때 사용하는 함수고, void callback 이라고 불리기도 한다.


함수의 사용

// 함수명(argument);

hello();
hello('James');

 

앞서 다뤘던 hello 함수를 가져왔다. 함수명을 적고 () 안에 들어갈 argument(인자)를 적는다. parameter에 해당하는 데이터값을 적어주면 된다. (argument와 parameter를 구분하지 않고 사용하는 사람들이 간혹 있는데... 가능하면 구분하면 좋겠다. parameter는 함수에 넣을 데이터를 담기 위한 변수의 선언이고, argument는 그 변수에 넣는 값을 의미한다.)

parameter vs. argument
parameter는 함수를 정의할 때 선언해주는 변수이다. 아래 예제에서 int brithYear, int currentYear가 parameter이다.
argument는 함수를 사용할때 적는 데이터 혹은 변수이다. 아래 예제에서 사용된 1980, 2021, 2000, 2021이 argument이다.
// 함수 정의
int calculateAge(int brithYear, int currentYear) {
    return currentYear - brithYear;
}

// 함수 사용
print(calculateAge(1980, 2021));

int myAge = calculateAge(2000, 2021);
print(myAge);​

 

 

반응형