[번외] C 기초 코딩 문법으로 다른 언어 배우기

IOT/아두이노기초문법|2019. 4. 16. 09:00

[번외] C 기초 코딩 문법으로 다른 언어 배우기



오늘은 아두이노를 포스팅 하려다가 주말이고 해서 이번주에 배운 기초 코딩 문법으로 다른 언어를 습득에 대해서 이야기를 하려고 합니다. C언어의 기초 문법만으로도 다른 언어를 어느정도 기초 독학이 가능합니다. 그 예로 자바계열인 자바스크립트를 소개하도록 하겠습니다. 소개한 목적은 나중에 Steem API를 연동해서 Steem 블록체인 정보를 개인적으로 활용해 볼 수 있기 때문에 간단히 기초만 소개 합니다.

1. 자바스크립트 세팅


[기본 HTML]

<!DOCTYPE html>
<html>
<body>

<p id="demo"></p>
<script>
    document.getElementById("demo").innerHTML = "Hello World!";
</script>

</body>
</html> 

위의 코딩은 html 기본 구조입니다. 여기서 코딩하는 위치는 stript 태그 사이에 자바스크립트 언어로 코딩할 예정입니다.

[결과]


여기에서 자바스크립트 문법은

document.getElementById("demo").innerHTML = "Hello World!"

HTML 문서에 id "demo"의 위치를 가리키게 되는데 nnerHTML는 값을 가져오거나 설정할 수 있다. 해당 id를 가진 태그를 가리키고 거기에다 "Hello World!"를 저장한다고 생각하시면 됩니다.

<p id="demo> 저장위치 </p>

이런식으로 그냥 이해해 버리세요. 원래는 p태그 사이에 "Hello World"로 설정하는건데 쉽게 의미적으로 저 문장으로 자바스크립트에서 문자열을 html로 출력시킬 수 있구나 정도로 이해하시면 될 듯 싶네요.

document.getElementById("demo").innerHTML

이부분은 통째로 암기해놓고 계속 여기에다 출력할꺼에요. 자중에 관심있으신 분들은 정독으로 태그 관련 접근과 id 접근, 클래스 접근하는 방법을 따로 공부하셔야 합니다.

<p id="demo"></p>

아무튼, id가 "demo"인 p태그 사이에 "Hellow World"가 출력시키는 문장을 이해하셨으면 넘어 가겠습니다.

2. 자바스크립트 변수


참고 : [아두이노] 아두이노 코딩 변수


[ C언어 ]

int a = 10;
char b = 'a';
int c[6] ={1,2,3,4,5,6};
char d[6] = "hello";

[자바스크립트]

var a = 10;
var b = 'a';
var c = {1,2,3,4,5,6};
var d = "hello";

C언어에서는 자료형을 선언해 줘야 했지만. 자바스크립트는 var로 통일 됩니다. 알아서 값에 대해 잡아주니깐 더 쉽죠. var의 단점은 var로 선언한 변수가 재선언 되어도 에러가 발생하지 않습니다. 그래서 지역범위 변수인 let 형을 사용하기는 하지만 처음에는 간단한 표현 var로 편하게 사용하세요.

let a =10;
const b = 10;

let 의 범위 안에서 a변수는 재선언 불가능하기 때문에 변수 선언에 대한 에러를 줄일 수 있습니다. const 형은 상수형의 의미러 상수변수라고 생각하시면 됩니다.

예제)

<p id="demo"></p>

<script>
    var a ="hello World!";    
    document.getElementById("demo").innerHTML =a;
</script>

[결과]


추가 내용 Objects 변수

var  obj = {Name:"codingman", Age:"10", Address:"한국"};

변수를 위와 같은 객체 형식으로 저장할 수 있습니다. 이걸 배열로 저장하면 배열객체가 되겠죠. 제각각인 개별 요소들을 하나의 하나의 큰 묶음으로 묶어서 변수화 할 수 있는데 이걸 객체변수라고 합니다. 객체명으로 각 요소들을 쉽게 삽입, 삭제, 갱신을 할 수 있기 때문에 효율적인 코딩을 할 수 있습니다.

접근 obj.Name => "codingman"

접근자 콤마(.)로 각 요소를 쉽게 접근 할 수 있죠. 나중에 Steem API를 통해 Steem 블록체인 정보를 가져올 때 Json 형태로 만들어 놓고 접근자를 통해 쉽게 특정 데이터를 접근 할 수 있습니다. 그러니 표현하는 것을 잘 기억해 주세요.

예제)

<p id="demo"></p>

<script>
  var obj = {Name:"codingman", Age:"10", Address:"한국"};
  document.getElementById("demo").innerHTML = obj.Name;
</script>

[결과]


3. 자바스크립트 사칙연산(덧셈)


[C언어]

    int A = 10;
    int B = 2;
    int addAB = 0;
    addAB = A + B;

[자바스크립트]

    var a =10;    
    var b = 2;
    var addAB = a+b;    

기본 차이가 없죠. 확실히 자바스크립트가 변수 선언이 편하죠.

예제)

<p id="demo"></p>
<script>
    var a =10;    
    var b = 20;
    var addAB = a+b;    
    document.getElementById("demo").innerHTML =a+'+'+b+'='+addAB;
</script>

여기서, 문자열을 합치는 기호는 '+' 입니다.

예) "hello" + "World"

var a= "hello";
var b = World";
var c = a+b;
결과 c => "helloWorld" 됩니다.

var c = a+' '+b;
결과 c =>"hello World" 됩니다.

문자열변수들 사이에 따로 문자나 공백을 넣을 수 있습니다. a,b사이에 '+'문자를 넣고 결과 '='문자를 넣어서 출력을
"10+20=30"의 값이 출력되는데 아래 결과 보시면 되겠습니다.

[결과]


4. 자바스크립트 IF문


참고 : [아두이노] 아두이노 코딩 IF문


[C언어]

  int a = 10;
  int b = 5;
  if(a>b) { 
    참문장;
  }
  else {
      거짓문장;
  }
<

[자바스크립트]

  var a = 10;
  var b = 5;
  if(a>b) { 
    참문장;
  }
  else {
      거짓문장;
  }

if문은 동일합니다. 조건식이 참이면 참문장이 수행되고 거짓이면 거짓문장이 수행됩니다. 따로 공부할 필요가 없겠죠.

예제)

 var a = 10;
 var b = 5;
  
 if(a>b) { 
    document.getElementById("demo").innerHTML = "a가 보다 크다";
 }
 else {
    document.getElementById("demo").innerHTML = "a가 b보다 크지 않다.";
 }   

[결과]


5. 자바스크립트 For 문



[C언어]

 int sum=0;
 for(int i=0;i<=10;i++){
    sum=sum+i;
}

[자바스크립트]

var sum=0;
for(var i=0;i<=10;i++){
    sum = sum + i;
}

변수 선언 부분만 var로 변경하고 나머지 동일 합니다. for문의 여러가지 표현이 있는데 초보분들은 이거 하나만 아셔도 됩니다.
예제) 0부터 10까지의 합을 구하시오.

<p id="demo"></p>

<script>  
 var sum=0;
 for(var i=0;i<=10;i++){
     sum = sum + i;
 }
 document.getElementById("demo").innerHTML = sum;
</script>

[결과]


6. 자바스크립트 While 문



[C언어]

while(조건식){
    실행문;    
}

[자바스크립트]

while(조건식){
    실행문;    
}

동일합니다. 조건식이 거짓이 될때까지 계속 실행문이 반복 수행합니다. 따로 공부할 것이 없겠죠.

예제) 1부터 10까지의 합을 구하시오.(불가피하게 For문 예제 활용)

<p id="demo"></p>

<script>  
var input_val = 10;
var sum=0;

while(input_val>0){
    sum=sum+input_val;
    input_val--;
}
document.getElementById("demo").innerHTML = sum;
</script>

while문의 조건식 0보다 큰지를 비교하면서 반복하다가 0이 되면 빠져 나옵니다.
[결과]


7. 자바스크립트 Switch 문



[C언어]

switch(ch) {
    case 1:
        수행문1 ;
        break;
    case 2:
        명령문 2;
        break;                  
    default:
         불일치 명령문;
}

[자바스크립트]

switch(ch) {
    case 1:
        수행문1 ;
        break;
    case 2:
        명령문 2;
        break;                  
    default:
        불일치 명령문;
}

switch 문의 경우도 동일하게 사용합니다. 사실 모든 C언어에서 사용된 문법이 동일하게 적용됩니다. 변수 선언만 차이가 있을 뿐이죠. 그래서 C언어를 공부하시면 다른 언어를 어느정도 독학이 가능합니다. 단지 해당 언어에서 사용하는 일부 함수들을 찾아내는게 혼자서 독할 하실 때 어려운 점이고요. 기본 베이스는 어떤 언어라도 다 동일합니다.

