개발자는 깔끔하고 일관성있는 코드를 작성하는것이 중요합니다
규모가 큰 프로젝트를 진행중이라면 더욱 중요하죠, 코드의 상태가 프로그램의 유지보수에 많은 영향을 끼치기 때문에요

 

그래서 제가 코드를 최적화하기 위해 사용했던,하고있는 방법 몇가지를 소개하고자 합니다
많은 분들이 영감을 얻었으면 좋겠어요. 시작하겠습니다

 

01. 변수 값저장, 함수호출은 콤마로 연속해서 작성

 

변수에 값을 저장할때, 일반적으로는 아래처럼 코드를 작성합니다

 

이름 := "예지력"
성별 := "남성"
거주지 := "서울"

 

변수의 종류가 적은 경우, 위 처럼 작성해도 코드가 크게 길어지진 않지만
변수의 종류가 많은 경우에는 저장할때마다 다음줄로 넘겨주니 코드가 길어지죠


그런데 알고 계셨나요?

변수는 콤마(,)로 넘기면서 저장할 수 있습니다

 

이름 := "예지력", 성별 := "남성", 거주지 := "서울"

 

함수의 경우도 마찬가지입니다

 

함수1(), 함수2()

 

이는 깔끔한 코드를 유지할 수 있는것 뿐만 아니라 코드의 속도를 약 35% 높여줍니다

 

 

02. 비슷한 변수끼리는 오브젝트로 저장해두기

 

변수를 많이 사용하는 경우, 가끔 변수끼리 헷갈려 잘못 사용하거나 이름을 까먹는 경우가 있죠
비슷한 종류의 변수끼리는 함께 묶고싶은 경우도 있고요

 

이름1 := "예지력", 성별1 := "남성", 거주지1 := "서울"
이름2 := "독자", 성별2 := "여성", 거주지 := "서울"

 

이렇게 이름1,이름2,이름3.. 늘리며 저장하기엔 번거롭고, 나중에 변수를 사용할때도 헷갈릴 수 있습니다
이런 경우에, 변수를 오브젝트로 저장해두도록 하면 편하죠

 

시민1  := {이름: "예지력", 성별: "남성", 거주지: "서울"}
시민2 := {이름: "독자", 성별: "여성", 거주지: "서울"}
MsgBox % "시민1이름-" 시민1.이름 "`n시민1성별-" 시민1.성별 "`n시민1거주지-" 시민1.거주지

 

시민1.이름 := "변경된 이름"
시민1.성별 := "변경된 성별"
시민1.거주지 := "변경된 거주지"
MsgBox % "시민1이름-" 시민1.이름 "`n시민1성별-" 시민1.성별 "`n시민1거주지-" 시민1.거주지

 

 

03. 반복적으로 사용되는 명령어는 함수로

 

명령어...
Send, a
Send, b
Send, c

 

명령어...
Send, a
Send, b
Send, c
명령어...

 

위 코드에서 Send 부분이 반복적으로 사용되는걸 확인할 수 있습니다. 중복되는 부분은 함수로 묶어서 코드의 일관성을 높여보세요

 

명령어...
SendFunc()

 

명령어...
SendFunc()
명령어...

 

SendFunc()
{
 Send, a
 Send, b
 Send, c
}

 

 

04. 셋타이머, 핫키 라벨은 함수로 전환 (함수바인딩)

 

SetTimer, 라벨, ... 
Hotkey, F1, 라벨 ...

 

라벨:
명령어...
return

 

일반적으로 이렇게 사용하지만, 라벨의 사용은 코드의 깔끔함을 해치고, 유지보수가 힘들어집니다
오토핫키 공식도움말에서도 라벨의 사용을 권장하지 않습니다. 같은 이유로 goto 또한.

 

따라서, 함수를 사용해야겠는데... 그냥 라벨명에다가 함수이름적으면 되는게 아닙니다

 

함수를 하나의 변수(사실, 오브젝트)에 저장하고 라벨부분에 변수로 넘겨야해요

 

BindFunc := Func("함수명")     ; '함수명' 함수를 BindFunc오브젝트에 저장
SetTimer, %BindFunc%, ...       ; BindFunc 오브젝트를 라벨로써 사용
Hotkey, F1, %BindFunc% ...

 

함수명()
{
 명령어...
}

 

 

05. %변수% 를 많이 사용한다면 % 변수 로 통일

 

오토핫키에서 트레디셔널이라고 불리는 방식으로 변수를 표현할때는 %변수% 를 사용합니다
트레디셔널 방식으로  변수를 사용하려면 아래 코드처럼 적어야합니다

 

이름 := "예지력", 성별 := "남자", 거주지 := "서울"
MsgBox, %이름% %성별% %거주지%

 

히자만 익스프레션 표현식을 사용하면 이럴 필요가 없죠

 

이름 := "예지력", 성별 := "남자", 거주지 := "서울"
MsgBox, % 이름 성별 거주지

 

익스프레션에 대해 알아보려면 클릭하세요

 

06. 파일인스톨을 사용하는 경우, .zip 파일로

 

배포할 프로그램이 실행파일외에도 다른 리소스가 필요할때 파일인스톨로 함께 컴파일하곤 합니다

 

FileInstall, 1.png, %A_Temp%\1.png
FileInstall, 2.png, %A_Temp%\2.png
FileInstall, 3.png, %A_Temp%\3.png
FileInstall ... ;언제 다 적지?

 

