반응형

Function은 프로그래밍을 하는데 있어서 가장 중요한 기능 중 하나.

효율적인 개발과 중복적인 코드를 사용하지 않게 도와주는것이라 할수있다.

지난 시간 예제를 가지고 활용해보자.

List에 담긴 변수를 합산하는 반복문을 작성해보자.

void main() {
  List testList = [
    1,
    1,
    2,
    3,
    5,
    8
  ];
  
  int total = 0;
  
  for(int number in testList){
    total += number;
  }
  print(total);
}
20

여기서 testList만 있는게 하나가 아니라 여러개가 있다면?

그만큼의 반복문도 어러개가 생겨야 한다.

이러한 불편을 최소화하고, 중복코드를 줄이기 위해 함수를 사용한다.

메인영역 밖에 위의 기능을 담은 함수를 만들어보자

void main() {

}

addList(){
  List testList = [
    1,
    1,
    2,
    3,
    5,
    8
  ];
  
  int total = 0;
  
  for(int number in testList){
    total += number;
  }
  print(total);

}

위와같이 main함수 밖에 List의 값을 합산하는 기능을 가진 addList함수가 만들어졌다.

Dart의 시작은 main함수에서 이루어 지므로, 지금 당장 위 코드를 실행하면 어떤 값도 출력되지 않는다.

방금 선언한 addList();함수를 main 영역에 넣어서 호출하도록 변경한다.

void main() {
  addList();
}

addList(){
  List testList = [
    1,
    1,
    2,
    3,
    5,
    8
  ];
  
  int total = 0;
  
  for(int number in testList){
    total += number;
  }
  print(total);

}
20

일단 여기까지, 함수에 기능을 정의하는 것까지 진행되었는데 

여기까지만 봐도 main 함수 밖으로 뺀거 외에는 다른점이 없어보인다.

그럼 여기에 목적(기능)을 하나 추가해보자.

 

addList함수에 어떠한 List값을 넣어줘도 합산한 결과가 도출되도록 하는 함수를 만들어보자.

다시 얘기하자면 위 소스에 있는 testList변수가 testList2,testList3,testList4....등등 수십개가있다고 가정했을때

기존처럼 코딩한다면 list하나에 반복문 하나씩 해서 만들었겠지만

List값이 여러개여도 이 List값을 합산해주는 반복문 하나만 만들어 보겠다는 뜻이다.

이런 기능을 가능하게 해주는것이 바로 파라미터 이다.

 

자세한건 소스로 확인해 보자.

void main() {
  //3. 당연히 비어있는 값을 파라미터로 넣어주면 안되고, 호출전에는 반드시 값을 선언하여 할당한다.
  List testList = [
    1,
    1,
    2,
    3,
    5,
    8
  ];
  
  addList(testList);
  
  //4. 다른 List값이 있어도 마찬가지로 addList에 파라미터로 넣어서 호출하면 동일한 합산방식의 결과를 얻을 수 있다.
  List testList2 = [
    10,
    20,
    30,
    40,
    50
  ];
  addList(testList2);
}

//1. 기존에 선언하였던 List값을 삭제하고, List타입의 변수를 받겠다고 소괄호안에 선언한다.
//2. 앞으로는 해당 함수에서는 외부에서 List값을 받아서 연산하겠다는 것을 의미한다.
addList(List testList){
  
  int total = 0;
  
  for(int number in testList){
    total += number;
  }
  
  print(total);

}
20
150

기존처럼 했었다면 한개의 변수에 하나의 반복문이 셋트로 이루어졌겠지만

위 처럼 함수로 정의하여 List변수를 받아 공통으로 처리하여 코드의 중복을 줄일수 있다.


위와같이 합산하여 print를 하거나 그 안에서 기능이 동작되면 끝인 함수를 정의할수도 있지만

때에 따라, 함수에서 처리된 결과를 어딘가에 저장한 후, 활용하고 싶을때가 있을수도 있다.

이때 사용하는 방법이 바로 반환(return)받아서 처리하는 방법인데, 