예제)

<p id="demo"></p>

<script>  

  var ch = 'y';  
  switch(ch){
    case 'y': 
         document.getElementById("demo").innerHTML = "Input : Y";
         break;  
    case 'n':  
         document.getElementById("demo").innerHTML = "Input : N";       
         break;  
    default:  
         document.getElementById("demo").innerHTML = "잘못입력함";
  }  
</script>
간단히 id가 "demo"인 위치에 해당 문자열을 출력하는 예제입니다.

[결과]



8. 자바스크립트 사용자 정의 함수



[C언어]

void 함수명(인자){
      명령문;
}

자료형 함수명(인자, 인자){
      명령문;
}

int add(int a, int b){
     return a+b;
}

자료형 char, int, float 등등을 말함. 반환값의 자료형인거 안 까먹으셨죠. void 반환되는 자료형이 없을 때 붙여주는 것이고요.

[자바스크립트]

function addAB(a, b) {
    return a + b;
}

자료형은 안붙지만 앞에 function이라는 함수명을 써주고 인자의 경우는 따로 자료형을 지정할 필요가 없습니다. 그렇게 까지 차이점은 없네요.

예제)

<p id="demo"></p>

<script>
  function addAB(a, b) {
    return a + b;
  }   

  document.getElementById("demo").innerHTML = addAB(10,2);
</script>

덧셈 함수를 사용자 정의 함수로 만들어 넣고 두 수를 더한 값 반환해주는 함수입니다. 그결과는 id가 "demo"인 p 태그로 출력됩니다.

[결과]


마무리


오늘은 C언어를 공부하면 다른 언어를 얼마나 쉽게 독학이 되는지를 자바스크립트의 기초 문법을 통해 살펴보았습니다. 이렇게 C언어를 공부하시고 나면 자바스크립트의 변수 선언부분과 사용자 정의 함수 표현이 바뀐 부분만 체크해주시기만 하면 나머지는 모두 동일하니깐 어렵지 않게 배울 수 있게 됩니다. for문에서 재밌는 for문 표현들이 있는데 그 부분은 거론 하지 않았지만 꼭 찾아보세요.

그리고, 자바스크립트에 사용되는 일부 함수들을 알아야 합니다. 위 소개한 것은 기초 문법이고 실제 사용하기 위해서는 사용되는 함수들을 알아야 제대로 활용 할 수 있습니다.

W3Schools.com => https://www.w3schools.com/js/default.asp

이곳에 가셔서 자바스크립트 튜토리얼을 필독을 해주세요. 충분히 하실 수 있을 꺼에요.

아두이노를 주말에 진행하려다가 간단히 어제 마무리로 쓴 글이 생각나서 자바스크립트로 포스트하게 되었네요.

이상 오늘 포스팅을 마무리 합니다.

댓글()

[아두이노] 아두이노 코딩 사용자 정의 함수

IOT/아두이노기초문법|2019. 4. 15. 09:00

[아두이노] 아두이노 코딩 사용자 정의 함수



오늘은 제어문이 아닌 사용자 정의 함수에 대해서 살펴보도록 하겠습니다. 사용자 정의 함수라는 것은 프로그래머가 직접 만든 함수를 지칭합니다. Serial 라이브러리에서 제공되는 println()함수을 이용하여 우리는 쉽게 시리얼모니터로 직접 메세지를 출력했습니다. 시리얼통신을 위한 프로그램 코딩을 직접 만들 필요 없이 이런 함수들을 호출로 쉽게 코딩했습니다. 만약 프로그래머가 어떤 명령 로직을 짜놓고 그것을 함수로 만들어 놓으면 어떻게 될까요. 만든 함수를 원하는 위치에 호출만으로 해당 명령 로직을 수행 할 수 있게 됩니다. 이 사용자 정의 함수는 아두이노 코딩에서 꼭 필요한 개념이니깐 꼭 알아두세요. 본격적으로 사용자 정의 함수에 대해서 살펴보도록 하겠습니다.

1. 사용자 정의 함수



위 그림은 간단히 사칙연산에서 덧셈을 사용자 정의 함수로 표현한 예제입니다. 글보다는 실제 모습을 보여주고 설명하는게 빠를 것 같아서 간단히 덧셈함수를 만들어 보았네요.

우선, 사용자 정의 함수는 앞에 자료형이 붙습니다. 함수에 자료형이 붙는다는게 약간 이해가 안될 수 있는데 이 자료형은 사용자 정의 함수에서 반환되는 값의 자료형입니다. 함수에서 어떤 계산을 하고 특정한 값을 반환 시킬때 그때 그 값의 자료형으로 생각하시면 됩니다.

다시 설명을 하자면.


위 그림에서 add(10,20)의 사용자 정의 함수가 a, b에 10과 20의 인자가 되고 사용자 정의 함수에 던져주고 사용자정의 함수에서는 이 인자값을 기준으로 10+20의 계산이 이루어지겠죠. 그러면 덧셈함수이니 30이란 값이 계산되어 나옵니다. 이때 30이란 값이 반환 시킬 때 30의 자료형이라고 생각하시면 됩니다. 30이니깐 사용자 정의 함수의 자료형은 int add() 함수가 되겠죠. 어떤 자료형인지 아시겠지요. 그리고 반환시키는 명령어가 return 이라는 명령어가 수행합니다. "return a+b;" 하면 a+b의 값을 반환하시오라고 말로 이해하시면 됩니다.

결론, 위 그림처럼 a+b의 값을 return 반환 명령어로 반환되는 값이 정수형이니깐 함수 앞에다 int형을 붙였이게 된다는 것을 기억해 주세요.



그리고, void라는 표현이 있는데 이건 의미적으로 '빈'으로 비어있는 반환값이 없는 함수라는 생각하시면 될 듯 싶네요. 반환시킬 값이 있으면 반환되는 값의 자료형으로 함수 앞에 붙이시고요. 반환값이 없으면 void란 단어를 붙여서 표현하시면 됩니다.

[ 코딩 ]


[ 결과 ]


프리젠테이션에서 그림 그리기에 재미 붙여서 그림으로 만들었네요. 위 그림에서 보는 것 같이 대충 이런식으로 표현하시면 됩니다. 참고로 함수에 인자가 있을 때는 사용자 정의 함수에서는 인자 값에 맞게 자료형을 각각 선언해야하는 것은 꼭 기억해 주세요.

특이한 점은 아두이노에서는 사용자 정의 함수를 하단에 표현해도 됩니다. C 컴파일러에서는 하단에 표현할 경우 상단에 함수명을 선언해 줘야 합니다. 이게 좀 특이하더군요.

C언어의 경우,

int add(int a, int b){
  return a+b;
}
int main(void)
{
    int c=0;
    c= add(10,20);
    printf("%d\n",c);
    return 0;
}

이렇게 상단에 표현 해줘야 합니다. 아니면 하단에 표현할경우 상단에 해당 사용자 함수명을 선언을 꼭 해줘야 합니다.

int add(int a, int b);
int main(void)
{
    int c=0;
    c= add(10,20);
    printf("%d\n",c);
    return 0;
}
int add(int a, int b){
  return a+b;
}

나중에 코딩한 뒤에 컴파일 때 문제가 생깁니다. main()함수가 먼저 코드에 대해 처리하면 add()라는 함수가 정의되어 있지 않기 때문에 에러가 발생합니다. 그래서 main()앞에 표현을 하던 main()함수 앞에 함수 선언을 해 줘야 합니다. 혹시 C언어 컴파일로 사용자 정의 함수를 사용했는데 에러가 발생하는 이유를 찾지 못하고 해맬 수 있으니깐 이 부분을 주의해 주세요.

아두이노에서는 그냥 상관없이 돌아가더군요. 아두이노 내부에서는 setup(), loop()함수를 처리하는 main() 함수가 따로 하단에 있어서 loop() 아래 표현을 해도 main() 함수 상단에 표현된 것인지 모르겠군요.

3. 아두이노에서 사용자 정의 함수


아두이노에서는 언제 사용하면 좋을까요. 아마 초음파 센서 제어편과 3색 LED 제어편에서 보셨을 꺼에요. 초음파 센서를 이용하여 거리를 측정하는 식을 사용자 정의 함수로 만들어 놓으면 편하게 호출만으로 해당 명령을 수행할 수 있게 됩니다.



void loop() {  
  if(digitalRead(5)==0){
    float v1=UltrasonicDistance(6);
    float v2=UltrasonicDistance(7);
    float total=v1+v2+10;
    Serial.println(total);
    delay(500);
  }  
}

