본문 바로가기
매트랩(Matlab)/매트랩 강의

[Matlab / 매트랩] 9. m-file 만들기 // for, if, while 등의 조건문의 사용과 Type의 이해 (2)

by freezkim 2010. 2. 5.

[Matlab / 매트랩] 매트랩 강의 9번째

m-file 만들기 시리즈(2) // for, if, while 등의 조건문의 사용과 Type의 이해 (2)

조건문의 응용
듕지 듕지 쌀국수 뜍뺴귀-



저번 시간에 이은 조건문의 사용과 type의 이해 2탄입니다.
조건문 - if, for, while의 개념에 대해서 저번시간에 다뤄 봤는데요.
오늘은 요 type이란걸 한번 다뤄보고, 조건문에 대해 다시한번 해보고자 합니다.

type이란건 앞서도 말했듯이, 이게 문자냐 숫자냐 정체가 뭐냐?를 알아보자는 건데, 근데 걍 딱보면 알잖아요....엥? 아닌가ㅋ
그런데 이걸 굳이 하겠단 이유는 요 type이 어떻냐에 따라 '조건'을 표시하는 형식이 매우 약간 아주 조금 다르기 때문입니다.

지금은 좀 뜬소리 같기는 한데... 일단 하나하나 차근차근히 해보아요 $1$2$3$4


1) 일단 조건문의 대충의 설명을 한 후에

2) 타입에 대한 설명을 다루고

3) 다시 조건문으로 돌아가는걸 하겠습니다.

4) 그리고 예제 하나 들어보고 마치도록 하겠습니다.


2. type이란 무엇인가?

type type 타입 타입 자꾸 타입타입거리는데 타입이란 뭐냐 - 그자식 내 타입이었어
타입이란건 진짜 문자냐 숫자냐 요거 구분해주는 겁니다ㅎ

예를 들어볼까요

1 요건 숫자인가요 문자인가요? - 숫자입니다.
h 요건 숫자인가요 문자인가요? - 문자입니다.

그렇습니다.

자 그럼 이제 요걸 매트랩에 입력을 시켜 봅시다.

a=1;

자 요렇게 하면 a라는 변수에는 1이 들어 있게 됩니다.



하지만 a라는 변수에 "문자 h" 를 집어 넣어 줄려면 어떻게 해야 할까요?

그냥 왠지 직관적으로

a=h;

요렇게 집어넣어보면 될거 같은 느낌도 들지만, 되지 않습니다.




네네, 왜 그렇냐면, 매트랩은 기본적으로 알파뱃은 '변수'로 생각하기 때문입니다.

아니 이게 무슨 소리야!! 내가 고ㅈ....,

m-file 만들기 첫번째, 행렬 입력하기의 내용을 기억하시나요?
a=1을 쳐 넣었더니 a라는 이름을 가진 행렬이 만들어 졌다는거.

즉, 매트랩은 기본적으로 어떤 영어문자는, '어떤 행렬의 이름'으로 생각해 줍니다.
(요런 행렬 안의 내용이 변할 수 있는 값이니, 이걸 변수라고 말할 수도 있는 거죠, 편의상 변수라고 부르겠습니다.)

다시 말해, 어떤 알파뱃이란건 기본적으로 '폴더'와 같은 역할을 하는 것이지, '폴더 안의 파일'이 되는건 아닌 것입니다.

따라서 a라는 변수에 문자 h를 집어 넣어 주기위해서는
h가 "문자 h이다." 라는걸 표시해 주어야 합니다.

그 방법은 작은 따옴표 ' ' 를 이용하는 건데요. 바로 요렇게 입력해주시면 됩니다.

a='h';

자 결과를 보시면 a에 h라는 문자가 들어가 있는걸 볼 수 있죠?



그럼 하나 더 해봅시다. 아까 위에서 a=1이라고 쳤는데, 1이 숫자가 아니라 문자라면?

그러니깐 화성의 깐딴뻬루족은 1이라는걸 한글의 'ㄱ'과 같은 소리가 나는 문자로 쓴다 칩시다.
그렇다면 이 깐딴삐루족이 매트랩을 써서 a에 1이라는 문자를 넣어주기 위해서는
1이 문자로 변신해야 한다 요겁니다.

네 그런 경우는 바로 요렇게....

a='1';

로 쳐주면 문자로 변신하는 걸 볼 수 있습니다.


자 그럼 이제 문자와 숫자에 대해서 아셨을 거라 믿고, type에 대해서 하나만 더 해봅시다.

a가 기본적으로 행렬 이름이라고 앞에서 말해버렸죠??
그렇다면 행렬의 (1,1)성분은 숫자 1로 행렬의 (1,2)성분은 문자 1로 지정하면 어떻게 될까요?


