2014-08-04 14:41:36
switch문은 if/else문과 같은 조건문의 종류중 하나이다. 다만 if문은 하나의 조건에 대해 하나의 값만 비교를 하는 반면에 switch문은 하나의 식에 여러가지 값을 따져 조건을 분기할 수 있다. if문을 많이 사용해야하는 상황에서 switch문을 사용할 수 있다면 보기 좋게 정리가 가능하다.
switch(식) {
case 값1:
   명령문;
   break;
case 값2: 명령문; break;
case 값3: 명령문; break; default: 명령문; break; }
switch문은 위와 같은 구조를 가지고 있다. switch옆 소괄호안에는 비교할 값이 들어가고 그 값이 어떤값인지에 따라 case가 나눠지게 된다. 만약 값이 어떤 case에도 존재하지 않을 경우에는 default가 실행되는데 default는 생략이 가능하다. 각 case별로 break가 존재하는데 break는 그 case를 실행한 다음 switch문을 빠져나오겠다는 의미의 명령이다. break또한 생략이 가능하다. 다만 break가 생략될 경우에는 조건에 맞는 case를 실행한다음 switch문을 벗어나는것이 아닌 다음 case와 비교하게 된다.
int i = 0;
switch(i) {
case 1:
    Serial.println("1");
    break;
case 2:
    Serial.println("2");
    break;
case 3:
    Serial.println("3");
    break;
default:
    Serial.println("0");
    break;
}
위와 같은 식의 경우에는 int형 변수 i의 값으로 case가 나눠지는데 i = 0이므로 모든 case에 해당하지 않는다. 따라서 위 구문에서는 default가 실행되고 0이 출력된다.
switch문을 사용하여 센서의 값에 따라 다른 문장을 출력하는 간단한 회로도를 만들어보자.
| NO | 부품명 | 수량 | 
| 1 | 아두이노 보드 | 1 | 
| 2 | 아날로그 센서 | 1 | 
| 3 | 10k 저항 | 1 | 
| 4 | 브레드보드 | 1 | 
| 5 | Hook-up wire | 


/*
  Switch statement
 
 Demonstrates the use of a switch statement.  The switch
 statement allows you to choose from among a set of discrete values
 of a variable.  It's like a series of if statements.
 
 To see this sketch in action, but the board and sensor in a well-lit
 room, open the serial monitor, and and move your hand gradually
 down over the sensor.
 
 The circuit:
 * photoresistor from analog in 0 to +5V
 * 10K resistor from analog in 0 to ground
 
 created 1 Jul 2009
 modified 9 Apr 2012
 by Tom Igoe 
 
 This example code is in the public domain.
 
 http://www.arduino.cc/en/Tutorial/SwitchCase
 */
// const가 적힌값들은 변경이 불가능하다
// 내가 읽을 수 있는 센서의 최소값과 최대값을 지정한다
const int sensorMin = 0;      // 센서의 최소값을 설정
const int sensorMax = 600;    // 센서의 최대값을 설정
void setup() {
  // 시리얼 통신 초기화. 통신속도를 9600으로 한다
  Serial.begin(9600);  
}
void loop() {
  // 센서값을 읽는다
  int sensorReading = analogRead(A0);
  // 0부터 600사이의 센서값을 0부터 3사이의 숫자로 상대변환한다
  int range = map(sensorReading, sensorMin, sensorMax, 0, 3);
  // 변환된 값에 따라 switch문을 통해 분기된다
  switch (range) {
  case 0:    // 0일 경우 dark출력
    Serial.println("dark");
    break;
  case 1:    // 1일 경우 dim출력
    Serial.println("dim");
    break;
  case 2:    // 2일 경우 medium출력
    Serial.println("medium");
    break;
  case 3:    // 3일 경우 bright출력
    Serial.println("bright");
    break;
  } 
  delay(1);        // 프로그램 안정성을 위해 딜레이를 준다
}
소스는 간단하다. A0핀에 연결된 아날로그의 센서값을 읽어와서 그 값을 map함수를 통해 아날로그 센서값의 범위를 사상변환 시킨다.
| 1 | map(value, fromLow, fromHigh, toLow, toHigh) | fromLow와 fromHigh값을 toLow값과 toHigh값으로 줄였을때 value값의 상대변환값을 구한다 | 
전역변수로 최소값 0 최대값600으로 설정했는데 사상변환을 통해 0부터 3까지의 범위로 축소한다.
이렇게 축소된 센서값을 switch문으로 여러 조건으로 분기시킨다.
0일경우에는 dark출력(센서값이 0~150), 1일 경우에는 dim출력(151~300),
2일 경우에는 medium출력(301~450), 3일 경우에는 bright을 출력한다.(451~600)
 
			kocoafabeditor					 
				
항상 진취적이고, 새로운 것을 추구하는 코코아팹 에디터입니다!
 제어문, switch, 기타
 제어문, switch, 기타