예지력
W
예지력

블로그 메뉴

  • 문의 & 피드백
  • GitHub
  • 분류 전체보기
    • 주식
    • 파생상품
    • crypto
      • 차트에 현대미술
      • 복기
      • 시스템 트레이딩
      • 기술적 분석
      • 블록체인
      • 생각
      • 리서치
      • Token Engineering
    • 이더리움 | ETH
      • 리서치
    • 테라 | LUNA
      • Tefi
      • 루나 LUNA
      • 아스트로포트 Astro
      • 앵커 프로토콜 ANC
      • 미러 프로토콜 MIR
      • 아폴로 다오 APOLLO
      • 프리즘 프로토콜 PRISM
      • 넥서스 프로토콜 NEXUS
      • 레바나 프로토콜 LEV
      • 마스 프로토콜 MARS
      • 더비 스타즈 Derby Stars
    • 프로그래밍
      • AHK 메뉴얼
      • AHK 레퍼런스
      • Delphi XE7
      • C
      • Python
      • Reversing
      • Archive
    • 일상
    • 영화
    • 낙서장
    • Deprecated
      • 로다 플레이어
      • 어의

인기 글

최근 댓글

전체 방문자
오늘
어제

티스토리

hELLO · Designed By 정상우.
예지력

W

[팁] 코드 최적화 Code Optimization
프로그래밍/AHK 메뉴얼

[팁] 코드 최적화 Code Optimization

2015. 10. 15. 05:00

 

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

 

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

 

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, % 이름 성별 거주지

 

Age = 20     ; Age 라는 변수에 숫자 20을 저장한다
MsgBox, % Age

 

 
'Age = 20' 이 보이시죠?
주석의 설명대로 Age 라는 변수에 숫자 20을 저장하는겁니다.

오토핫키에서 변수는 자료형(데이터의 타입) 을 명시할 필요가 없습니다.
굉장히 편리하죠 C언어는 변수마다 각각 지정해줘야 하는 번거로움이 있는데 말입니다.
 
한가지 중요한점. 변수명은 오토핫키의 명령어나 내장변수(A_index 등) 으로 설정하면 안됩니다.
따라서, 변수는 이렇게 지정하는거군요!

 

변수명 = 변수에 저장할 값
Height = 180   ; Height 라는 변수에 숫자 180을 저장
Gender = 남자   ; Gender 라는 변수에 '남자' 라는 문자열을 저장

 

변수1에 변수2의 값을 저장하고 싶다면 어떻게 코드를 작성해야 할까요.
'변수1 = 변수2' 로 하니 '변수1'에는 변수2 라는 문자열이 저장됩니다.
아까 % 표기를 했다는것을 기억하시나요? 여기서도 동일한 문법이 적용됩니다.

 

Age1 = 20                  ; Age1 라는 변수에 숫자 20을 저장
Age2 = %Age1%        ; Age2 라는 변수에 변수 Age1(숫자20)을 대입
Age3 = Age1             ; Age2 라는 변수에 Age1 이라는 문자 저장

 

위 변수의 표현식은 트레디셔널 이라고 부릅니다.
표현식엔 종류가 2가지 있는데요. 한가지가 지금 설명한 트레디셔널, 두번째는 익스프레션 입니다.

If 조건식과 앞으로 오토핫키를 깊이있게 사용할 생각이 있으시다면,
가능한 표현식은 익스프레션으로 사용하는것이 좋습니다.
이유는 If 조건식과 대부분의 '~식'들이 익스프레션을 사용하기 때문인데요

 
그러면 익스프레션을 또 배워야 하나? 머리아픈데..
아닙니다. 트레디셔널과 정말 비슷합니다 간단해요.

 

Age1 := 20             ;Age1 에 숫자 20을 저장
Age2 := Age1         ;Age2 에 변수 Age1 을 대입
Gender := "남자"   ; Gender라는 변수에 '남자' 문자열 저장

 

= 대신에 := 을 쓰고, 변수를 대입할 때 % % 표시를 하지않네요.
중요한점은 문자를 저장할때는 " " 따옴표처리를 해야한다는것입니다.

 

그러면 정리하겠습니다.
결국 (익스프레션) 변수는 이렇게 사용하는군요.

 

변수명 := 저장할 숫자
변수명 := "저장할 문자"
변수명 := 대입할 변수명

 

숫자변수끼리는 서로 값을 연산할수도 있습니다.
변수명 := 변수명1 + 변수명2       ; 변수명1 과 변수명2를 더한 값을 변수명에 저장
변수명 := 변수명1 - 변수명2       ; 뺀 값을 저장
변수명 := 변수명1 * 변수명2       ; 곱한 값을 저장
변수명 := 변수명1 / 변수명2       ; 나눈 값을 저장

 

문자변수끼리는 문자를 누적이 가능합니다.
Apple := "사과"              ; Apple 이라는 변수에 문자 사과 를 저장
Juice := "주스"              ; Juice 이라는 변수에 문자 주스 를 저장
Total := Apple . Juice      ; Total 이라는 변수에 변수 Apple과 변수 Juice 의 값을 누적
MsgBox % Total           ; 사과주스 라는 문자가 출력된다

 

 

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 압축을 품, 항상 덮어씌움

728x90
저작자표시 비영리 동일조건 (새창열림)

'프로그래밍 > AHK 메뉴얼' 카테고리의 다른 글

[팁] 코드의 속도, 성능을 높이는 한줄 팁 모음  (8) 2015.10.09
[라이브러리] Easyini - 네이티브 ini  (15) 2015.09.24
[파싱] 오토핫키 파싱과 정규식 정리  (29) 2015.03.14
[공개] 오토핫키 반응형 학습 어플리케이션  (33) 2015.02.22
[정보] 오토핫키 간이 에디터  (2) 2015.02.18
    '프로그래밍/AHK 메뉴얼' 카테고리의 다른 글
    • [팁] 코드의 속도, 성능을 높이는 한줄 팁 모음
    • [라이브러리] Easyini - 네이티브 ini
    • [파싱] 오토핫키 파싱과 정규식 정리
    • [공개] 오토핫키 반응형 학습 어플리케이션
    예지력
    예지력

    티스토리툴바