반응형

해당 이미지가 저작권에 위배될시 죄송합니다

이번 스터디는 Dart의 typedef다.

Typedef는 Function과 굉장히 밀접하게 연결이 되어있다.

이 Typedef를 사용하면 함수를 미리 시그니처와 해서 여러가지 함수를 유용하게 다룰수 있는 기능을 제공해준다.

바로 소스로 알아보자.

먼저 간단하게 덧셈과 뺄셈을 하는 함수를 정의한다.

void main() { 
	//잘 나오는지 확인
  add(1,2);
  subtract(3,2);
    
}

void add(int x, int y){
  print('x더하기 y는 ${x+y}입니다.');
}

void subtract(int x, int y){
  print('x빼기 y는 ${x-y}입니다.');
}
x더하기 y는 3입니다.
x빼기 y는 1입니다.

 

그리고 이번에는 typedef를 하나 선언해보자.

void main() { 
  add(1,2);
  subtract(3,2);
    
}

void add(int x, int y){
  print('x더하기 y는 ${x+y}입니다.');
}

void subtract(int x, int y){
  print('x빼기 y는 ${x-y}입니다.');
}

typedef Operation(int x, int y);

여기까지만 보면,

함수는 반환타입 또는 void를 지정한 후, 함수명과 파라미터의 구조다.

typedef의 경우도 정의한 형태는 함수와 큰 차이를 보이지 않는다.

유일한 차이로는, 함수의 경우 중괄호 영역을 펼쳐서 수행할 내용을 작성하지만, typedef의 경우 그렇지 않다는 것이다.

그럼 어떻게 사용하는 것일까?

직접 예제로 한번에 활용하자.

(주석의 넘버링된 순서대로 읽어나가면 되겠다.)

void main() { 
  add(1,2);
  subtract(3,2);
    
  print('-----구분선-----');
  
  //1. 변수선언 하듯이, type은 typedef에 선언한 Operation으로 하고,
  //2. 변수명 짓듯이 알아서 짓는다.
  //3. 여기에 할당하는것은 미리 정의해둔 함수를 할당한다.
  Operation oper = add;
  
  //4. 위와 같이 지정한 후, oper을 실행하게 되면?  
  oper(1,2);
  //5. add함수를 호출했던것과 같은 결과를 나타낸다.
  //6. 즉, oper를 호출한다는 것은 -> add를 호출하는것과 같은 것이다.
  
  //7. 반대로 oper에 뺌셈기능을 하는 함수를 정의해주면
  oper = subtract;
  
  oper(3,2);
  //8. subtract함수의 기능을 수행하여, 결과를 표시한다.
  //9. 여기서 주의할 점은, typedef에 정의해둔 것과 사용하려는 함수의 파라미터가 같아야 한다.
  
  
}

void add(int x, int y){
  print('x더하기 y는 ${x+y}입니다.');
}

void subtract(int x, int y){
  print('x빼기 y는 ${x-y}입니다.');
}

typedef Operation(int x, int y);

※즉, typedef를 이용하면 함수들을 변수처럼 사용할 수 있게 만들어 준다.

여기서 드는 의문...그냥 함수를 호출하면 되는것이 아닌가? 굳이 typedef를 사용해야 할까?

유용하게 사용할 수 있는 기능을 예제로 만들어보자.

이번에도 임의 함수를 하나 선언하자.

void calculate(int x, int y, Operation oper){
  oper(x,y);
}

위 calculate라는 함수는 int형의 x,y를 받고 typedef 하나를 받도록 되어있다.

실제 main함수에서 호출해보면,

void main() { 
  calculate(1,2,add);
  calculate(3,2,subtract);    
}

void add(int x, int y){
  print('x더하기 y는 ${x+y}입니다.');
}

void subtract(int x, int y){
  print('x빼기 y는 ${x-y}입니다.');
}

typedef Operation(int x, int y);

void calculate(int x, int y, Operation oper){
  oper(x,y);
}
x더하기 y는 3입니다.
x빼기 y는 1입니다.

