아두이노 코딩 Switch-case 문(아두이노)

in #kr-arduino7 years ago (edited)

아두이노 코딩 Switch-case 문(아두이노)



오늘은 제어문 중에 Switch-case 문에 대해서 살펴보도록 하겠습니다. 이전 시간에 IF문은 조건식에 의해서 참 or 거짓으로 둘 중 하나를 선택하는 제어문이라면 이번시간에 배우는 Switch-case문은 둘 이상의 case 중에 하나를 선택하는 제어문입니다. 쉽게 말해서, 여러개 중에 하나를 선택하는 제어문이라고 생각하시면 됩니다. IF문은 두개로 고정되어 있다면 Switch-case은 여러개의 선택문으로 개념을 잡아 주세요. 이제 Switch-case 문을 어떻게 다루는지 자세히 알아보도록 합시다.

1. Switch-case 문의 순서도


Switch문은 어떤 값이 입력이 되면 각 case 값들 중 일치하는 case의 명령문을 수행하는 제어문입니다. 입력값이 case 1과 일치하면 True로 다음 명령문 1을 수행하지만 일치하지 않으면 다음 case 2와 비교하고 일치하면 명령문 2를 수행하고 일치하지 않으면 다음 case문을 비교하게 됩니다. 여기서, 모든 case 값들이 일치하지 않으면 default가 수행 됩니다. 한마디로 여러개의 case 중에서 일치하면 해당 case 라인의 명령을 수행하고 일치하는 case가 없다면 default의 명령문을 수행한다고 생각하시면 되겠습니다.

그리고, 입력값이 case 2랑 일치하면 명령문 2를 수행하고 뒤에 break 명령으로 Switch문을 빠져 나오는데 이 break 단어를 만나면 더이상 진행하지 말고 해당 Swtich문을 빠져나오라는 명령이니깐 꼭 기억해 주세요. 만약에 break라는 명령문이 없다면 어떤 현상이 발생할까요.

case 1 : 명령문 1;
case 2 : 명령문 2;
case 3 : 명령문 3;
default : 불만족명령문;

이렇게 코딩되어 있으면 break가 생략할 경우 입력값이 2로 case 2랑 일치하여 명령문 2을 수행하고 다음 라인인 명령문 3과 불만족명령문까지 전부 수행하게 됩니다. 이 말은 처음 case 진입은 일치한 위치에서 진입이 이루어지고 수행명령은 일치한 라인을 기준으로 순차적으로 다음 라인의 명령문을 수행한다고 생각하시면 됩니다. case 2의 명령문만 수행할려면 해당 명령문 2를 수행한 뒤에 break 명령으로 더이상 진행하지 말고 해당 Switch문에서 빠져나오라는 강제 명령으로 이해해 주세요.

왜! break 명령을 쓰는지 이해 하셨죠.

2. Switch-case 문의 코드

위 그림과 같은 구조로 구성되었습니다. 입력값 ch변수이고 ch의 저장된 값이 case랑 일치하는 라인의 명령문을 수행합니다.

[ 동작 ]

  • ch=='a' 이면 명령문 1 수행하고 break 명령으로 탈출
  • ch=='b' 이면 명령문 2 수행하고 break 명령으로 탈출
  • ch가 일치하는게 없다면 default의 불일치명령문이 수행되고 끝납니다.

대충 어떻게 동작하시는지 아시겠지요. 실제 코딩을 해볼까요.

[ 소스 ]

void setup()
{
  Serial.begin(9600);  

  char ch = 'y';
  
  switch(ch){
    case 'y': 
                Serial.println("Input : Y");              
                break;  
    case 'n':  
                Serial.println("Input : N");              
                break;  
    default:  
                Serial.println("error");                        
  }  
}

