매크로

조회 수 11327 추천 11 댓글 107


안녕하세요~ 바람처럼 입니다~^^


바람매크로 & 컨피그 대규모 업데이트 관계로 응용편 강좌가 많이 늦어졌네요...


기다리신 분들께 죄송하다는 말씀 드리며 응용편 강좌를 시작해 보겠습니다~




이번 강좌는 프렙 3.7에서 새롭게 추가된 기능을 위주로 하다보니?프렙을 어느정도 아는분들을 대상으로 합니다...


프렙의 기초에 대해 알고 싶은 분들은 이곳 강좌란의 기초편부터 차근차근 읽어보시길 권해드립니다.


또한, 프렙 3.7에 추가된 기능들이 전혀 다른 맥락의 새로운 기능들이 아니고


기본적인 시퀀스 컨트롤에 관계되는 변수와 조건문 이다보니 아무래도 강좌의 내용이?


프로그래밍언어 강좌와 비슷하게 코딩기법에 대한 이야기가 주가 될것 같습니다...


이런 부분으로 인해 머리아파 하실 분들께 미리 심심한 양해의 말씀 드립니다...^^;;






1. 루프 컨트롤


프렙에서 많이 사용되는 기법중에 반복되는 시퀀스를 제어하기 위해 사용하는 것이 루프 입니다.


예를들어 10회의 루프를 돌면서 특정 좌표를 클릭하는 시퀀스를 만들어야 한다면 예전에는 이런식이었죠~


https://i.imgur.com/dUCEmSV.png



Start Loop 와 End Loop 로 묶인 시퀀스는 루프에서 지정된 횟수만큼 반복실행 됩니다.


이 방법은 루프횟수가 고정되어 변화하지 않습니다. 경우에 따라 루프 횟수를 변경할 필요가 있을때는 곤란했었죠.


프렙 3.7에서는 루프 컨트롤에 변수 및 조건문을 이용하여 횟수 및 탈출조건을 자유롭게 컨트롤 할 수 있습니다.




변수/조건문을 이용하여 루프 컨트롤 하는 방식은 크게 2가지가 있습니다.


먼저 기존의 Loop 시퀀스를 그대로 이용하되, 탈출조건만 지정하여 빠져나오는 방법이 있습니다.


이 방법을 이용하여 위의 예제와 동일한 작동을 하는 시퀀스를 만들어 보겠습니다.


https://i.imgur.com/bPoTO8U.png


달라진 점은 2가지 입니다. 먼저 Start Loop 에서 횟수를 지정하지 않았습니다. 이렇게 할 경우 무한루프가 되죠.


두번째로, 조건문을 넣어 현재 루프카운트가 10회이면 탈출하도록 추가 했습니다.


if 문의 조건식을 보시면 @loop 라는 환경변수가 사용된 걸 보실 수 있습니다.


이 변수의 역할은 지난번 변수편에서 설명드렸듯, 현재 루프카운트를 갖고 있는 변수입니다.


@loop ?변수를 이용하여 루프의 처음 부분에 현재 루프카운트를 판별하여 10회가 되면 탈출하도록 했습니다.


사실 이런식의 루프컨트롤은 첫번째 예를든 경우와 완전히 동일하며?별달리 루프횟수를 컨트롤할 여지가 없습니다.?


그러나 만약, 루프카운트에 10이란 숫자 대신 변수를 넣으면 어떨까요?


다음과 같은 경우를 보시겠습니다.


https://i.imgur.com/PP8sCuA.png



달라진 부분이 보이시나요? 루프 카운트를 count 란 이름의 변수에 지정을 하고


조건문에서 숫자 10 대신 변수 count 와 비교를 했습니다.?


이렇게 하면, 상황에 따라 count 변수값을 다르게 주어서 루프 횟수를 조정할 수 있습니다.


프렙에서 모든 변수는 광역 입니다. 따라서 시퀀스나 프로시져에서 정의된 변수는