위 로직에서 UltrasonicDistance()함수는 사용자 정의 함수로 거리를 측정하는 함수입니다. 참고예제에 가셔서 보시면 잘 나와 있습니다. loop()함수에서 두번 호출되었는데 만약 그냥 코딩을 했다면 UltrasonicDistance()안에 로직이 좀 길고 두번 중복 코딩을 했겠죠. 단 두줄로 코딩할 것을 꽤 길게 코딩을 하게 된다면 비효율적인 코딩으로 가독성도 떨어지겠죠.

위 코딩에서는 뭔지는 모른데 사용자정의함수에서 계산된 값이 v1과 v2에 저장되고 이 값들고 10을 더한 값을 시리얼모니터로 출력했네하고 쉽게 코드를 해석할 수 있습니다. 뭔가 복잡한 로직을 사용자 정의 함수로 만들어 외부로 빼놓으면 위에서 표현한 것처럼 쉽게 의미 전달 형태의 코딩으로 표현 할 수 있게 됩니다. 이게 바로 사용자 정의 함수의 장점입니다.



void loop(){
    Color(255,0,0);
    delay(1000);
    Color(0,255,0);
    delay(1000);
    Color(0,0,255);
    delay(1000);
}

위 로직에서 Color()함수는 사용자 정의 함수입니다.

void Color(int red, int green, int blue)
{
  analogWrite(rpin, red);
  analogWrite(gpin, green);
  analogWrite(bpin, blue); 
}

코딩은 간단합니다. 세개의 출력핀에 아날로그 값을 출력하는 명령어 입니다. 그런데 외부로 빼서 사용자 정의 함수를 만든 이유가 뭘까요. 바로 중복 코딩을 제거하는 방식입니다. loop()함수는 R->G->B로 순서대로 색이 1초단위로 출력됩니다. 문제는 하나의 색을 만들려면 RGB핀 3개에 아날로그 신호를 보내는 세줄의 명령어를 코딩해야 합니다. 그러면 코딩을 analogWrite()함수를 9번 코딩해야 합니다. 이걸 길게 코딩해 놓으면 시각적으로 보면 가독성이 떨어지고 무슨색이 출력되는지도 쉽게 알 수 없습니다.
하지만 사용자 정의 함수로 표현을 하면,

Color(255,0,0);
Color(R, G, B);

시각적으로 R의 인자만 255니깐 빨간색이구나하고 쉽게 해석할 수 있습니다. 이렇게 중복되는 코딩을 줄일 수 있고 가독성을 높이는 효과를 지닌게 바로 사용자 정의 함수입니다.

사용자 정의 함수를 쓰면 얼마나 좋은지 아시겠지요.

마무리


원래는 C언어 하면 포인트 변수를 배워야 하는데 그건 생략하겠습니다. 지금까지 배운 변수, 배열변수, IF, For, While, Switch, 사용자 정의 함수였네요. 이정도만 이해하시면 아두이노를 사용하는데 아무런 문제가 없습니다.
C언어는 이외에도 더 많은 문법이 있지만 사실 그렇게 까지는 아두이노에 사용되지는 않습니다. 알고 있으면 좋기는 하지만 위 기초정도만 이해하시면 왠만한 표현은 다 하실 수 있습니다.

이정도만 이해하실 수 있으면 다른 프로그램 언어도 충분히 독학으로 배우 실 수 있습니다. 모든 프로그램 언어의 문법은 거의 비슷하거든요. C언어만 잘하면 다른 언어를 배우는데 그렇게 어렵지 않습니다. 단지 처음에 표현하는 부분만 익숙치 않을 뿐이죠.

암튼 기본적으로 사용하는 기초만 이해하시면 무난히 아두이노를 제어 하실 수 있습니다.
포인트랑 클래스까지 더 나가고 싶지만 이부분은 프로그램 언어 영역이라 아두이노에 대한 흥미를 읽을 수 있기 때문에 너무 깊게 들어가는 것은 좀 문제가 있겠죠.

사설이지만 이번에 설명한 개념을 가지고 자바스크립트언어를 살작 독학으로 공부하셔서 Steem API를 사용해 보세요. 그리 어렵지 않을꺼에요. 스티미언 분들이라면 Steem API를 다루면 효율적인 스티미언 활동을 할 수 있습니다. 여기서 제공되는 함수들을 불러다 쓰기만 하면 되니깐요. Steem 블록체인을 읽고 쓸 수 있으면 많은 것들을 할 수 있게 됩니다. 그러니 한번 여기까지 따라오셧으면 w3school 사이트에 가셔서 자바스크립트 문법을 독학하시고 Steem API를 접근해 보세요.

아무튼 기초설명은 이정도로 해서 마무리 합니다.

댓글()

[아두이노] 아두이노 코딩 Switch-case 문

IOT/아두이노기초문법|2019. 4. 14. 09:00

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

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

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

댓글()

[아두이노] 아두이노 코딩 WHILE 문

IOT/아두이노기초문법|2019. 4. 13. 09:00

[아두이노] 아두이노 코딩 WHILE 문



오늘은 제어문 중에 While문에 대해 설명하고자 합니다. While문은 For문과 유사한 반복문을 수행하는 제어문입니다. 대개 For문에서 배운 코딩을 While문으로 표현을 억지로 시키는 경우가 있고 그 반대로 While문을 배운 표현을 억지로 For문으로 코딩해보라고 시키는 경우가 있습니다. 사실 동작원리가 유사하기 때문에 표현은 가능하지만 이렇게 처음 배운분들은 대개 어떤 경우에 For문을 쓰고 While문을 쓰는지 선택하기 어렵습니다. 오히려 두 제어문을 배우면서 초보분들의 머리속에서는 "나보고 어떤 것으로 코딩하라는 거야!"라고 생각이 들게 합니다. 진짜 안좋은 학습인데 둘은 구분지어 따로 사용하는 방법으로 배우셔야 합니다. 두 제어문은 동작원리는 동일합니다. 하지만 사용하는 방향은 차이가 있습니다. 그런데 두 제어문을 배우면서 똑같은 코딩을 하라고 강요를 하게 되면 사실 두 제어문을 어떻게 써야할지 역효과가 발생하기 때문에 억지로 For문의 코딩을 While문으로 표현하는 방식을 강요하지 않겠습니다. 사설은 이만하고 While문에 대해서 알아보도록 하겠습니다.

1. WHILE 문을 FOR 문과 왜 구별해야 하는가?



지난 시간의 For문의 순서도를 왜 다시 While문을 설명하는데 올려놨냐고 의아해 하시는 분들이 많을꺼에요. 이게 While문 순서도 입니다.

[ For 소스 ]

void setup()
{
  Serial.begin(9600);
  
  int A[6] = {10,20,30,40,50,60};
  
  for(int i=0;i<6;i++){
    Serial.println(A[i]);    
  }
}

[While 소스 ]

void setup()
{
  Serial.begin(9600);
  
  
  int A[6] ={10,20,30,40,50,60};
  int i=0;
  while(i<6){  
    Serial.println(A[i]);
    i++;
  }
}

[ 결과 ]


결과는 For문과 동일하게 나왔네요. 소스를 보니깐 "For문과 다르네!"라고 하시겠죠. 초기값, 조건식, 증감연산, 실행문의 명령부분들이 For문에 있던 것들이 그대로 표현되었습니다. 해당 명령들의 코딩 위치만 좀 바뀌었을 뿐이죠.

for(초기값; 조건식; 증감연산){
    실행문;
}
초기값;
while(조건식){
    실행문;
    증감연산;
}


위 그림처럼 구조가 나뉘고 순서도에서 본것처럼 For문이나 While문 유사하게 동작합니다. 그래서 처음 접하시는 분들은 For문과 While문에서 어떤 제어문을 써야할지 잘 구별을 못합니다. 처음 배울때 While문 배울때 억지로 While문으로 표현했던 내용을 For문으로 만들어 오라고 레포트를 내줬던 기억이 나네요. 의도는 For문의 사용능력도 키우기 위한 목적이였지만 처음 배우는 사람은 서로 다른 제어문이 똑같은 동작 코딩을 하라고 요구하면 나중에 뭔가를 표현하려고 할 때 두 제어문에서 선택에 대한 혼동을 하게 됩니다.

초보분들은 완전 분리된 개념으로 차이나게 학습 해야 합니다. 그래야 이럴 때 이 제어문을 사용하고 저럴 때 저 제어문을 사용하게 됩니다. 초보분들에게는 For문이나 While문이나 그게 그거라고 생각되기 때문에 개념을 잡는게 무엇보다 중요합니다.

2. WHILE 문과 For 문의 차이점


