함수(Functions)

개인적으로 함수란 개념이 어렵진 않다고 생각하는데 이게 어려워진 이유가 있습니다. 함수라는 용어가 가진 난해함 또 여러 다른 이름으로 불리기 때문입니다. 함수, 서브루틴, 메소드, 프로씨져 등이 오늘날 컴퓨터 프로그래밍에서 통용되는 용어들인데 뭐 다 똑같다고 할 수도 있고 약간씩 차이 있을 수도 있고... 그 이유는 어셈블리어를 배우면 좀 더 알게 되는데요.

 

수학적인 함수는 어떤 순수한 목적을 위해 존재하지만 컴퓨터 프로그래밍에서 기계적으로 함수는 코드가 시작되는 메모리 주소입니다. 따라서 서브 루틴(subroutine)이라는 말이 되지요. 함수는 시작점과 끝점이 있는 미니 프로그램 같은 것으로 그 명령어가 있는 주소로 보내면 같은 명령어들을 얼마든지 반복할 수 있습니다. for문 while 문 같은 반복문이 있지요? 함수를 5번 반복한다면 그 명령어들이 있는 for문을 5번 반복하는 것과도 비슷합니다. (내부적 처리는 다르지만 반복이라는 원리는 같다)

 

 

함수 자체가 가진 복잡함에 객체 지향 프로그램이 나오면서 더 빡빡해졌지요. 객체 지향은 규칙이 더 늘어나니까요. 그 객체 소속에서만 사용할 수 있는 함수를 메소드라 합니다. 아무나 못 건드리기 때문에 당연히 보안성이 높아집니다. 그 만큼 사용에 까다로와 지는 것도 당연하고요. 한때는 객체지향이 모든 프로그래밍의 답이었는데 이제 시간이 지나서 그런 것에 반박하는 의견들도 꽤 있습니다. 함수형 프로그래밍에 특화된 언어도 활발히 사용되고 있습니다.

 

고전적 예제를 한번 볼까요?  void형 함수는 반환값이 없습니다. 함수 이름으로 print하면 toString이 함수에 대한 정보를 가져옵니다. String 매개변수로 받는 void 함수입니다. 매개변수에 타입이 있다는 건 그 타입의 인수를 넣으라는 뜻 입니다. 아무 타입이나 넣지 말고.

 

void main() {
  print(sayHello);
  sayHello("Mr Kim!");
}

void sayHello(String name) {
  print("Hello my friend!, $name");
}
Closure: (String) => void from Function 'sayHello': static.
Hello my friend!, Mr Kim!

함수의 중요한 특징은 로컬 변수인데요. 함수가 둘러싼 { } 안에서 선언된 변수는 지역변수가 됩니다. 지역변수란 것은 함수 호출이 시작할 때 생기고 종료할 때 사라진다는 뜻 입니다.

 

*함수의 반환값에 대해서 알아보겠습니다. 함수 이름은 뭘로 짓든 상관없습니다. 키워드만 침해하지 않으면 됩니다. 아래에서 제곱과 세제곱 함수를 만들 때 보면 double 로 반환합니다. double 값을 매개변수로 받습니다. 왜냐하면 일관성이 있으니까지요.

 

한편 라이브러리 함수(API)에서 루트를 구합니다. dart:math는 다트 라이브러리 함수를 사용하기 위해서 넣습니다.

 

import 'dart:math';

void main() {
  print("3의 제곱은? ${square(3)}");
  print("3의 세제곱은? ${cube(3)}");
  // 라이브러리 API 사용
  print("144의 루트는? ${sqrt(144)}");
}

double square(double x) {
  return x * x;
}

double cube(double x) {
  return x * x * x;
}

 

출력은 다음과 같습니다.

 

3의 제곱은? 9.0
3의 세제곱은? 27.0
144의 루트는? 12.0

 

심플하지만 분명한 설명이 됩니다.

 

이 정도만 알아도 함수를 사용하는데 크게 어려움이 없습니다. 

 

한줄 함수(Single-Line Function)

자바스크립트에도 이런 거 많이 쓰는데 함수를 좀 더 간단하게 표현한 문법입니다. 다음을 보면 훨씬 간소화되었습니다.이렇게 쓰는 이유는 쓰기 쉬우니까... 입니다. 가독성을 위해서 입니다. 뜻은 같으니까 혼동하지 않도록 합니다.

 

double square(double x) => x * x;

double cube(double x) => x * x * x;

 

공유하기

facebook twitter kakaoTalk kakaostory naver band