그 이후에 불리는 어떤 시퀀스나 프로시져에서도 동일하게 사용하실 수 있습니다.


그 말은 count 변수의 정의를 꼭 여기에서 할 필요없이 다른곳에서 미리 정의한 후 부를수도 있다는 말이죠...




이와는 다른 방법으로, Loop 시퀀스를 아예 쓰지않고 별개로 루프를 구현할 수도 있습니다.


https://i.imgur.com/X4Vpjyt.png


변수 초기화후 해당 변수가 원하는 횟수에 도달했는지를 직접 판단하는 방법입니다.


이 방법의 장점은, 초기값 및 루프값을 모두 변수로 처리해 다양한 상황에 대응할 수 있다는 점입니다.


다만 한가지 주의하실 점은, 프렙에서 정수와 실수의 구분이 엄격하다는 부분입니다.


위의 예에서 2번 if 문의 조건식을 count == 10 ?과 같이 비교하게 되면 실패하게 됩니다.


4번에서 count 값이 증가하는 경우, 1 2 3 이런식이 아니라 1.0 2.0 3.0 으로 증가하기 때문입니다.


따라서 이런 부분에 대한 오동작을 방지하기 위한 방법으로는



1. 아예 초기화 할때부터 count = 0.0 과 같이 한다.


2. 비교문에서 == 대신 >= 을 사용한다.


3. 비교문에서 count == 10.0 과같이 실수연산을 한다.



등이 있겟습니다. 어느 것이든 편한 방법으로 쓰면 되지만 정수/실수 부분은 항상 유의해야 합니다.








2. 문자열과 숫자의 변환


프렙에서 문자열, 즉 스트링 타입의 변수를 취급하다 보면 숫자로 변경해야 할 필요가 빈번하게 발생합니다.


스트링 타입의 변수로 처리되는 외부파일에서 읽은 값이나 클립보드를 이용하거나 하는 경우등이 있겠죠.


아쉽게도 프렙에는 atoi() 같은 문자->숫자 치환 메소드나 함수를 지원하지 않고 있습니다.


그래서 간단하게 이런 동작을 하는 프로시져를 만들어 보면서 동시에 문자열을 다루는 기법들을 살펴 보겠습니다.




문자열 "345" 를 숫자 345 로 바꾸는 방법은 숫자가 만들어 지는 원리를 생각해 보면 의외로 간단합니다.


즉, 345라는 숫자는 3x10x10 + 4x10 + 5 로 구성되어 있으므로 우리는 이 순서대로 연산을 하면 됩니다.


이 과정을 간단히 살펴보면 다음과 같습니다.



1. 숫자 = 0


2. 문자열의 끝이면 종료


3. 숫자 = 숫자 x 10


4. 숫자 = 숫자 + (문자를 숫자로 변경한 값)


5. 문자열의 다음 문자로 이동후 다시 2번으로



아주 간단하죠? 문자열 "345" 를 위의 방식대로 풀어서 숫자로 바뀌는 방법은 다음 과정을 거칩니다.


0 -> 3 -> 3x10=30 -> 30+4=34 -> 34x10=340 -> 340+5=345




위의 흐름대로 프렙으로 구현해 보도록 하겠습니다.


https://i.imgur.com/aQbJl4P.png


str 에는 숫자로 변환할 문자열을 넣어주고 각종 변수들을 초기화 합니다.


NumPad 는 문자를 숫자로 환산하기 위한 테이블 입니다.


digit 에는 현재 문자열의 길이를 보관하게 됩니다. 이 때,?주의할 점은


현재 프렙 3.7에는 문자열 길이를 구하면 문자열을 감싼 양쪽 따옴표 값도 같이 계산하는?버그가 있습니다.?


따라서 마지막 줄에서 따옴표 길이 2를 빼주고 있습니다.


이 부분은 나중에 프렙의 버그가 잡히면 삭제되어야 할 부분입니다.