a(1,1)=1;
a(1,2)='1';

이 경우 a=[1 49] 로 입력이 됩니다.
이때는 문자 1이 숫자 type으로 변형되어 입력이 되기 때문입니다. ascii코드라 불리는 코드가 있는데요.
요놈은 "숫자 - 문자"를 매치시켜주는 표라 할 수 있겠습니다. 이 ascii코드에 따라서 문자'1'이란건 숫자 49에 해당하는걸 알수있구요. 
른 타입의 내용은 그 행렬의 원래 타입으로 변형되어 들어가게되요.

타입을 다르게 해서 섞기 위해서는 행렬(matrix)가 아닌 셀(cell)을 이용해야 하는데, 요건 매우 나중에 다룹시다ㅠ

또 비슷하게 1+'1' 의 합은 나올 수 있을까요?

이때도 마찬가지로 '1'은 ascii코드에 의해서 double타입으로 자동변환되어 49라는 숫자로 바뀌고
따라서 1+'1'=50 이라는 결과가 나오게 됩니다.

그럼 요까지 정리를 해볼께요.

 (1) type은 (기본적으로!) '문자'와 '숫자'가 있다.

 (2) '문자'를 입력해주기 위해서는 작은따옴표(' ') 를 이용할것!
 (3) 다른 type끼리의 연산을 하게되면 double 타입으로 자동변환된다.
 (4) 다른 type의 데이터를 하나의 행렬에 넣게되면 원래 행렬의 type으로 변환되어 입력된다.

이걸 굳이 다루는 이유는, 어떤 명령어는 '숫자'를 입력으로 요구하고, 어떤 명령어는 '문자'를 입력으로 요구하기 때문입니다.
일단 요정도만 알아두시고, 다시 조건문으로 돌아가 보도록 합시다.







3. 조건문의 사용 if, for, while
앞선 강의에서, if, for, while을 어떻게 쓰는가 대충 형태를 봤습니다.

if 조건
end

for 변수=처음숫자: 증가량 : 끝 숫자
end

while 조건
end

요렇게 3가지였죠?

이 경우 if, while에 들어가는 조건은 동일하다고 했습니다.(뭐가 뭐보다 크다, 작다, 같다, 어떻다 저떻다 등등등등등등)

for 변수 = 처음숫자:증가량:끝숫자는 이미 앞의 내용에서 다뤘으니 안해도 괜찮을것 같아요....후후후

그러니 요 if문에 쓰는 조건을 딱딱하게 다뤄봅시다.


  (1) 조건이 숫자와 비교하는 것일 때
  조건이 어떤 숫자와 비교해서 어떠하다. 라는 것일 때, 다음과 같은 형식으로 쓸 수 있습니다.
  어떤 조건에 해당하는 변수가 a(이때 변수는 숫자여야 합니다!!), 비교할 숫자를 1이라고
  칩시다. 그러면 다음과 같은 형태로 구현됩니다.


   if a>1    ->  a가 1보다 크다면~
   if a<1   -> a가 1보다 작다면~
   if a==1 -> a가 1이라면~
   if a<=1 -> a가 1보다 작거나 같다면~
   if a>=1 -> a가 1보다 크거나 같다면~
   if a~=1 -> a가 1이 아니라면~

   자, 이건 기본적으로 크다와 작다, 같다의 비교구요.
   요런 기본 적인 것들을 응용해서, 두개의 조건을 동시에 만족할 때, 혹은 둘 중 하나를
  만족할 때
의 형태를 만들 수도 있습니다.

   예를들어 1보다는 작으면서 -3보다는 클때, 등의 조건을 만들 수 있는거죠.
   그 형태는 다음과 같습니다.

   if (조건1) && (조건2)      ->   조건 1과 조건 2를 둘다 만족한다면~
   if (조건1) || (조건2)         ->   조건 1과 조건 2 둘 중 하나라도 만족한다면~

   위의 &&(AND:그리고) , ||(OR: 또는) 를 또 섞어서 조건을 더 만들수도 있어요.
   밑에처럼 말이죠.

 

   if (조건1) && (조건2) && (조건3)       -> 조건 1과 조건2, 조건 3을 전부다 만족한다면~
   if (조건1) && ( (조건2) || (조건3) )      -> 조건 1을 만족하고, 조건2와 조건 3중 하나를 만족
                                                                  한다면~


   네 이런식으로 응용이 가능해집니다.


  (2) 조건이 문자와 비교하는 것일 때
 
   이 경우는 a에 어떤 문자가 입력 되어 있을 때, 그 입력 된 문자와 비교해서 어떻다라는걸
   알기위한 겁니다. 문자란 건 그사이에 크다, 작다란 개념이 없을 테니(........반발의 여지가
   있을 수 있습니다만....) 같다, 다르다만 비교해 주면 됩니다.


    if a=='가'                    (a가 '가'와 같을 때)
    if a=='matlab'              (a가 'matlab'과 같을 때)
    if a~='matlab'            (a가 'matlab'과 다를 때)

   마찬가지로 응용하면

    if (조건) && (조건)
    if (조건) || (조건)
 
    if (조건) && (조건) && (조건)
    if (조건) && ( (조건) || (조건) )