For문은 일정한 규칙의 반복문에서 사용하기 좋고 While문은 불규칙적인 반복문에서 사용하기에 좋습니다. 처음에는 구분하여 생각해 주세요. 즉, For문은 시작과 끝이 일정한 간격으로 규칙적으로 접근하거나 반복하거나 할때 For문을 사용하고 While문은 시작은 주어졌지만 끝이 날때까지는 명령을 가변적 반복할 때 사용한다고 생각하시면 됩니다.


위 그림 표현에서 For문은 반복하기전에 시작때 반복횟수가 정해져 있고 일정한 간격으로 해서 순차적으로 반복을 하게 됩니다. 이 느낌을 잘 기억해 주세요.

그리고 While문은 뭐랄까 반복 횟수가 정해져 있지 않고 While문이 실행되면은 그안에서 반복을 하다가 조건이 끝나면 빠져나오는 느낌이라고 생각하시면 됩니다.

예를들면, 번호 자물쇠가 있는데 자물쇠 번호를 모를때 자물쇠를 열려고 계속 시도하는 과정을 While문이라고 생각하시면 됩니다. 번호 자물쇠가 운좋게 한번에 눌러서 열릴 수도 있고 100번을 눌러서 열릴 수도 있잖아요. 이렇게 계속 반복적으로 번호를 누르는 동작을 수행하면서 어떤 조건에 만족하면 빠져나오는 원리라고 생각하면 좋을 듯 싶네요.

뭔가 For문은 순차적으로 정해진 횟수만큼 반복하는 느낌이고 While문은 진입하게 되면 계속 그 안에서 탈출하려고 반복적으로 시도하는 느낌이라고 생각하면 좋을 것 같네요.

다른 예로는 회원 주소록을 만든다고 해봅시다. 주소록을 입력하는 창을 코딩했을 때 사용되는게 While문이고 주소록을 조회할 때 사용되는게 For문의 느낌입니다.

while(상태=="Y"){
 이름 입력;
 나이 입력;
 주소 입력;
 계속 입력하시면 "Y" 종료하실려면 "N";
}

이렇게 회원 등록을 입력하고 나서 또 등록이 필요하면 "Y"을 입력해서 다시 While문을 반복합니다. 하지만 이게 시작값에서 회원 주소록이 꼭 입력횟수가 정해져 있는게 아니라 주소록 입력을 한명하고 나서 바로 나올 수 있고 2명이상이면 그 이상 입력하고 빠져 나오기 때문에 반복횟수가 정해져 있지 않는 상황에서는 For문 보다는 While문이겠지요.

주소록 조회 같은 경우는

for(int i=0;i<회원수;i++){
    회원[i]정보;
}

회원 주소록 조회할때는 이미 입력이 끝났고 고정된 회원수에서 회원정보를 조회하게 됩니다. 입력된 회원수만큼 검색을 해야 하잖아요 고정된 회원수 만큼 반복명령을 수행하게 됩니다. 그럴때 For문을 사용하게 되는 것이죠.

For문은 반복의 횟수가 정해져 있고 While문은 반복의 횟수가 정해져 있지 않는 제어문에 사용하기 좋다고 생각하시면 됩니다. 둘 다 반복문이지만 약간 다른 느낌으로 개념을 처음에 잡아 주세요.

그냥 이렇게 생각하세요. For문은 일정한 반복문을 수행하는데 고정된 정해진 횟수만 만큼 반복되는 제어문에 어울리고, While문은 고정되어 있지 않은 끝이 만족할 때까지 반복 횟수는 달라지는 제어문에 어울린다라고 생각하시면 되겠습니다.

엄밀이 따지면 For문도 반복 횟수를 고정 시킬 수 있고 반복 횟수를 가변적으로 코딩 할 수 있습니다. 그리고 While()문도 반복 횟수를 고정 시킬 수 있고 반복 횟수를 가변적으로 코딩 할 수 있습니다. 처음 공부하시는 분들은 둘을 동일하게 생각하고 배우게 되면은 코딩을 할 때 어떤것을 써야할 지 어려워 합니다.

처음은 이정도로 해서 차이나게 구분 지어 주세요. 참고로 For문을 이용해서 While문처럼 가변적인 횟수로 반복할 수 도 있고 While문에서 For문처럼 고정적인 횟수로 반복할 수 있는데 그렇게 코딩하면 코딩의 가독성이 떨어집니다.

그 상황은.

for(int i=0;i<10;i++)

이 문장 한줄 For문 안에 반복명령이 0~9까지 10번 반복수행한다는 것을 쉽게 확인 할 수 있습니다. 한줄로 for문의 반복횟수를 쉽게 이해할 수 있죠. 하지만 아래의 같은 경우를 살펴봅시다.

int i=0
while(i<10){ 
반복명령문; 
i++;
}

이 경우는 i++ 증감연산이 while문 안에 있기 때문에 코딩이 짧으면 쉽게 찾을 수 있지만 코딩이 복잡하고 길면 사실 while()문이 10번 반복되는지 확인이 쉽지 않습니다. 코딩 안에서 i=i+2로 2씩 증가한다면 반복 횟수는 절반으로 줄어 들겠죠. 코딩의 가독성이 현저하게 떨어집니다. 그래서 For문으로 표현하고 While문으로 표현하지 않습니다.

반대의 경우은,

while(입력값>0){
    반복명령문; 
    입력값변화;
}

이렇게 입력값변화에 따라서 while문은 반복합니다. 이 한줄로 "아! 입력값이 도달할때까지 계속 반복수행하구나!"로 가독성이 높습니다. 하지만 아래와 같은 경우를 살펴봅시다.

for(입력값;입력값>0; ){
 반복명령문;
 입력값변화;
 }

이렇게 표현을 할 수 있지만 실제 코딩을 하고나면 부자연스러워 집니다. 증감연산부분을 생략해서 빠진 느낌과 For문이 가지고 있는 고정적이고 순차적인 이미지에서 벗어나게 되고 억지로 실을 꿰맨 느낌을 갖는 코딩이 됩니다. 이 느낌은 아직 For문과 While문의 개념이 서지 않는 상태에서는 잘 모를 수 있습니다. 이부분은 나중에 코딩을 많이 연습해 보시면 그 의미를 이해가 됩니다.

3. WHILE 문



While문은 두가지 표현 형식이 있습니다.

while(입력값>0){
  명령문;
    입력값의 변화;
}

위 식은 표에서 설명 했듯이 while문의 명령문을 수행하기 전에 조건식에 만족하는지 먼저 체크합니다. 입력값이 '0'보다 큰가를 체크하고 '0'보다 크면 조건식이 참이 되고 명령문을 수행합니다. 이때 수행된 명령문에 의해 입력값은 변하게 되고 그 변화된 입력값이 다시 '0'보다 크면 방금 수행된 명령문을 다시 반복 수행하게 됩니다. 이렇게 입력값이 '0'보다 클 때 까지 계속 반복하는 제어문이라고 생각하시면 됩니다.

do{
  명령문;
    입력값의 변화;
}while(입력값>0);

위 식은 표에서 설명 했듯이 while문의 명령문을 먼저 한번은 꼭 수행한 뒤에 수행 후의 결과값을 기준으로 while()문을 계속 반복할지를 결정하는 방식입니다.

두개의 차이점을 예를 들면은,

while("배고파"){
    밥먹어;    
}

이렇게 처음에 "배고픈지"체크 한뒤에 배고프면은 밥을 계속 먹게하다가 어느정도 포만도에 도달하면 배가 안고파지면 While문을 빠져 나온다고 생각하시면 됩니다. 먼저 배고픈지 체크를 한 뒤에 밥을 먹는 방식이고요.

do{
 센서값 측정해;
 계산해;
}while("원하는 값 아냐!")

이렇게 표현하면은 아두이노가 센서의 값을 측정하고 나온 값이 원하는 값인지를 계산한 뒤에 원하는 값이 아니라면 다시 측정을 하고 원하는 값이 나올때까지 계속 반복하는 방식이라고 생각하시면 됩니다. 이렇게 먼저 명령을 수행한 뒤에 그결과를 토대로 다시 명령을 수행할지를 결정하는 방식입니다.

두가지 비유가 좀 이상했지만 순간 떠오른 것을 글로 쓰다 보니깐 적절한 비유가 생각이 안나네요.

혹시 이해가 안되면 다시 순서도로 보시기 바랍니다.


위 순서도에서 While문에서 조건식이 참일때 명령문을 수행하고 다시 조건식으로 돌아와서 체크합니다. 그리고 계속 True일때는 계속 반복하다가 조건식이 거짓(False)가 되면 빠져 나옵니다.