시리얼통신으로 입력 받으면 좋은데 코딩이 길어질 것 같아서 그냥 ch = 'y'가 입력 했다고 치고 진행해보도록 하겠습니다. switch(ch)함수로 입력을 하면 case가 'y'와 'n'이 있습니다. 그래서 'y'가 입력되었기 때문에 첫번째 case문이 수행되고 해당 라인의 "input : Y"라는 문자열이 시리얼모니터로 출력됩니다. 그리고 break명령문으로 switch문을 빠져 나옵니다.

여기서, 'y' or 'n' 이 아닌 다른 문자나 숫자를 입력하면 어떻게 될까요. 바로 default라인이 수행되고 시리얼모니터에는 "error"라는 문자열이 출력되고 끝나게 됩니다. 대충 switch 문을 이해하셨나요.

[ 결과 ]

위에 빨간 사각형이 입력 'y'과 일치하는 첫번째 "case 'y':"라인이 명령문을 수행하고 시리얼모니터로 결과가 출력됩니다. 그리고 break명령으로 switch문을 빠져 나오게 됩니다.

3. Switch-case 문 범위


원래 이경우는 잘 사용하지 않고 여러개의 범위를 나누어서 선택할 때는 IF~else if문을 사용합니다. 비주얼베이직 같은 경우 같은 표현이지만 Select 문이 Switch문인데 범위 지정하는게 의미적으로 편한데 C에서는 좀 표현이 제 경우 부자연스럽게 보입니다. 그래서 그냥 IF~else if문을 사용하고 있네요.

[ 범위 ]

swtich(ch){
    case 1 ... 10:
    case 11 ... 20:
    case 21 ... 30:
    default:
}
    case 'a' ... 'z':

이렇게 점 세개로 표시 합니다. 비주얼베이직의 경우는 To라는 단어로 범위를 표시를 합니다.

Select Case ch
    case 1 To 10 :
    case 11,12,13 :
    case else:
End Select

이런식이면 좀 좋은데 점 3개라 그리고 붙어서 표현하면 안되고 암튼 좀 부자연스러운 범위 지정이네요.

이제 지난시간에 IF문에서 성적 학점을 출력하는 예제를 switch문으로 변경해 보겠습니다.

[ 원소스 ]

void setup()
{
  Serial.begin(9600);
  
  int Eng = 75;
  if (Eng >= 90) Serial.println("A");
  else if (Eng >= 80) Serial.println("B");
  else if (Eng >= 70) Serial.println("C");
  else if (Eng >= 60) Serial.println("D");
  else Serial.println("F");
}

[ Switch-case 소스 ]

void setup()
{
  Serial.begin(9600);
  
  int Eng = 75;  
  switch(Eng){
    case 90 ... 100: 
                Serial.println("A");              
                break;  
    case 80 ... 89:  
                Serial.println("B");              
                break;  
    case 70 ... 79:  
                Serial.println("C");              
                break;  
    case 60 ... 69:  
                Serial.println("D");              
                break;  
    default:  
                Serial.println("F");                        
  }    
}

[ 결과 ]

대충 소스들을 보시고 코딩한 뒤에 입력값들을 다른 값으로 변경하고 실제 돌려보시면 선택 제어문의 동작을 어느정도 이해하실 수 있을거에요.

마무리


Switch문은 IF문가 다르게 여러개의 case 중에 일치하는 하나의 case의 명령을 수행하는 선택 제어문이라고 머리속에 넣어 두세요. 범위의 경우는IF~else if문을 그냥 사용하는게 보기 더 좋겠죠. 오늘 배운 범위 switch 문에서는 이런 표현이 있다는 정도만 알아 두시고요. 개별적인 경우에만 여러개 중에 하나를 선택할 때는 if문보다 Switch문이 가독성이나 표현에서 더 나을 것 같다는 생각이 듭니다.