위의 설명방법으로 해도 예제에선 가능하지만, 이때 ==는 각 문자값을 double타입으로 변환하여 생각한 결과를 비교하는 것이됩니다. 따라서 문자 타입에 대해서 정확한 조건문을 만들기 위해서는 if구문이 아닌 strcmp라는 명령어를 써야합니다. 이후의 예제에도 if로 되어 있는데 strcmp로 쓰는것이 더 적합하다 할 수 있겠습니다.





   
 
  (3) 조건문 응용하기, 조건문 안의 조건문, 그리고 elseif, else, break
   조건문은 응용하기에 따라 무궁무진한 결과를 얻을 수 있습니다.  어떤 조건을 만족할 때
   다시 그 안에 for, while, if의 조건을 추가
해서 조건에 조건을 만드는 형식으로 응용이
   가능하겠죠. 예컨데 이런식으로 말입니다.


    if 뚝배기권유=대답이 'no'
         while 뚝배기 권유=대답이 'yes'
            한뚝배기 하실래예?
         end
    end

   이렇게 되면 뚝배기 권유시 대답이 yes가 될때까지 while문이 돌게 되니, 먹을 때까지 계속
   권유하게 되는거죠.


   집요한 로버트 할리임 우왕굿ㅋㅋ
굿굿  할리오브집요

    i)  if문의 경우 else, elseif 등을 추가적으로 사용!

      else와 elseif는 if 안에 붙어서 ~하지 않는다면 의 의미를 나타내게 됩니다.
      형식을 한번 볼게요.


      if 조건 1  (조건 1 을 만족 한다면)

         실행내용 1

         elseif 조건 2 (위의 조건 1 을 만족하지 않으면서, 조건 2를 만족한다면)

            실행내용 2
  
     else   (위의 모든 조건을 만족하지 않는다면)

           실행내용 3

     end

       자, 순서대로 봤을 때, elseif를 쓰게 되면
       위의 조건 1을 만족하지 않지만
elseif의 조건 2를 만족할 때
       그 아래의 실행내용 2가 실행되게 됩니다.


       그리고 else는 위에 제시된 모든 조건을 전부 만족하지 않을 때,
       실행내용 3을 실행시키게 되구요.


       여기서 조건문 전체가 끝나는 end는 제일 밑에 하나만 쓰이게 됩니다.
       왜냐면 if문 아래 존재하는 모든 elseif와 else는 "조건1에 속한 조건문" 이라고 생각하면,
       조건문이 한개가 되니깐 end는 한번만 들어가 주는게 맞게 되겠죠.


    ii)  반복문에서의 break의 사용!

       브레이크는 반복문(for, while)에서 억지로 연산을 멈출때 쓰는 겁니다.
       이 경우 while이나 for문안에 if문을 넣어서, 어떤 조건을 만족 할 때 break가 동작하도록
       하는 형태로 많이 쓰입니다.

       형태는 이런식인데요.

         for i=1:10
              if i=5
                 실행할 내용
                 break;
              end
         end

      이렇게 되면 i가 5인 시점에서 if문 안의 내용이 실행되고, break 때문에
      for문의 동작이 멈추게 됩니다.

          즉, i는 5까지만 증가하다가 끝나버리는 거죠. 좀더 응용한 예제를 밑에서 보여
        드리겠습니다







4. 예제 하나 들어봅시다.

    자 그럼 이때까지 줄기차게 예제로 들어왔던 로버트 할리씨의 뚝배기 권유를
   직접 매트랩으로 구현해볼까요?


    요렇게 합시다.

    로버트 할리씨가 한뚝배기 하시라고 권유하는데, 만약 그 권유에 대한 대답이 yes라면
  걍 넘어가고
그 권유에 대한 대답이 no라면 또다시 권유하는 겁니다.

    근데 요 권유는 총 5번만 반복하는 구조로 해보죠ㅎ  ...할리 오브 더 매너..

   그러면 구조는 이런식