아래 소스에서 순서 및 구문으로 알아보자.

(주석의 번호 순서대로 읽으면서 볼 것)

void main() {
  
  List testList = [
    1,
    1,
    2,
    3,
    5,
    8
  ];
  
  //5. 반환하는 타입과 동일한 변수를 선언하여 할당해주면
  int result = addList(testList);
  
  //6. 아래와 같이 저장하여 해당변수를 어디서든 사용할 수 있다. 
  print(result);

}

//1. 해당 함수를 호출하여 얻는 결과를 반환받을 수 있도록 함수명 앞에 int를 붙여준다.
//2. 이는 해당함수에서 int형 결과값을 반환하겠다는 것을 의미한다.
int addList(List testList){
  
  int total = 0;
  
  for(int number in testList){
    total += number;
  }
  
  //3. 항상 하단에는 반환해주는 구문을 작성한다.
  //4. 함수명 앞에 정의한 타입의 변수만 반드시 리턴해야 한다.
  return total;

}

 

20

 

※함수에서 받는 파라미터(인자)는 1개이상으로 받을수 있으며, 타입에 제한받지 않는다.

int addList(List testList , String a, int b){
...
}

 

파라미터를 3개를 지정했을땐, main 함수 등에서 호출시에 반드시 파라미터를 3개를 넣어줘야 한다.

하지만 때에 따라서 2개만 넣고 3번째는 안넣어도 되도록 만들땐, 아래와 같이 정의하여 사용한다.

그러면 첫번째와 두번째 파라미터는 필수로 넣어줘야 하지만, 세번째는 넣지 않고 호출해도 동작한다.

void main() {
	//3. 세번째 파라미터를 넣지않아도 정상적으로 호출이 가능하다
	addList(testList,'a');
}

//1. 세번째 파라미터 자리에 대괄호를 씌워서 옵션값으로 만든다.
//2. 여기서 조심해야할 부분은 괄호를 씌운 후, null인경우의 기본값을 설정해주는 것이다.
//만약 초기화하지않고, [int b] 이렇게만 표시한 후, 연산 시도시 기본값은 null이기 때문에
//오류가 발생한다.
int addList(List testList , String a, [int b = 3]){
...
	//※출력방식 두가지 방법
	print(b);
	print('$b');
}

이번에는 네임드 파라미터에 대해서 알아보자.

네임드 파라미터는 지정된 변수명에 맞게 파라미터를 할당하면 되는것으로

아래 소스를 통해 확인하자. 주석의 번호 순대로 읽어보면 된다. 

void main() {
  
  List testList = [
    1,
    1,
    2,
    3,
    5,
    8
  ];
  
  
  
  //2. 첫번째, 두번째 파라미터는 순서와 타입을 지켜야 하지만
  //세번째 순서부터는 상관없이 어떤 변수명에 넣어줄지를 지정할수 있는게 네임드 파라미터의 장점이다.
  int result2 = addList2(testList,'a', b:3, d:2,c:1);

}


//네임드 파라미터
//1. 넣어도 되고 안넣어도 되는 옵션형 파라미터 말고, 중괄호를 열어서 선언하여 
//값만 일치하면 되는 네임드 파라미터를 선언한다.
int addList2(List testList , String a, {
int b,
  int c,
  int d
}){
  print('a는 $a, b는 $b, c는 $c, d는 $d');
  
}
a는 a, b는 3, c는 1, d는 2

※요약

함수선언시 반환될 결과값의 타입을 지정해주고, 없으면 생략하거나 void를 작성한다.

함수이름 지정하고,  소괄호영역은 외부변수(파라미터)를 받을수 있다.

이후 중괄호에는 수행할 기능을 정의한다.


이전 스터디 내용도 그렇지만, 함수 부분 또한 알고 있는 내용이라서 강의는 쉽게 이해했지만

이게...정리한다는게 참 만만치 않은거 같다.

새삼..강의하시는 분들이 대단하게 느껴진다.

반응형

+ Recent posts