위 순서도에서 먼저 do의 중괄호 안에 명령문을 먼저 수행한 뒤에서 조건식을 체크합니다. 그리고 참이면 다시 do안에 문장을 반복 수행합니다. 조건식이 거짓(False)가 될때 비로소 빠져 나오게 됩니다.

위에서 말로 만든것처럼 이 순서도에 일상의 말로 대입해서 한번 표현해 보세요.

While 예제

이게 실험 할 예제를 마땅치 않아서 시리얼통신 예제로 loop()함수를 대신 while()함수로 표현 해보았습니다.



[ 원소스 ]

void setup() {
  Serial.begin(9600);    //시리얼 통신 9600 통신속도로 시작
}
void loop() {
  
  if (Serial.available() > 0) { //데이터가 수신되었는지 확인
    char ch = Serial.read(); //1byte 읽음
    Serial.println(ch); //1byte 읽은거 출력
  }
}

ch변수에 시리얼 통신을 통해서 들어온 1byte 데이터를 저장합니다. 그리고 저장된 값은 시리얼모니터로 다시 출력하는 프로그램입니다. 주석을 달았지만 이해가 안가셔도 괜찮습니다. 여기서 외부로 부터 시리얼통신으로 데이터를 읽고 그 데이터를 시리얼모니터로 출력하는 로직이라고만 알고 계시면 됩니다. loop()함수 안에서 이 동작을 계속 반복하잖아요. 그것을 While문으로 표현을 하면 아래와 같습니다.

[ While 소스 ]

void setup()
{
  Serial.begin(9600);  
  
  while(1){
    if(Serial.available() > 0) { //데이터가 수신되는지 확인
      char ch = Serial.read(); //1byte 읽음
      Serial.println(ch); //1byte 읽은거 출력
    }
  }  
} 

원소스에서 loop()함수는 전류가 공급되면 계속 무한 반복하는 함수라고 했죠. 그 역할을 while(1)으로 표현을 해서 setup()함수에 넣어 While문을 loop()함수와 동일하게 무한 반복을 시켜버려린 코딩입니다. 원소스나 While문 소스는 동일한 동작을 수행하는 명령입니다. while(1)은 조건식이 0이 아니면 참이라고 했죠. 1이니깐 무조건 While 문은 참이되고 영원히 참이되는 문한 방복함수가 됩니다. 그래서 시리얼통신으로 계속 데이터를 읽고 그 값을 시리얼모니터로 출력이 이루어 집니다. 원소스 loop()함수와 같은 함수가 되어버린 것이죠.

[ 결과 ]


결과는 위 그림처럼 나오게 됩니다. 시리얼 통신으로 'a'를 입력 하면 그 값이 시리얼모니터로 'a'가 출력됩니다. 아두이노 예제를 들어 표현을 하다 보니깐 시리얼통신 예제를 사용했네요. 시리얼통신 명령문을 설명하자면 또, 길어지니깐 참고 자료에 링크가 걸린 시리얼 통신 포스트를 보시기 바랍니다.

다른 예제로는,

 while (!Serial.available());  

이런 문장이 있으면 어떤 의미일까요. 데이터 수신되었는지 확인하는데 문장입니다. Serial.available()함수는 시리얼통신으로 데이터가 수신되지 않으면 반환값은 '0'이 됩니다. 수신되면 '0'이 아닌 값이 되겠죠. 그러면 저렇게 문장을 표현하면 데이터가 입력이 될 때 까지 무한 대기하게 됩니다. 한마디로, "난! 데이터가 입력될 때 까지 기다리고 있을꺼야!"라고 생각하시면 됩니다. 데이터가 입력이 되면 While()문을 빠져나와서 다음 명령문을 수행 하겠죠.

void setup()
{
  Serial.begin(9600);   
 
}  
void loop()
{
   while (!Serial.available());  
   char ch = Serial.read(); //1byte 읽음
   Serial.println(ch); //1byte 읽은거 출력
 
}

표현은 이렇게 됩니다.

시리얼통신 명령문으로 예제를 들었는데 좀 어렵게 되어 버렸네요.

loop()함수를 대신 while(1)로 표현을 했고 그다음 어떤 상태가 만족할 때까지 무조건 대기하는 "while(조건식);"을 다뤄 보았습니다. 아두이노 상에서 While문을 설명하려고 하니 적절한 예제가 시리얼통신 뿐이 생각 안나네요. 시리얼통신을 이해해야 하는데 오히려 더 복잡하게 되었네요.

그냥, 1부터 입력된 수 까지의 합을 구하시오. 예제로 하겠습니다. For문의 느낌이 강해서 이런 예제를 안들려고 했는데 While문의 동작을 이해하는 차원으로 소개 합니다.

int input_val = 10;
int total=0;

while(input_val>0){
    total=total+input_val;
    input_val--;
}

코딩에서는 input_val로 변수를 선언하고 임이의 숫자 '10'을 저장 시켰습니다. 이것을 입력값이라고 정하고 나서 조건식이 '0'보다 클때 참이니깐 입력값이 '0'이될때 까지 while문은 반복하게 됩니다.
그리고 'input_val--'로 한번씩 반복명령문을 수행할 때마다 input_val값은 1씩 감소하게 됩니다. 이 의미는 10이 입력되면 10에서 부터 1씩 감소해서 0이 될때 While문을 빠져나오게 된다는 의미가 됩니다.

입력된 수 까지의 합은,

total = total+input_val
input_val이 10일때  => total = 0 + 10;
input_val이 9일때  => total = 10 + 9;
input_val이 8일때  => total = 19 + 8;
...
input_val이 1일때 => total = 54 + 1;

이렇게 입력된 수까지의 합이 구해지게 됩니다. 마지막 "total = 55"가 되겠죠. While문이 어떤 느낌으로 돌아가는지 이해가 되셨는지 모르겠네요.

위 시리얼통신 예제는 이해가 안되면 이 예제로 이해해 주세요. for문 성향이 유사해서 예제 코딩을 좀 고민 했네요.

마무리


While문의 의미를 보다 쉽게 전달해야 했는데 For문과 차별화를 너무 고집한 나머지 예제를 어려운 걸 보여 드린 것 같고 좀 어렵게 설명이 되었네요.

For문과 While문은 반복 제어문으로 유사하지만 For문은 회수가 정해진 고정된 일련의 규칙적인 반복 제어문에 어울리고 While문은 고정되지 않는 반복 제어문의 표현에 어울리는 제어문이라고 생각해 주세요.

While문과 For문의 소스들을 많이 접해 보고 따라 해보면 그 차이를 구분하여 사용하실 수 있을꺼에요.

댓글()

[아두이노] 아두이노 코딩 배열과 FOR문

IOT/아두이노기초문법|2019. 4. 12. 09:00

[아두이노] 아두이노 코딩 배열과 FOR문



오늘은 제어문 중에 FOR문에 대해 설명하고자 합니다. FOR문을 들어가기 전에 배열에 대해서 살펴보고 FOR문을 다룰 예정입니다. 배열를 먼저 다루는 이유는 FOR문 한쌍을 이루고 있으면 같이 배우면 이해하기 쉽기 때문입니다. 배열와 FOR문은 한쌍을 이룬다고 생각하시면 됩니다. 1차배열은 FOR문 한개, 2차배열은 FOR문 2개, 3차배열은 FOR문 3개로 표현이 되는데 이게 무슨 소리인지 아직 모를 수 있으나 대충 배열과 FOR문의 갯수는 같구나 정도만 생각하시고 이제 본격적으로 포스팅 하겠습니다.

1. 배열변수


지난 시간에 변수 선언은 어떻게 했나요.

int a = 10;

a라는 변수를 int형으로 선언했고 a변수에 10을 저장했습니다. 대충 이렇게 변수를 선언 했습니다. 이것을 단일변수라고 부릅니다.

그러면, 배열변수는 a라는 변수명을 갖는 것 까지는 단일변수와 같은데 차이점은 여러개의 저장공간을 하나의 변수명으로 갖을때 이 변수를 배열변수라고 부릅니다. 즉, a변수에 여러개의 값을 저장할 수 있다는 것이죠.

[ 표현식 ]


A[6]는 A라는 변수명을 가지고 6개의 저장공간을 가지고 있다는 의미가 됩니다. A[6] 배열변수에는 순서대로 "10, 20, 30, 40, 50, 60"이라는 값들이 저장하게 됩니다. 선언하면서 값이 저장될 경우 숫자인 경우는 중괄호({ })를 사용하여 위와 같이 표현 합니다. 참고로 C언에서는 첫번째 위치가 0부터 시작합니다. 그리고 A[6]으로 표현했다고 해서 0부터 시작하니깐 7개의 저장공간이 있겠구나 생각하실 수 있는데 공간은 있는게 맞지만 마지막 7번째 저장소는 사용되지 않습니다. 배열을 선언하시면 A[7]하면 7개의 저장소를 갖는데 "0~6"의 위치(index)에 값을 저장한다고만 머리속에 담아 두시면 됩니다.