으로 될것입니다.

      for i=1:5

      뚝배기 권유의 대답을 체크한다.
  
         if 뚝배기 권유의 대답이 '네'라면?
            '다이나믹 로동!!!!!' 을 출력하고 
             for문을 빠져 나온다.(break)
         end

      뚝배기 권유의 대답이 '아니오'라면 if문안에 들어가지 않으므로 이부분이 실행되게 된다.
      여기선 권유의 문장 '한뚝배기 하실래예'를 출력한다.
      end
       

    여기서 이때까지 배운 내용외에 추가적으로 필요한 명령어는 2개 입니다.

     (1) sprintf  -  문장 출력을 위해 사용하는 명령어
        출력을 위해 사용하는 명령어라고 생각하시면 편할 것 같습니다.
        (사실은 좀 다르긴 하지만...)

        그렇게 알아두시는게 속편하고 마음도 편하고, 다음시간에 자세히 다루기로 해요. 일단은
        그냥 그런 명령어다... 까지만 알아두시고 봐 두세요.
       

   
(2) questdlg  -  권유에 대한 대답을 '네'로 할지 '아니오'로 할지
                           선택문을 만들어 주기위해 필요한 명령어

        
questdlg는 GUI와 연동해서 그래픽으로 작업하기에 편리한 명령어입니다.
         박스 형태로 띄어주기 때문에 상당히 매트랩 고수의 느낌이 나게 하는 명령어죠ㅋㅋ
         요걸로 어디가서 쫌 배운 티좀 내면 좋으실듯?ㅋ


         형태는 이런 식입니다.
            >>  questdlg('질문할 내용', '질문 제목' ,'선택지1','선택지2','기본으로 정할 선택지')
     

         이때 questdlg의 출력은 고른 선택지가 됩니다.

         뭐, 일단 매트랩이 직접 쳐보죠 뭔소린지는 쳐봐야 아는거임 원래 인생이 그런거.

           
>> questdlg('뚝배기를 드시겠습니까?','알림','네','아니오','네')

                    그리고 '네'를 선택하게 되면?
 

              네, ans=네 로 나오게 되죠.
 
           요 출력변수를 어떤 데이터에 저장한다면 요렇게 됩니다.

                >> D = questdlg('뚝배기를 드시겠습니까?','알림','네','아니오','네')
  

                       '아니오'를 선택하게 되면?

               네, D에 '아니오' 라는 데이터가 들어가게 되죠 호호호

 





          두개의 명령어를 적용시키고, 위에서 썼던 내용을 문법에 맞게 수정해 볼게요.

for i=1:5
          chk_ans=questdlg('뚝배기를 드시겠습니까?','알림','네','아니오','네');
               if chk_ans == '네'
                   sprintf('다이나믹 로동!!!!!')
                   break;
               end
          sprintf('한뚝배기하실래예? %d번 권유하였습니다.' , i)
          end

        자 결과를 한번 봅시다.

         질문이 뜹니다.


         '네'를 선택하였습니다.

    '아니오'를 선택하였습니다.

  
        네.. 잘 나옵디다..(?)
        요런걸 이제 GUI+그래픽과 응용시키면 좀더 재밌는 것도 가능해지는 거죠.
        재미를 위해 이미지 쫌 하고 GUI도 쫌 했습니다.

        한번 보세요
ㅋ 제일 위에 동영상 파일입니다ㅋ
        (혹시나 필요하시면 m-file첨부해드릴게요..ㅋ)

        오늘 강좌의 핵심은 한뚧붸기 하실래예 입니다.....아?









Tip!!!

if문의 조건에서 문자 타입과 문자 타입의 비교를 할 때는, 한글의 경우는 제대로 동작하는 것을 확인 할 수 있었습니다.
예를 들자면

if '감사합니다' ~= '별걸 다'
  sprintf('안 같애')
end

이런 경우는 동작을 하던데, 영어로 비교할 경우는 제대로 동작을 하지 않더군요..

if 'yes' ~= 'no'
 sprintf('엥?');
end

이렇게 할 경우 yes와 no의 매트릭스 크기가 달라서 비교가 안된다는 답변이 나옵니다.
참나, 매트릭스 크기가 다르면 당연히 다른거지, 근데 왜 한글은 비교 되지??
허 참~나  /  참~나 허  /  나 허~참  /  허~ 나참 / 나~참 허 / 참 허~ 나

 
저도 몰랐던 사실이라 원인을 알아보고 있는 중이긴 합니다만... 이런 경우는 if의 조건문을 숫자 형태로 비교를 하거나, 첫째 단어만 비교를 하거나, 한글로 비교를 하거나.. 하는 등의 꼼수를 써야 할 것 같네요 아무래도...

여튼 알아두시길, 원인을 알아내면 질문모음에 올리겠습니다.