함수에 인자로 함수를 넣고, 그 값을 받은 calculate는 첫번째, 인자와 두번째인자를 가지고 세번째 typedef를 실행한다.

여기까지만 봐도 아직 크게 와닿지 않을 수는 있다..나도 그렇지만...

자주는 아니지만 가끔은 쓰일때가 있다고 한다. 일단 알아두도록 하자

나중에 인자로 함수 막 박혀있고 그러면 헷갈리니깐~~

오늘 스터디 typedef끝.

반응형
반응형

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를 작성한다.

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

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


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

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

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

반응형
반응형

계속 이렇게 이미지 주워다 써도 괜찮으려나

한정되고, 명확한 상수의 집합. Enum 타입에 대해 공부해 보자.

특정 프로그램을 개발하는데 3가지 상태값을 가지는 기능이 있다고 해보자.

그 3가지 상태값은

1. 승인 - approved

2. 반려 - rejected

3. 대기 - pending

상태별로 지정할 값 이름을 정했다면 선언 후, 코딩을 시작하자.

void main() {
  String status1 = 'approved';
  
  if(status1 == 'approved'){
    print('승인되었습니다.');
  }else{
    print('반려 또는 대기 중입니다.');
  }
}

위 코드를 실행하면 아래와 같은 결과가 나타나며, 문제없이 수행된다.

승인되었습니다.

하지만 할당해준 값이 잘못되었거나 외부로 부터 넘겨받은 값이 한 글자라도 틀렸다면

무조건 반려 또는 대기중이라는 결과가 도출될것이다.

void main() {
  String status1 = 'approved';
  
  //만약 아래와 같이 실수했다면?
  if(status1 == 'approveb'){
    print('승인되었습니다.');
  }else{
    print('반려 또는 대기 중입니다.');
  }  
  //무조건 else를 타게되며 이런 문제는 종종발생한다.
}
반려 또는 대기 중입니다.

게다가 승인,반려,대기는 어떤값들인지 코멘트도 없다면 버그픽스에 큰 어려움이 있다.

이때 활용할 수 있는것이 바로 enum 타입 상수이다.

프로그램 상단, 그러니깐 자바로 치면 상수를 선언하는 영역, 전역변수 영역에 아래와 같이 선언한다.

enum Status {
  approved,
  rejected,
  pending
}

void main() {

}

이후 아래 변경된 코드를 살펴보자.

enum Status {
  approved,
  rejected,
  pending
}

void main() {
  //상수 Status타입의 변수를 선언하여, 상수 approved값을 할당한다.
  //(상수는 절대 변하지 않는 값.)
  Status status2 = Status.approved;
        
  //변수와 다르게 위험성을 최소화 하여 조건문을 실행할수 있다.
  //enum을 사용해서 한정된 옵션을 굉장히 효율적으로 사용할 수 있다.
  if(status2 == Status.approved){
    print('승인되었습니다.');
  }else{
    print('반려 또는 대기 중입니다.');
  }  
  
  //※상수에 포함된 목록들을 아래와 같이 확인해 볼 수도있다.
  print(Status.values.toList());
  
}
승인되었습니다.
[Status.approved, Status.rejected, Status.pending, Status.whyy]

이렇게 변치않는 고정값(상수)에 대해서는 개별적으로 코딩하지말고 상수로 지정하여 활용하는 것이

이후 업무협업이나 안정적인 코딩과 프로그램을 위해서 필요하다고 생각된다.

enum type 상수 스터디 끝.

반응형
반응형

늘 그렇듯이 글 시작이 허전해서 주워온 이미지

이번 스터디는 다른 언어들에도 있는 반복문.

For, While, Do While 반복문에 대해서 다뤄보려 한다.

 

이제와서 얘기하는거지만, 이 Dart 포스팅들은 강의 내용을 보고 나만의 정리이기 때문에

혹시나 공부용으로 보시는 분들은 헷갈릴 수 있다.

 

아무것도 모르는 왕초보가 진짜 제대로된 강의를 듣고자 한다면, 또는 다른언어를 사용중이지만