여기서, 배열변수의 각 저장소 접근은 다음과 같은 방법으로 접근하게 됩니다. 배열변수에 위치(index) 값으로 배열의 위치를 지정하고 그 위치에 저장된 값을 가리키게 됩니다.

** A[index] => ?**

실제로 접근해보면,

A[0] => 10
A[1] => 20
A[2] => 30
A[3] => 40
A[4] => 50
A[5] => 60

어떻게 배열변수가 선언되고 접근되는지 아시겠지요. 시리얼모니터로 출력을 한번 해볼까요.

[ 소스 ]

void setup()
{
  Serial.begin(9600);
  
  int A[6] = {10,20,30,40,50,60};
  Serial.println(A[0]);
  Serial.println(A[1]);
  Serial.println(A[2]);
  Serial.println(A[3]);
  Serial.println(A[4]);
  Serial.println(A[5]);
}

[ 결과 ]


배열변수를 선언하고 그안에 값을 넣고 다시 그 배열변수에 저장된 값을 출력을 하였습니다. 여기까지 배열변수의 선언과 출력을 어떻게 하는지 이해 하셨죠.

그런데 자세히 살펴보세요. Serial.println()함수가 6번 반복됩니다. 만약에 배열변수에 100개 아니 1000개의 데이터가 있다면 1000개의 println()문을 코딩해야 겠죠. 정말 비효율적인 코딩이겠죠. 이 문제를 해결하기 위한 제어문이 있습니다. 배열변수가 표현되면 한쌍을 이룬다는 제어문이 있는데 그게 바로 FOR문입니다.

이제 FOR문에 대해서 본격적으로 다뤄보겠습니다.

2. FOR 문



위와 같은 형식으로 표현이 되는데 시작값은 i=0부터 조건식(i<6)이 참이 될때까지 반복 수행 한다고 생각하시면 됩니다. 좀 햇갈릴 수 있는데 다음 표현으로 이해해 주세요.


번호 순서대로 진행되는데 1번 i=0에서 시작해서 2번 조건식(i<6)이 참이면 아래 수행문 3번을 수행합니다. 그리고 나서 4번 i++ 증감연산으로 i=i+1의 표현인데 1씩 증가한다고 생각하시면 됩니다. i가 1이 증가된 값에서 다시 2번 조건식으로 참인지 거짓인지 비교하게 됩니다. 이렇게 "i<6"이 거짓이 될때까지 수행문은 반복한다고 생각하시면 됩니다.

잘 이해가 안 갈 수 있으니 예제로 들어 설명할께요. 위 소스에서 Serial.println()문이 6번 반복된다고 했잖아요. for문으로 표현을 하면 다음과 같습니다.

[ 소스 ]

void setup()
{
  Serial.begin(9600);
  
  int A[6] = {10,20,30,40,50,60};
  
  for(int i=0;i<6;i++){
    Serial.println(A[i]);    
  }
}

i는 0부터 조건식(i<6)이 참이 될 때 까지 Serial.println()함수를 반복 수행하는 코딩입니다. 여기서 A[i]라는 표현을 잘 기억해 주세요. for문은 i가 0부터 1,2,3,4,5까지 반복 수행 합니다. 그럴 때 A[i]로 표현하면은 i의 값은 0부터 1,2,3,4,5가 되겠죠.

A[i] => A[0], A[1], A[2], A[3], A[4], A[5]

A[i]은 위에서 표현한 것처럼 순서대로 가리키게 됩니다. 이 표현이 가장 중요합니다. for문을 돌리는 핵심이고요.

배열 변수 A[10]이면,

for(int i=0;i<10;i++){
    A[i]
}

이렇게 기계적으로 나와야 합니다.

2차배열변수 A[5][5]이면

for(int j=0;j<5;j++){
    for(int i=0;i<5;i++){
        A[j][i]
    }
}

이렇게 기계적으로 나와야 합니다. 배열변수이면 for문은 저렇게 기본적으로 표현한다고 생각하시면 됩니다.

위 소스에서

  for(int i=0;i<6;i++){
    Serial.println(A[i]);    
  }

이 표현을 아시겠지요. 혹시 모르시겠다면 다음 순서도를 보시기 바랍니다.


시작 하면 i=0으로 초기값이 정해지고 조건식 i<6보다 작으면 참(True)일때 아래 Serial.println()문이 수행되고 i++로 i가 1이 증가합니다. 파란색 화살표 방향으로 참일때 계속 반복 수행 됩니다. 그러다가 i가 6일 때 거짓(False)이 되면 for문을 빠져나와 종료가 됩니다.

순서도의 진행 과정을 머리속에서 그려 보세요. For문의 진행과정이니깐 꼭 숙지해 주세요.

[ 결과 ]


이제 for문이 어떻게 돌아가는지 이해가 되셨겠죠.

3. FOR문을 언제 사용할까요.


기본적으로 배열변수가 있을 때 배열변수의 위치(index)를 순서대로 접근을 할 때 사용합니다. 그리고 순서가 있는 중복되는 코딩이 있을때 for문을 사용하여 중복된 코드 부분을 줄이고자 사용합니다.

예를 들어 아두이노에서 단일변수에 저장된 값을 bit단위로 추출하고자 할때를 생각해 봅시다. p라는 단일 변수에 저장된 8bit로 구성된 1byte 값을 bitRead(입력값, 추출위치)로 1bit씩 추출이 가능한 함수입니다. 이 함수를 이용해서 총 8bit로 이루어진 1byte 데이터를 1bit씩 추출하기 위해서는 bitRead()함수가 8번 중복이 되겠죠. 이 중복된 명령을 for문으로 표현하면 다음과 같이 간단히 표현 됩니다.

const byte p=0B01110000;
for(int i=0;i<8;i++){
     bitRead(p, i);
}

[ 결과 ]


추출한 결과를 println()함수로 순서대로 출력되었네요.

간단히 정리하자면 for문은 일정한 순서가 있고 반복되는 코딩이 있을 때 사용하는 제어문이라고 생각하시면 됩니다. 명령이 일정한 순서가 있다면 "아! for문으로 표현해야지!"라고 생각을 하시면 됩니다. "배열변수가 있네! for문을 써야지!" 이렇게 바로 생각을 떠올리셔야 합니다.

4. 추가 공부


1) 문자열변수


문자배열변수는 char형으로 선언되고 "abcde"라고 단어를 그냥 표현하시면 됩니다. 참고로 5글자라고 해서 A[5]로 하시면 안됩니다. 문자의 경우는 마지막 끝나는 기호 '\0'이 저장되어야 합니다.

문자열 => 단어+'\0'

이 표현을 주의하셔야 합니다. 문장의 끝을 나타내는 기호를 저장하는 공간이 필요하니깐 문자배열변수를 선언할때 문자의 갯수와 마지막 문자의 끝 '\0' 기호를 포함된다는 것을 기억 해주세요. 그리고 각 알파벳을 접근하는 방식은 배열의 위치(index)로 접근하시면 해당 알파벳을 접근 할 수 있습니다.



위 그림에서 처럼 A[i]의 위치의 알파벳을 순서대로 출력했네요. 저장하는 것과 접근하는 것과 출력하는 것의 느낌을 잘 기억해 주세요.

2) 2차원배열


위 그림은 2차원 배열입니다. 표에 있는 것은 위치(index)라고 생각하시면 됩니다. 3차배열은 3x3x3인데 위 그림의 2차배열을 x,y 평면으로 생각한다면 3차는 여기서 z축으로 깊이 만큼 x,y 평면인 2차 배열이 3개 있는 거라고 생각하시면 됩니다. 2차 배열은 예를 들면은 이미지같은 평면적 데이터를 제어할 때 사용하고요. 3차 배열은 3차원 형태의 3D 데이터를 제어할 때 사용한다고 생각하시면 됩니다.

3차배열은 이런 느낌입니다.


2차 배열을 For 문으로 접근한다면

for(int j=0;j<3;j++){
    for(int i=0;i<3;i++){
        A[j][i]
    }
}

이렇게 접근을 하겠죠.

For문을 편하게 사용하실려면 다양한 예제들을 구글 검색을 통해 찾으시고 직접 코딩을 해보셔야 합니다. 왜냐면 문법을 알아도 정확히 어떤 느낌의 제어문인지 그 의미를 잘 모르시는 분들이 많아요. 그러다보니 For를 활용을 잘 못하더군요. For문은 계속 다양한 예제를 검색하셔서 직접 코딩하고 그 코딩의 의미 해석을 여러번 하셔야 For문을 자유자재로 쓰실 수 있을거에요.