그런데, 이렇게 코드를 작성하려면 굉장히 귀찮습니다
이 문제가 코드가 길어지고 더러워보이는거 보다 더 심각하죠

 

이런 경우에는 리소스파일을 .Zip으로 압축하고, 프로그램 실행시 .Zip의 압축을 풀면 되겠습니다
* 윈도우 네이티브 오브젝트를 이용하니 알집과 같은 외부툴이 없어도 됩니다

 

FileInstall, 리소스.zip, %A_Temp%\리소스.zip, 1  ;ZIP 파일


Zip := ComObjCreate("Shell.Application")  ;쉘 오브젝트 생성
Folder := Zip.NameSpace(A_Temp "\리소스.zip")   ; .ZIP 압축파일 지정, 여기서는 임시폴더(A_Temp)\리소스.zip
NewFolder := Zip.NameSpace(A_Temp)                ; 압축을 풀 경로 설정, 여기서는 임시폴더(A_Temp)


NewFolder.CopyHere(Folder.items, 4|16)          ; 압축해제, 임시폴더(A_Temp)에 리소스.zip 압축을 품, 항상 덮어씌움

  1. 야크모 2015.10.21 14:00 신고

    감히 여쭙습니다.
    06. 파일인스톨을 사용하는 경우 의 소스 중에
    ;;;;;;;;;;;;;;;;;
    NewFolder.CopyHere(Folder.items, 4|16) ; 압축해제, 임시폴더(A_Temp)에 리소스.zip 압축을 품, 항상 덮어씌움
    ;;;;;;;;;;;;;;;;
    이 부분을 항상 덮어 씌움이 아닌 폴더 존재시 그냥 압축해제를 하지 않는 코드가 있는지 궁금합니다.

    매번 실행시 다수의 파일을 압축해제 시키다 보니 렉이 심하네요. 처음 실행때 압축해제 되어 특정 폴더에 파일이 해제된 경우
    재차 실행시에는 기존에 폴더가 존재함을 확인하고 그냥 넘어갈 수 있을까요?

    항상 많이 배우고 갑니다. 질문 전에 이 말씀 먼저 드렸어야 했었으나 이해부탁드립니다.^^

  2. 야크모 2015.10.21 15:00 신고

    IfNotExist, 폴더경로
    NewFolder.CopyHere(Folder.items, 4|16)

    이렇게 하니 가능하네요~ 조언 정말 감사드립니다.
    생소한 CopyHere 명령어에 당황해서 사실은 [4|16] 이것이 무슨 뜻인가 계속 알아보고 있었습니다;; 엉뚱한데서 헤매고 있었네요

    • BlogIcon 예지력 2015.10.21 15:01 신고

      4는 메시지창 안뜨게하는거고
      16은 메시지창 팝업시 모두 예를 클릭하는거에요

  3. 하얀늑대 2015.10.31 16:50 신고

    예지력님.
    압축푸는것요. 암호걸린것도 풀 수 있나요?
    또한 압축 파일 이름을 랜덤으로 할 수 있나요?
    예를 들어 url로 zip파일을 다운 받는데 다운받을때 파일 이름을 randome, filename 해서
    파일이름을 랜덤으로 생성하는겁니다.
    filename 이라는것 자체가 변수가된거니까 이걸로 해서 풀 수 있나요?

    • BlogIcon 예지력 2015.10.31 20:04 신고

      암호는 안됩니다, 윈도우 zip기능을 이용하는거라서요

  4. BlogIcon 〃련이 2015.11.12 23:24 신고

    Random, Images
    FileInstall, Images.zip, %A_Temp%\%Images%.zip, 1

    Zip := ComObjCreate("Shell.Application") ;쉘 오브젝트 생성
    Folder := Zip.NameSpace(A_Temp "\%Images%.zip") ; .ZIP 압축파일 지정, 여기서는 임시폴더(A_Temp)\ZipName.zip
    NewFolder := Zip.NameSpace(A_Temp) ; 압축을 풀 경로 설정, 여기서는 임시폴더(A_Temp)
    NewFolder.CopyHere(Folder.items, 4|16)
    bSetMode := 0

    이렇게 해서 압축을 풀고 싶습니다. 위에 보시면알겠지만 Random 함수에 변수를 줘서 파일이름을 랜덤으로 압축 풀게 해놨는데
    저기 압축푸는곳 이름에다가 뭐라고 입력해야 하는지요? 저런식으로는 풀리지가 않네요 방법이 있을까요?

    • BlogIcon 예지력 2015.11.13 00:26 신고

      A_Temp . "/" . Images . ".zip"

      아니면,
      Des_Path := "/" . Images . ".zip"
      A_Temp . Des_Path

      /는 \(역슬래시) 인거 확인하시고요, 수정하세요

  5. BlogIcon Rahs 2016.01.20 20:09 신고

    이상하게 같은 글인데도 볼때마다 느낌이 다르고 깊이가 달리 느껴지네요.
    훌륭한 글 감사합니다.

  6. dww 2016.02.12 19:09 신고

    혹시 압축푸는 거 말인데요
    c드라이브 system32 에하려면어찌?

  7. BlogIcon Ralpy Na 2017.01.17 22:26 신고

    함수 바인딩 배우고 갑니다 ^^

+ Recent posts