방개
비밀번호를 잊어버리셨나요?

질문

강좌 루프문중에 결과값 뭔차인지 모르겠습니다.

    • 글자 크기

루프문보고 따라다하다가 제가 쓰던방식이 왜 안되는건지 궁금합니다.

 msgbox, %a% `X %b% `= a * b ; 이렇게하면 왜 결과값이 안나오고 문자로 나오는건가요?

MsgBox, % a " x " b " = " a * b ; 프날님이 사용하신거 잘됨.

    • 글자 크기
댓글 2
  • 2020.2.13 21:02 댓글

    우선, 쓰신 이스케이프 시퀀스 `X와 `=는 없습니다. 굳이 이렇게 쓰지 마시고, X와 =로 쓰시면 됩니다.

     

    이에 대해선 일단 "익스프레션"과 "리터럴"의 차이를 알아야 하는데요, 익스프레션은 "식"이고 리터럴은 "문자 그대로"를 뜻합니다.

    리터럴이 들어가는 자리의 시작에 % 기호를 맨 앞에 써주면 "익스프레션"으로 변화합니다.

    즉, 리터럴이 들어가는 자리가 익스프레션이 들어가는 자리로 바뀌는겁니다.

     

    그래서, % 기호로 열지 않으시고 오토님이 쓰신것처럼

    MsgBox, %a% X %b% = a * b 

    처럼 쓰시면, 리터럴 자리에 a * b라는 문자가 들어가는 꼴이 됩니다. MsgBox의 Text 매개변수는 "리터럴"자리라서 계산이 안되기 때문입니다.

     

    반면, 정답과 같이 %기호로 시작을 해주어 한 칸을 띄워서 리터럴 부분을 익스프레션 부분으로 바꿨다고 해봅시다. 

    그러면 리터럴이 아닌 식으로 인식하게 됩니다.

    MsgBox, % a "X" b "=" a * b

    위의 부분은 처음 시작할때 %기호를 사용하여 리터럴 부분을 익스프레션 부분으로 바꿔주었습니다.

    그러면 문자와 연산자가 들어오면 문자열이 아닌 "식"이 된거지요. 계산이 가능해지는 것입니다.

     

    *

     

    간단하게 아래 두 스크립트의 차이를 이해하시면 됩니다.

    MsgBox, 2 + 3
    MsgBox, % 2 + 3

    리터럴이 들어가는 자리에 %기호를 써주고 한 칸을 띄워줌으로써, 두번째 스크립트는 문자열이 아닌 식으로 인식되어서 5가 출력되는 것을 볼 수 있습니다.

     

    그러면 원래 쓰신대로 리터럴 부분에 변수표기를 하여 쓰는.. 즉 아래와 같은 경우는 연산자가 들어가도 식으로 인식하지 않고, 변수 부분만 치환되어서 표시될것입니다. 아래 식에서 var변수가 3이라고 하면, "3 + 3"이 출력되는 식인거지요.

    MsgBox, %var% + %var%

     

    그렇다고 MsgBox엔 무조건 %를 사용해서 계산한 값을 출력해야하나.. 라고 생각하시면

    그냥 아래와 같이 두 줄로 쪼개서 MsgBox로 출력하시는 방법도 있다는 점을 염두해두시면 됩니다.

    var := a "x" b "=" a * b
    MsgBox, %var%

     

    익스프레션과 리터럴에 대해선 한번 제대로 강좌를 써보도록 하겠습니다.. ^^;

    사실 강좌 교육과정에서 변수와 연산자를 설명할 때 바로 나왔어야하는 부분인데, 교육과정(목차)엔 넣을 생각을 못했네요.

     

    즉, %를 쓰고 한 칸 띄운 뒤의 부분은 "식"으로 인식해서 a * b라는 계산이 성립하지만

    쓰신 대로 변수만 %로 감싸준 방식은 %로 감싸주지 않은 부분을 "문자열"로 인식해서 a * b는 a * b로 출력된겁니다.

     

    감이 생기면 쓰신 스크립트가 상당히 어색하게 느껴지실겁니다.

    같은 변수인데, 처음 등장한 a와 b는 %로 감싸주었으나 뒤쪽 a * b 부분은 변수에 %표기를 해주지 않았기 때문입니다.

    a와 b는 문자열 취급일겁니다 변수가 아니라.

    그러면 변수 a, b가 그대로 출력되는건 알겠는데, 곱하기는 왜 안되냐..

    그건 식이 들어가는 자리가 아니라, 문자열이 들어가는 자리이기 때문입니다.

    그래서 문자열 자리를 식 자리로 만들어주기 위해, 매개변수 시작 부분에 % 기호를 쓰고 한 칸을 띄워주는 조치를 한 것입니다.

     

    라고 설명드릴 수 있겠네요. 아이고.. 이거 정리 없이 설명드리니 복잡해졌네요.

    언제 한번 정리해서 강좌로 쓰겠습니다.

  • 오토글쓴이
    2020.2.13 22:22 댓글

    답글다신글 천천히 읽고 이해좀해봐야겠네요

    답변감사합니다.!

댓글 달기

서버에 요청 중입니다. 잠시만 기다려 주십시오...