3) 증감연산자

[ 증감연산자 ]
i++ => i=i+1 => i가 1씩 증가
i-- => i=i-1 => i가 1씩 감소

대충 '++'과 '--'의 의미를 아시겠지요. 그런데 이게 좀 햇갈려 하시는 분들이 많아요. 혼동하는데 과거 전산직 공무원 시험문제로 자주 출제되는 문제인데 지금은 바뀌어서 나온지는 모르겠네요. 아무튼 혼동하시는 분들이 은근 많습니다.

증감연산자는 원래는 다음과 같은 4가지로 표현됩니다.
++i => i를 먼저 1증가 시키고 나서 대입
i++ => i를 먼저 대입하고 나서 1증가
--i => i를 먼저 1감소 시키고 나서 대입
i-- => i를 먼저 대입하고 나서 1감소

int a =10;
int i = 2;
s1 = a + (++i);
int a =10;
int i = 2;
s2= a + (i++);

이 둘의 s1과 s2 값은 다릅니다.

그리고,

int a =10;
int i = 2;
s1 = a + (++i);
s2 = a + (i++);

이렇게 연달아 있으면 s1과 s2에 저장된 값은 같습니다. 그 차이점을 아시면 증감연산자를 혼동하지 않습니다. 위의 증감연산자 4가지 표현 부분의 해답이 있습니다.

s1 = a + (++i);

a+i가 i=2일때 i를 먼저 1을 증가시킨후 a에 더해집니다. 그래서 i은 3이 되고 s1은 13이 됩니다.
그다음 문장에서는

s2 = a + (i++);

a+i가 i=3이 된 상태에서 먼저 a에 더한 후에 i가 1이 증가되기 때문에 a+i은 s2에 13이 저장됩니다.

혹시 햇갈릴 수 있으니간 위 코딩을 setup()함수 안에다가 넣고 println()문으로 그 값을 출력를 해보세요.

마무리


For문에 대해서 살펴보았습니다. For문은 일정한 규칙으로 반복수행 할 때 배열변수가 있을 때 중복되는 코드들이 있을 때 그 부분을 간소화 된 코딩으로 표현을 할 때 사용합니다. 꼭 숙지해 주세요.

For문이 처음에는 잘 이해가 안될 수 있는데 계속 For문 예제를 찾아서 몇번 코딩하게 되면 이해가 되실 거라 생각합니다. 대개 C언어 For문에 대해 배울때 숙제로 많이 내주는게 구구단 프로그램 입니다. 한번 C언어로 된 구구단 프로그램을 찾아보시거나 상상력을 동원해서 표현을 직접 코딩을 해보세요. 2차 배열의 대표적인 예제이니깐요.

제 포스트 중에 종종 For문을 써왔는데 한번 잘 살펴보세요. 여러게 아두이노 핀을 제어할 때 주로 For문을 사용했고요. 패턴을 만들때 배열변수에 저장하고 그것을 출력 할 때 For문을 사용하였습니다. for문을 얼마나 자유자재로 잘 사용하느냐에 따라서 아두이노의 코딩량을 대폭 줄일 수 있으니깐 꼭 For의 의미를 이해해 주세요.

계속 머리속에서 "중복되는데 순서를 가지고 있다 For문을 써야지", "배열변수네 For문 써야지" 생각하시고 어떻게 접근하는지만 숙지하시면 For문을 사용하는데 어려움이 없을꺼에요.

마지막으로, For문으로 1부터 100까지 더한 합을 구해 보세요. '*'기호로 삼각형, 마름모 등 다양한 도형으로 출력시켜 보세요.

댓글()

[아두이노] 아두이노 코딩 IF문

IOT/아두이노기초문법|2019. 4. 11. 09:00

[아두이노] 아두이노 코딩 IF문



오늘은 제어문 중에 IF문에 대해 설명하고자 합니다. IF문은 어떻 구조이고 어떤 느낌인지 그리고 코딩할때는 어떤 느낌일 때 IF문을 사용하는지에 대해서 알아봅시다.

1. 비교연산자



위 표에 나와 있는 비교연산자의 의미를 잘 기억해 두세요. 다음에 다룰 IF문에서 조건문으로 사용하는 표현입니다.

2. IF문



IF문은 기본적으로 3개의 형식으로 구분하여 살펴 볼 수 있습니다. 위 표가 약간 가독성이 떨어지게 표현 되었는데 자세히 한번 읽어보세요. IF문은 조건식이 참이냐 거짓이냐 두가지 상태로 나눌 때 사용합니다.

예)


조건식이 밥을 먹었는지 체크했는데 참이면 "응! 먹었어"라고 답변할 것이고 거짓이면 "아니! 안먹었어!"라고 답변하게 됩니다. 이렇게 IF문은 조건식으로 참 or 거짓으로 나눌때 사용합니다. 대충 어떤 느낌인지 아시겠지요.

이제 if문 표현들을 살펴보도록 하겠습니다.

1) IF문

if(조건식) { 참 명령; }

if(조건식)은 조건식이 참이냐 거짓이냐 구분 할 때 사용합니다.

  if(a>b) { 
    Serial.println("a>b");
  }

이 문장을 잘 살펴보세요. if문의 "a>b"의 조건식이 참이되면 if문의 영역인 중괄호({...}) 안의 문장을 수행합니다. if문만 딸랑 있고 중괄호로 되어 있으면 거짓이면 if문 안에 문장을 수행하지 않고 지나가고 참이면 if문 안의 있는 문장을 수행한다고 생각하시면 됩니다.

즉, a>b가 참이면 시리얼모니터에 "a>b"라는 문장이 출력되고 만약 a>b가 거짓이라면 a가 b보다 크지 않다는 의미로 시리얼모니터로 아무런 문장도 출력하지 않습니다. 오로지 참일때만 시리얼모니터로 "a>b"가 출력됩니다.
[ 블록 ]


블록 코드를 보시면 IF문이 "a>b"가 참일때 안에 파란블록 println()문이 수행되고 거짓일때는 그냥 지나 갑니다. 블록으로 코딩하면 이 블록은 loop()함수으로 코딩되어 무한반복하니깐 의미만 이해하시고 text창에서 아래와 같이 코딩하세요.

[ 소스 ]

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

  int a = 10;
  int b = 5;
  if(a>b) { 
    Serial.println("a>b");
  }
}

[ 결과 ]


여기서, 거짓일 때 b가 더 크다는 표현을 출력하고 싶지 않으세요. 그런 표현이 다음 두번째 형식입니다.

2) IF~else 문

  if(a>b) { 
        Serial.println("a>b");
  }
  else {
        Serial.println("b>a");
  }

위 식에서는 else문이 추가 됩니다. if문이 조건식이 참이면 "a>b"문장이 출력되지만 조건식이 거짓이면 else이하 문장을 수행합니다. 이말은 if문이 참일때 if문을 수행하고 거짓일때는 else 문을 수행한다고 구분 지으면 됩니다.

if(조건식) { 참 }
else { 거짓 }

이 부분을 머리속에 넣어주세요.

[ 블록 ]


파란블록을 잘 보세요. "a>b"참일때 "a>b"가 출력되고 거짓일때 "b>a"가 출력됩니다. 블록으로 대충 어떤 느낌인지만 잘 구분해 주세요.

[ 소스 ]

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

  int a = 5;
  int b = 10;
  if(a>b){
        Serial.println("a>b");
  }
  else {
        Serial.println("b>a");   
  }
}

[ 결과 ]


결과창에 소스를 보시면 약간 차이가 있는 것을 보실꺼에요 중괄호"{"와 "}"가 사라졌습니다. if문에서는 만약 수행할 명령문이 한줄일 경우는 중괄호를 생략 가능합니다. 위 소스에서는 중괄호를 넣고 결과에서는 중괄호를 생략한 이유는 우선 중괄호를 넣고 if문의 영역을 구분하고 그 영역을 참일때와 거짓일때 수행된다는 개념을 잡기 위해서 중괄호를 넣었어요. 처음 배우시는 분들은 한줄이라도 중괄호를 넣어주세요. 익숙해지면 한줄짜리를 생략하시고요. if문에 대한 의미를 이해하시는게 중요하니간 중괄호를 넣는 습관을 가져주세요.

[ 참고 사항 ]
위 코딩에는 약간 문장 상 문제가 있습니다. 뭘까요. "a>b" 크지 않다고 해서 b가 크다고 말할 수 없습니다. 그것은 "a==b"가 같을 수 있는 조건이 나오기 때문입니다.