Dart를 배워보고자 하는 개발자라면 내가 정리한 포스팅보다 아래 포스팅에 써둔 추천강의(유튜브)를

보는게 더 이득일거라 생각된다. (하단 링크첨부)

 

Flutter개발을 위한 Dart언어 왕초보 강의

Flutter를 이용한 앱개발을 위해 Dart강의를 찾던 중 유튜브에서 기가막힌 강의를 찾아냈다. (혹시 Dart언어에 대해 빠르고 간략하게 기초를 쌓고 싶으신 분에게 추천드림..) 정말 마음에 드는점은

masswhale.tistory.com


그럼 스터디 시작.

단순하게 0부터 9까지 출력하는 반복문을 만들어보고자 한다.

여태 스터디한 내용들을 전부 기억한다면 아래 for구문도 이해할 수 있다.

void main() {
  for(int i=0; i <10;i++){
      print(i);
  }
  
}

상세설명

1. for는 괄호안에 조건에 따라 중괄호 영역에 있는 구문을 수행하는 반복문이다.

2. 소괄호안에 int i라는 변수를 선언과 동시에 초기화한다(기본값 선언)

3. 변수 i는 10을 초과할 수 없다.

4. 변수i는 10을 초과하기 전까지 증가한다.

5. 소괄호안에 있는 조건이 맞지 않을때까지 중괄호 안의 구문은 실행된다.

 

for라는 반복문을 사용하기 위해선 위와같이 작성해야 한다.

그러니깐 위의 소스는 i가 0부터 9까지 1씩 증가하면서 변수 i를 print하라는 반복문이다.

실행결과는 아래와 같다.

0
1
2
3
4
5
6
7
8
9

단순한거 같지만, 처음에 쓰려면 헷갈릴 수 있다.

방법은 자주 사용하는수 밖에.


이번에는 List타입의 변수를 선언하여 연산해보자.

아래와 같은 List타입의 변수에 값들이 있다고 하자.

  List numbers = [
    1,
    1,
    2,
    3,
    5,
    8
  ];

반복문을 모르는 상태에서 numbers의 값들을 모두 더하라고 하면 아마 아래와 같이 표현할 것이다.

int total = numbers[0] + numbers[1] + numbers[2]....

6개만 들어있어서 그렇지 수십,수백개가 들어있으면....어휴..

하지만 for라는 반복문을 사용하면 , 보다 간단하게 numbers의 값들을 합산할 수 있다.

void main() {
    List numbers = [
    1,
    1,
    2,
    3,
    5,
    8
  ];
  
  int number = 0;
  
  for(int i= 0; i < numbers.length; i++){
    //print(numbers[i]);
    number += numbers[i];
  }
  
  print(number);
  
}

i값을 List의 Index로 활용한 것이며, 시작은 반드시 0이라는 것을 잊지말자.

헷갈리면 아래 포스팅 참고.

 

Dart언어공부-07.List 타입

지난 스터디에서 공부해본 변수선언 타입들과는(var, dynamic, String, int) 다른 형태인 List에 대해서 알아보고자 한다. (아래 소스 첨부함) 혹시나..이 글을 읽고 공부를 하고 있다면, 아래 첨부한 소

masswhale.tistory.com


다시 돌아와서, 위 반복문의 실행결과 값을 보면 간단한 반복문으로 원하는 합산결과가 나타났음을 확인할 수 있다.

20

그런데 for문은 위와 같이 사용할 수 있지만, 다른방법으로 Index를 활용하지 않고도 내부의 값들을 합산할수 있다.

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

바로 numbers에 들어있는 값들을 _number라는 변수에 할당하고, 다음값으로 넘어가면서 += 연산을 하여 구할수 있다.

실행결과는 같지만, Index를 활용하지 않고 값만 가지고 활용할 때 사용할 수 있다.

20

이번에는 while과 do while반복문에 대해서 알아보자.

while은 for보다 간단하게 true false조건을 넣어 수행시킬 수 있다.

void main() {
  int numbers1 = 10;
  
  while(numbers1 < 20){
    print(numbers1);
    numbers1 ++;
  }
}