프렙 3.7patched2 버전에서 이 버그가 잡혔습니다. 따라서 -2 해주는 부분은 빼주셔야 합니다.



https://i.imgur.com/apr0HU4.png


그다음 if 문에서 탈출 조건을 지정하고 있습니다. 문자열 길이만큼 다 돌게되면 리턴하도록 되어 있죠.



https://i.imgur.com/AbobTiI.png


이제 실제로 계산하는 부분입니다. 가장 중요한 부분이니 하나씩 살펴 보겠습니다.


i 는 현재 문자열에서 처리하는 문자가 몇번째 문자인지를 가르키고 있습니다.?


2번재줄 chr 은 sub 를 이용하여 전체 문자열에서 i 가 가르키는 곳의 한문자를 가져 옵니다.


3번째줄은 NumPad 와 idx 를 이용하여 가져온 문자하나를 숫자로 바꿔주는 동작을 하고 있습니다.


이과정을 문자열 길이만큼 반복하여, 위에 설명한 흐름에 따라 문자열을 숫자로 바꿔주게 됩니다.


그래서 최종 결과는, str ?에 "12345" 를 넣고 이 프로시져를 부르면 num 에 숫자 12345 가 들어오게 됩니다.


만약 - 부호가 붙은 음수값이나 소숫점 처리를 고려한다면 조금 더 복잡해 지지만


정수를 다루는 정도는 위의 시퀀스로 훌륭하게 처리됩니다.



https://i.imgur.com/YHBC1px.png


종합하면, 이렇게 3개의 시퀀스 만으로 문자열을 숫자로 바꿔주는 프로시져가 만들어 졌습니다.


이 프로시져는 앞으로 여러 부분에서 유용하게 사용하게 될것입니다~^^


프렙 3.7patched2 버전에서는 문자열을 숫자로 쉽게 바꾸는 asnum 이 추가되었습니다.







3. 외부파일 읽어오기


프렙 3.7에 새로 생긴 강력한 기능중 하나가 폴더에서 파일을 읽어오는 것입니다.


https://i.imgur.com/Iuky9SR.png


스트링타입의 변수를 지정하고 옵션에서 가장아래 read 를 선택하면?정해진 파일내용을 읽어와 변수에 넣을 수 있습니다.


이 방법을 통해 우리는 각종 설정이나 변하는 값들을 더이상 시퀀스에서 수정하지 않고 설정파일을 통해 쉽게 변경할 수 있습니다.


설정파일의 포맷은 구현하기에 따라 달라질 수 있으며, 여기에 맞춰 값을 읽어오는 부분을 구현해야 합니다.


예를들어 일반적인 key=value 형태의 설정파일이 있다고 가정했을 때,?이 부분을 어떻게 처리하는지 살펴보도록 하겠습니다...


설정파일은 여러개의 줄로 구성되어 있고, 끝은 줄바꿈문자 "\n" 으로 구성되어 있습니다.



설정1=설정값1

설정2=설정값2

설정3=설정값3



의 형태로 구성된 파일이 있다고 할 때, read 를 쓰면 파일의 모든 내용이 변수에 저장됩니다.


저장된 변수를 분석하여 우리가 원하는 설정값만을 읽어와야 하겠죠. "설정2" 에 해당하는 값을 읽어보겠습니다.


전체 내용중 우선 "설정2=" 부분을 찾아낸 후, = 다음부분에서 줄의 마지막 \n 까지 읽어오는 시퀀스를 구성해 보겠습니다.


https://i.imgur.com/pOojqDV.png



먼저 설정파일을 읽어 ConfigINI 에 넣습니다. 그다음 찾고자 하는 "설정2=" 문자열을 idx 를 이용해 찾아줍니다.


키값의 문자열 길이를 구할 때 앞서 설명드린 바와 마찬가지로 프렙의 버그로 인해 2를 빼주고 있습니다.