즉,

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

  int a = 5;
  int b = 10;
  if(a>b){
        Serial.println("a>b");
  }
  else if(a==b){
        Serial.println("b==a");   
  }
  else {
        Serial.println("b>a");   
  }
}

위와 같이 코딩을 해야 합니다. 한번 위와같이 코딩하시고 a, b 변수의 값을 동일한 값으로 넣어보세요. 그리고 시뮬레이터에서 실행시켜서 시리얼모니터에 어떤 문장이 수행되는지 살펴보세요.

비교 대상이 여러개 일때는 IF ~ else IF 문을 통해서 비교가 이루어집니다. 첫번째 조건식이 거짓이면 두번째 조건식을 비교해서 참 or 거짓을 결정하는데 만약에 두번째 조건식에도 거짓이면 else 문이 수행되는 표현입니다.

다음에 이 제어문에 대해서 살벼도록 하겠습니다.

3) IF ~ else IF 문

마지막 세번째 형식은 IF문이 하나 더 추가하는 방식입니다. IF문이 참과 거짓 두가지 상태뿐이 없습니다. 그런데 비교 대상이 둘 이상일때가 생기게 됩니다. 예를들어 시험을 보고 영어 점수의 학점을 주려고 할때 "A,B,C,D,E,F" 학점을 줄때 IF문으로 하면 어떻게 될까요.

영어  = 75점;
if(영어>=90){ A학점}
else{
  if(영어>=80){ B학점}
  else {
      if(영어>=70){C학점}
        else{
          if(영어>=60){D학점}
            else {
              F학점
            }
        }
    }
}

이렇게 표현해야 됩니다. else 이하 문으로 계속 if문이 추가되지요 이렇게 복잡하게 표현하지 않고 다음과 같이 간단히 표현됩니다. 비슷한 의미인데 가독성으로 이렇게 표현 하지요.

영어  = 75점;
if(영어>=90){ A학점}
else if(영어>=80){ B학점}
else if(영어>=70){C학점}
else if(영어>=60){D학점}
else {F학점}          

만약 영어가 90이상이면 A학점
거짓이면 영어가 80점이상이면 B학점
거짓이면 영어가 70이상이면 C학점
거짓이면 영어가 60이상이면 D학점
거짓이면 F학점

어떤 입력값에 대한 여러개의 비교가 필요할 때 이렇게 IF문을 활용하게 됩니다. 이런 표현을 잘 숙지해 주세요. 여기서 다중 IF문의 의미를 잘 이해하시면 다양한 곳에서 활용이 가능합니다. 다중 IF문에서 조건식이 참과 거짓의 의미를 약간 혼동하시는 분들이 많습니다.

위 표현은
90이상
89~80
79~70
69~60
60미만

이걸 의미하는데 잘 매칭이 안되는 분들이 많은 것 같아요. 실제 영어 점수를 다르게 입력해서 어디에서 멈춰 결과가 출력되는지 체크를 여러번 하셔야 표현의 의미를 알 수 있습니다.

[ 블록 ]


[ 소스 ]

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");
}

[ 결과 ]


75니깐 C학점으로 출력되었네요. 75점이니 C+이 되어야 겠지만 암튼 대충 다중 IF문까지 코딩 해 봤습니다. 이 세가지 표현 방식을 가상시뮬레이터에서 그대로 코딩해보세요. 위 예제대로 하셔도 되고 다른 것을 생각하셔서 IF문을 적용하셔도 됩니다.

IF문 어디서 사용할까요?


코딩을 하면 IF문을 사용안하는 곳이 없습니다. 대부분 IF문을 사용합니다. 아두이노에서는 체크문으로 많이 사용합니다. 센서에서 입력된 값이 정상적으로 들어왔는지 확인할때 사용합니다. 또는 센서의 값을 읽어왔는데 그 값에 따라서 특정한 동작을 수행할 때도 사용합니다.

예를들면,

int val = digitalRead(센서디지털핀);

이와 같은 표현으로 센서값을 읽어올 경우에 val에는 디지털 신호 1과 0의 값을 갖게 됩니다. 그러면 IF문으로 사용하게 된다면 이렇게 표현을 할 수 있습니다.

if(val!=0){
  val은 1입니다.
}
else {
 val은 0입니다.
}

두가지 상태로 나눌 수 있게 됩니다. val 1일때 1의 문장을 수행하고 val 0일때는 0의 문장이 수행 될 수 있습니다. 만약, LED를 제어 한다면은 어떻게 될까요. LED가 13번 핀에 연결되었다고 가정를 해봅시다.

if(val!=0){
 digitalWrite(13,HIGH);
}
else {
 digitalWrite(13,LOW);
}

val이 1이면 13번 디지털핀에 HIGH(5V)상태로 5V의 전류가 공급됩니다. val이 0이면 13번 디지털핀에 LOW(0V)의 전류가 공급됩니다. 즉, 13번 핀은 센서의 값이 1일때 불이 들어오고 센서의 값이 0일때 불이 꺼지게 됩니다.

이렇게 IF문을 통해 두가지 상태를 제어할 수 있게 됩니다.

마무리


오늘은 IF문을 배웠습니다. IF문의 의미와 사용법을 잘 이해해 주세요. 아두이노에서 대개 제어를 할때 IF문을 활용하여 특정한 명령을 내리게 됩니다. 주의할 것은 IF문은 참과 거짓으로 이 두가지 상태만 있지만 그렇다고 해서 1과 0의 두가지 상태만 있는게 아닙니다. IF문은 0이 아닌 모든 것이 참이 됩니다. 햇갈리 수 있는데요. 조건식이 0이 아니면 IF문은 참이 된다는 소리가 됩니다. IF(조건식)에서 조건식의 결과가 0이 아니면 무조건 참이라는 의미가 됩니다. 1도 참이고 1.2도 참이고 2도 참이라는 소리입니다. 좀 표현이 그렇지만요 0과 아니면 조건식은 무조건 참인데 우선은 IF문은 참과 거짓으로 두가지 상태로 나뉜다고만 구별해서 사용하시고 너무 복잡한 생각은 잠시 미뤄주세요.

오늘 배운 IF문의 의미만 잘 이해하시면 아두이노를 재미있게 즐길 수 있습니다. 그냥 편하게 일상의 대화처럼 위에서 표현대로 IF ("너 밥먹었니") 참이면 "응! 먹었어!" 거짓이면 "아니! 안 먹었어!" 라고 일상의 표현들로 IF문을 사용해 보세요. 계속 그렇게 문장을 만들고 상상을 하시면 IF문은 어떤 느낌인지 느끼실 꺼에요.

댓글()

Ideone.com을 이용한 웹컴파일러

유용한팁|2019. 1. 31. 13:30

Ideone.com을 이용한 웹컴파일러




다양한 프로그램 언어를 공부할때 간편하게 사용할 수 있는 아주 유명한 웹컴파일러로 프로그램을 좀 다룬다고 하는 분들은 대부분 이 사이트를 알고 있을거라 생각되네요. 혹시 프로그램 언어를 배워보고 싶은 분들은 잘 모를 수 있어서 간단히 소개할 까 합니다. 저는 C언어 로직이 떠오르거나 설치 없이 실시간으로 온라인 상에서 C언어를 돌리고 싶을 때 가끔 씁니다. 참고로, 다양한 언어들도 돌려 볼 수 있어서 초보 프로그램 언어를 배우고자 하는 분에게 유익한 사이트라고 생각되네요.

1. Ideone.com 구성



c언어 처음 기본창입니다. 혹시 다른 언어를 다루고 싶다면 아래와 같이 선택버턴을 눌러서 원하는 언어를 선택하시면 됩니다.

그리고 기본창에서 코딩하시고 Run을 누르시면 실행됩니다.

2. 코딩(C언어 기준)



c언어 코딩창에서

printf("HELLO! WORLD! \n);

이 문장을 삽입하고 Run눌러주세요. 그러면 결과창으로 넘어갑니다.

3. 결과창



결과창으로 전환되고 stdout에 결과가 나타납니다.

4. 편집창


결과창에서 상단에 edit을 누르면 편집창으로 갑니다. 아래와 같이 여기서Ideone.it!을 누르면 바로 코딩한 결과를 확인이 됩니다. 코딩하면서 결과를 아래 창으로 바로 보여지는 것이죠.

마무리



편하게 프로그램 컴파일러를 설치하지 않고 온라인 상에서 기초프로그램 언어를 공부하면서 결과를 볼 수 있습니다. 아두이노를 하면서 어떤 로직이 머리속에서 떠올랐다면 그 로직을 여기서 간단힌 코딩해보고 가상 데이터를 넣어서 원하는 결과가 나오는지 확인 할 수 있어 편하게 사용할 수 있습니다.


댓글()