코딩이라는 것은 우선 자신이 코딩하고 그 코딩한 내용을 읽기 편한 형태로 코딩하는게 무척 중요합니다. 그래서 프로그램 언어 교재들을 보면 스타일들이 약간씩 다릅니다. 분명 동일한 코딩인데 느낌 상 자신과 잘 맞지 않는 코딩들이 있어서 읽어도 무슨 표현인지 잘 이해가 안되는 경우가 많을꺼에요. 제가 쓴 글을 이해 못한신다고 해서 초보분들은 자신이 부족한게 아니라 제 코딩 스타일이 잘 안맞아서 그런거니깐요 여러 코딩들을 살펴보고 자신에 맞는 스타일을 찾아서 공부하시는게 진짜 중요합니다.

저도 C언어 책이 5권이 넘습니다. 필요에 따라서 여러 종류를 구매를 했는데 어떤 책은 보기가 쉽고 어떤 책은 나와 안맞아서 읽기가 힘든 책들도 있었습니다. 이게 저자의 코딩과 나의 코딩 스타일이 다를 때 발생하는 문제인데요 혹시 프로그램언어에 관심있으시면 서점에서 같은 종류의 서로 다른 저자들의 책들을 한번 읽어보세요. 어떤책은 느낌이 오고 어떤책은 봐도 모르겠다고 생각이 드는 느낌이 전혀 없는 책들도 있습니다. 그 책이 문제가 있는게 아니라 자신이 공부한 수준과 또는 지금까지 공부해왔던 코딩 스타일이 책을 쓴 저자와 나의 코딩이 다르기 때문입니다.

혹시 이글을 읽고 이해가 안되면 다른 루트로 검색을 통해서 해당 제어문을 찾아서 읽어 주시기 바랍니다. 아두이노 입문자에게 코딩을 할 때 필요한 최소 문법만 소개하는 포스트라서 생략된 부분이 많습니다. 이해가 안되면 타이틀 제목을 키워드로 해서 구글 검색을 통해 해당 문법을 따로 공부해주세요.

이상으로 마무리 하도록 하겠습니다.

Sort:  

주로 어떤 프로그램 짜시는지요? 항상 재미있게 보고 있습니다.

그냥 잡식성이죠. 흥미가 생기는 로직이나 툴 같은것 있으면 한번씩 사용해보는 스타일이여서요.
어떤 결과를 얻기위한 로직짜는 걸 좋아해요.
요새는 Steem API 재밌어 보여서 함수는 대충 자바스크립트로 사용은 할 수 있는데 이걸로 뭘 표현할까하고 요즘 웹쪽 언어를 보고 있어요
어제 jQuery는 써보적 없어서 웹 코드공부할 오픈 소스들이 jQuery형식이 많아서 어제 한시간정도 공부하고 기초 문법은 터득한 상태네요.
파이썬이나 문법 공부해서 기초적인건 얼마 안걸릴 것 같기는 한데 그걸로 자동봇이나 코딩해 볼까도 생각 했는데 자동봇 만들면 스팀활동에 소홀할해질것 같아서 아예 그 부분은 시도는 안하고 개인 상황판이나 만들려고 공부중이네요

Hey, just wanted to let you know I gave you an upvote because I appreciate your content! =D See you around

There is no record of you.

앗, 컨닝할 만한 댓글이 없네.. ㅠㅠ

^^
내일까지해서 기초문법은 끝나네요. 더 나가면 프로그램 언어 영역이여서 더 어려워 질 것 같아서 이정도만 해야겠어요.
주말에는 뭘 포스팅 할까 고민중! ^^

으으..... 보기만 해도 머리가 아픕니다... 수학은 괜찮은데.... 프로그래밍은 보면 왤케 머리가 아파지는건지... ㅠㅠ

처음이 약간 힘든 것 같아요.

아두이노에 관심이 있어서 팔로우 하고 갈게요

만나서 반갑습니다.

!!! 힘찬 하루 보내요!
https://steemit.com/kr/@mmcartoon-kr/5r5d5c
어마어마합니다!! 상금이 2억원!!!!!!

또 한주가 시작이네요.
즐거운 한주를 시작해봅시다.

Coin Marketplace

STEEM 0.19
TRX 0.25
JST 0.038
BTC 97219.48
ETH 3408.71
USDT 1.00
SBD 3.02