이렇게 찾은 실제값을 sub 를 이용해 잘라와서, 마지막 줄바꿈 \n 까지 역시 sub 를 이용해 잘라줍니다.


이 과정을 거치게 되면 val ?에는 "설정값2" 가 들어오게 됩니다.


간단한 프로시져를 통해 설정파일에서 우리가 원하는 설정값을 읽어오는 시퀀스가 완성 되었습니다~^^


설명드린 2개의 프로시져들은 앞으로 강좌에 계속해서 사용되는 기법들을 포함하고 있으니


잘 이해하고 넘어가시길 바라며 프렙에서 문자열을 다루는 좋은 예제가 되었으면 합니다...






아직 이야기할 꺼리가 많은데 벌써 분량이 상당히 많아졌네요~


잠시 쉬었다가 다음편에 계속 응용편에 대한 강좌를 계속해 나가도록 하겠습니다...


다음편에서는 영역형 변수의 취급방법 및 이미지매칭에 관한 이야기를 풀어보도록 하겠습니다.


여기까지 따라 오시느라 수고 많으셨고, 잘 이해가 안되는 부분은 댓글에 질문하시면 자세히 설명 드리겠습니다~


그럼, 다음편을 기대해 주세요~?


감사합니다~^_^





List of Articles
제목 글쓴이 최근변경 추천
프렙으로 페이스북 복사한글 붙히기 1 kakasi78 2018.11.27 3/0
프렙에서 타이머를 써보자~! 179 바람처럼 2023.01.16 17/0
프렙에서 다이나믹 변수를 써보자~! 67 바람처럼 2023.11.14 6/0
프렙 3.8 의 새로운 기능들 104 바람처럼 2023.05.26 12/0
프렙 3.7 의 새로운 기능... 응용편 #2 (영역 & 이미지) 155 바람처럼 2023.07.20 19/0
프렙 3.7 의 새로운 기능... 응용편 #1 (루프 & 스트링) 107 바람처럼 2021.07.19 11/0
밖에서 frep이 무슨 아이템을 먹고 있나 확인을 해보자... 117 쉐브 2022.11.08 8/0
[Frep] 세나-쫄작 스퀸즈 만들기 방법(엑셀자료) 115 두환애비 2023.01.22 19/0
프렙 3.7 의 새로운 기능... 조건문(If), 로그(Error, ... 95 바람처럼 2020.12.25 16/0
프렙 3.7 의 새로운 기능... 변수(Variables) 기초편 114 바람처럼 2021.01.04 18/0
[몬길] frep 매크로 아주 간단하게 따라하며 만들기 2편 94 오렌지케이크 2024.01.04 10/0
[몬길] frep 매크로 아주 간단하게 따라하며 만들기 1편 195 오렌지케이크 2021.05.25 24/0
세나] 프렙으로 대동단결 2탄 - 프렙 강좌(1) 19 옹스컴 2023.07.27 1/0
[Frep] 쫄교체 매크로 동영상 강좌 2 76 제이먼청 2023.07.21 6/0
[Frep] 쫄교체 매크로 동영상 강좌 1 101 제이먼청 2023.01.22 15/0
간단하게 만드는 7-9쫄 기반 세븐나이츠 3쫄 교체(3) 76 제이먼청 2020.12.24 9/0
간단하게 만드는 7-9쫄 기반 세븐나이츠 3쫄 교체(2) 41 제이먼청 2020.12.24 8/0
간단하게 만드는 7-9쫄 기반 세븐나이츠 3쫄 교체(1) 77 제이먼청 2023.07.27 10/0
세나 프랩 간단하게..강좌 117 김부관 2020.12.24 19/0
프렙의 단순작업 도우미... 프로시져 (Procedure) 123 바람처럼 2020.12.23 20/0
Board Pagination Prev 1 2 Next
/ 2

전체 최신 인기글

전체 주간 인기글