while소괄호 안 numbers1이라는 변수가 20보다 작다면 중괄호 영역에 있는 기능이 수행된다.

10
11
12
13
14
15
16
17
18
19

조건에서 20미만일때만 동작하도록 정의되어 있기때문에 19까지만 출력된다.

만약 위에서 numbers1++가 없다면, numbers1의 값은 증가하지 않고 계속 10일것이며

조건에서는 numbers1이 20이 되지 않기때문에 무한히 기능을 수행하도록 한다. = 무한루프

for문도 마찬가지지만, while문에서 종종하는 실수들이니, 주의해서 사용하자.


주어진 조건이 만족하는 내에서 동작하는 while을 알아봤다면 이번에는 선 실행 후, 조건을 체크하는 반복문인

do while에 대해 알아보자.

바로 소스로.

void main() {
  int numbers2 = 10;
  
  do{
    print(numbers2);
    numbers2 ++;
  }while(numbers2 < 20);
}

numbers2라는 변수에 10이 할당되어 있다. do영역에서 먼저 print한 후, 1을 증가시킨 다음에 20미만인지를 

체크한다. 실행결과는 아래와 같다.

10
11
12
13
14
15
16
17
18
19

단순히 여기까지만 봤을때, while과 do while의 차이를 잘 못 느낄수도 있다.

하지만 while과 do while은 분명히 다르다. 그에 대한 증명은 아래 소스로 확인해보자.

void main() {
  
  int numbers1 = 10;
  
  while(num < 10){
    print(num);
    numbers1 ++;
  }
  //위 코드는 실행되지 않는다. 왜냐면 이미 시작조건인 10미만일때만 실행되기 때문이다.
  
  do{
    print(num);
    num ++;
  }while(num < 10);
  
  //10이 정상적으로 출력된다. do while에서는 먼저 수행 후, 조건만족여부를 체크하기 때문이다.
  //이로써 기능 수행 전 조건확인, 기능 수행 후 조건확인이 증명된다.
}

실행결과

10

마지막으로 break와 continue에 대한 간단한 정리.

void main() {
  
  int num2 = 10;
  
  //1. num2를 1씩 증가시키면서 20미만이면 기능을 수행하는 while문이 있다.
  while(num2 < 20){
    print(num2);
    num2 ++;
    
    //2. 하지만, 이 변수 num2가 수행도중 15값이 되면?
    if(num2 == 15){
      //3. 더이상의 반복문 수행을 멈추고 탈출한다.  를 의미한다.
      break;
    }
  }
  //기능 실행시 15까지 출력 후, 그 이후 값은 출력하지 않고 나오는것을 볼수 있다.
  
  //for에서도 가능하다.
  //1. while문과 마찬가지로 조건을 부여한 후
  for(int x = 0; x < 10; x++){        
    //2. x의 값이 1씩 증가하면서 5가 되는 순간
    if(x == 5){
      //3. 해당 반복문을 탈출한다. 를 의미한다.
      break;
    }
    print(x);
  }
  
  //continue?
  //continue를 쓰면 보통은 기능 수행 후 이어가는것이라고 생각하는 사람들이 있다.
  //아래 변수x가 1씩증가될때마다 print하는 반복문을 살펴보자.
  for(int x = 0; x < 10; x++){        
    //1. 변수x의 값이 5가 되는 순간, 반복문은 탈출하지 않지만 이후 기능은 수행하지않고
    // 다음 반복단계로 넘어간다.
    //따라서 실제 수행해보면 0부터 9까지 출력은 되지만, 값 5만 출력되지 않은것을 확인할 수 있다.
    if(x == 5){
      continue;
    }
    print(x);
  }
  
}

 

실행결과

10
11
12
13
14
0
1
2
3
4
0
1
2
3
4
6
7
8
9

 

강의를 들으면 이미 아는 내용이라서 가볍게 넘겼던 것들을 블로그로 정리하려니깐 

생각보다 양도 많아지고, 시간도 오래 걸리는 듯 하다.

하지만 기억에는 잘 남을듯?

반응형

+ Recent posts