728x90
Ctrl-K, Ctrl-H : 바로가기 설정. ( 작업목록 창에서 확인가능 )
Ctrl-K,K : 북마크 설정 / 해제
Ctrl-K,L : 북마크 모두 해제
Ctrl-K,N : 북마크 다음으로 이동
Ctrl-K,P : 북마크 이전으로 이동
Ctrl-K,C : 선택한 블럭을 전부 코멘트
Ctrl-K,U : 선택한 블럭을 전부 언코멘트(코멘트 해제)
Ctrl-F3 : 현재 단어 찾기
  -> F3 : 다음 찾기

Ctrl-F7 : 현 파일만 컴파일
            : 현 프로젝트만 빌드
Ctrl-Shift-B : 전체 프로젝트 빌드
Ctrl-F5 : 프로그램 시작

Ctrl-alt-i : immediate window 실행 ( > of 파일명 : 파일 찾아서 열기) 

Ctrl-i : 일치하는 글자 연속적으로 찾기
Ctrl+i 를 누르면 하단에 자세히보면, "증분검색" 이라는 텍스트가 나온다.
그러면 그때 찾기 원하는 단어를 입력할때마다 일치하는 위치로 바로바로
이동한다. (좋은기능)
타이핑은 "증분검색" 이라는 텍스트옆에 커서는 없지만 입력이된다.
입력하는 문자를 수정하려면, backspace로, 그만 찾으려면 엔터.

줄넘버 보여주기 : 도구 > 옵션 > 텍스트편집기 > 모든언어 > 자동줄번호 선택하면 됨.

Ctrl+ - (대시문자), Ctrl+Shift+ -  :
현재 커서를 기억하는 Ctrl+F3(VS6에서), Ctrl+K,K(VS7에서) 와는 달리
사용자가 별도로 입력을 해주는건 없고, 단지 이전에 커서가 있었던곳으로
위 키를 누를 때마다 이동된다. (shift를 이용하면 역순)

Ctrl-F12 : 커서위치 내용의 선언으로 이동( 즉, 대략 헤더파일 프로토타입으로 이동)

F12 : 커서위치 내용의 정의로 이동( 즉, 대략 CPP파일 구현부로 이동)

Shift+Alt+F12 : 빠른기호찾기 ( 이거 찾기보다 좋더군요. 함수나 define등 아무거나에서 사용)

F12: 기호찾기. (s+a+f12 비교해볼것)

Ctrl-M, Ctrl-L : 소스파일의 함수헤더만 보이기 (구현부는 감추고) (토글 키)
Ctrl-M, Ctrl-M : 현재 커서가 위치한 함수를 접는다/편다. (토글 키)

#include "파일명" 에서 "파일명" 파일로 바로 직접이동
하고 싶을경우 -> Ctrl-Shift-G


<편집>---------------------------------------------------------------------------
Ctrl-F : 찾기 대화상자
Ctrl-H : 바꾸기 대화상자
Ctrl-Shift-F : 파일들에서 찾기 대화상자
Ctrl-Shift-H : 파일들에서 바꾸기 대화상자
Ctrl-G : 해당 줄로 가기 (별로 필요없음)
Ctrl-K,Ctrl-F : 선택된 영역 자동 인덴트 (VS6의 Alt-F8기능)
Ctrl-] :괄호({,}) 쌍 찾기 : 괄호 앞이나 뒤에서 눌러서 닫거나,
여는 괄호이동
Ctrl-Shift-Spacebar : 함수이름편집중 툴팁으로나오는 함수와매개변수설명이 안나올경우, 강제로 나오게

alt-LButton ->Drag : 원하는 영역의 블럭을 세로로 잡기

Ctrl+Shift+R (키보드 레코딩) : 
  가끔 연속된 연속기만으로는 부족한경우가 있다.
  이럴때, 몇번의 키동작으로 레코딩하여, 이것을 반복하고 싶은경우가있다.
  이때 Ctrl+Shift+R 을 누르고, 원하는 동작들을 수행후, 다시 Ctrl+Shift+R을
  눌러 종료한다.  이 중간동작을 원하는 위치에서 반복하고 싶다면 
  Ctrl+Shift+P 를 누른다.
 
Ctrl+Shift+V (히스토리 붙이기) :
  Ctrl + V와는 달리 클립보드에 있는 복사된내용을 돌아가면서 붙여준다.
  따로 복사를 해주거나 할 필요는 없다. 그냥 Ctrl+C로 계속 원하는것을
  복사하면 된다.

Ctrl-Z : 이전으로 되돌리기

Ctrl-Shift-Z : 되돌렸다, 다시 복구하기

 

 

<디버그/빌드>-------------------------------------------------------------------------
F5 : 디버그 시작
F9 :디버그 브렉포인트 설정
Ctrl-F9 : 현위치 설정된 브렉포인트 해제
Ctrl-Shift-F9 : 모든 브렉포인트 해
Shift-F5 : 디버그 빠져나오기
Ctrl-F10 : 커서가 있는곳까지 실행
Shift-F11 : 현 함수를 빠져나감.

Shift+Ctrl+B :  전체 빌드(프로젝트가 여러개있을경우 모두 빌드)
Alt+B, C : 해당 프로젝트만 정리.
Alt+B, U : 해당 프로젝트만 빌드.


 

<창관련>-------------------------------------------------------------------------

Shift+Alt+Enter : 전체 창 (토글 됨)
F4 : 속성창 보여준다.
Ctrl+Alt+X : 리소스에디터 툴박스창
Ctrl+Alt+K : 작업목록 창.


 

비주얼 스튜디오를 쓰다가 단축키를 잊어먹거나 까먹어서 잘 못쓰는 경우가 많아 정리를 해보았다. 

단축키설명
Ctrl + TabEdit하고 있는 Child Window 간의 이동
Ctrl + F4현재 Edit하고 있는 Child Window를 닫기
Ctrl + I문자열 입력 점진적으로 문자열 찾기 (Incremental Search)
Ctrl + F3현재 커서에 있는 문자열 찾기 fowared (블록 지정 안 해도 됨)
Shift + F3현재 커서에 있는 문자열 찾기 backward
F3찾은 문자열에 대한 다음 문자열로 이동 (Next Search)
Ctrl + H문자열 찾아 바꾸기 (Replace)
Ctrl + Left/Right Arrow단어 단위로 이동
Ctrl + Delete 또는 Backspace단어 단위로 삭제
Ctrl + F2현재 라인에 북마크 지정/해제
F2지정된 다음 북마크로 이동
Ctrl + Shift + F2지정된 모든 북마크를 해제
F9현재 라인에 Breakpoint를 지정/해제
Ctrl + Shift + F9현재 Edit하고 있는 소스파일에 지정된 모든 Breakpoint 해제
Ctrl + ] 또는 E'{'괄호의 짝을 찾아줌 ('{'에 커서를 놓고 눌러야 함}
Ctrl + J, K#ifdef 와 #endif의 짝을 찾아줌
Ctrl + L한 라인을 클립보드로 잘라내기 (Cut)
Ctrl + Shift + L한 라인을 삭제
Alt + Mouse블록 설정 세로로 블록 설정하기 (마우스로)
Ctrl + Shift + F8세로로 블록 설정하기 (키보드로), 취소할 때는 Esc키를 눌러야 함
블록 설정 -> Tab선택된 블록의 문자열을 일괄적으로 들여쓰기(Tab) 적용
블록 설정 -> Shift + Tab선택된 블록의 문자열을 일괄적으로 내어쓰기 적용
Alt + F8 -> Tab 또는 Shift + Tab들여쓰기 자동 조정 (Tab:들여쓰기, Shift + Tab : 내어쓰기)
Ctrl + T현재 커서에 있는 변수/함수에 대한 Type이 Tooltip 힌트 창에 나타남
Ctrl + Alt + T멤버 변수/함수 목록에 대한 팝업 창이 나타남
Ctrl + Shift + T공백/콤마/파이프/괄호 등을 기준으로 좌우 문자열을 Swap시킴
Ctrl + Shift + 8문단기호 표시/감추기 : Tab은 ^, Space는 .으로 표시
Ctrl + D툴바의 찾기 Editbox로 이동
Ctrl + Up/Down Arrow커서는 고정시키고 화면만 스크롤 시키기


디버깅에 관련된 단축키 하나 더. 
변수이름을 적어 놓고 브래이크 포인터의 위치 여부와 관계 없이 변수의 내용을 

추적하는 기능이 Watch Window에 들어 있다.


디버그 모드에서 추가하고픈 변수나 등등 앞에 커서를 위치 시킨후 Shift + F9를 누르면 그냥 바로 추가된다.



출처 : http://cafe356.daum.net/_c21_/bbs_search_read?grpid=1D1MR&fldid=1JNn&datanum=7&openArticle=true&docid=1D1MR1JNn720080225180951

728x90
728x90

Windows에서 개발한 코드이고, 간단하게 입력받아서 출력하는 코드이다.




#include <iostream>

#include <windows.h>


#pragma comment(lib, "winmm.lib")


int main()

{

    JOYINFOEX joystickInfo;


    ZeroMemory(&joystickInfo, sizeof(joystickInfo));

    joystickInfo.dwSize = sizeof(joystickInfo);

    joystickInfo.dwFlags = JOY_RETURNALL;//JOY_RETURNBUTTONS | JOY_RETURNX | JOY_RETURNY;


    while (true)

    {

        joyGetPosEx(JOYSTICKID1, &joystickInfo);


        char dbgMsg[MAX_PATH] = { 0, };

        sprintf(dbgMsg, "X : %d, Y : %d, Z : %d \n", joystickInfo.dwXpos, joystickInfo.dwYpos, joystickInfo.dwZpos);

  OutputDebugStringA(dbgMsg);


        if (joystickInfo.dwButtons & JOY_BUTTON1)

            OutputDebugStringA("JoyStick_Button_1 \n");


        Sleep(1);

    }

}

728x90
728x90

Visual Studio 2017로 넘어오면서 확장 플러그인을 이것저것 검색해봤는데


유용한 것도 있고 재밌는 것도 있었다.



- Power Mode (https://marketplace.visualstudio.com/items?itemName=LiamMorrow.PowerMode)

이 플러그인은 타이핑을 할때 이펙트가 생기게 하는 재밌는 플러그인이었다.



- VSColorOutput (https://www.visualstudiogallery.msdn.microsoft.com/f4d9c2b5-d6d7-4543-a7a5-2d7ebabc2496)

이 플러그인은 출력창의 메시지에 컬러를 줘서 좀 더 보기 쉽게 만들어준다.



- Indent Guides (https://marketplace.visualstudio.com/items?itemName=SteveDowerMSFT.IndentGuides)

이 플러그인은 괄호의 범위를 보기 쉽게 표시해준다.



- Code Alignment (http://www.codealignment.com/ForVisualStudio.html)

이 플러그인은 코드를 정렬해준다.



SpellChecker (https://marketplace.visualstudio.com/items?itemName=EWoodruff.VisualStudioSpellCheckerVS2017andLater)

이 플러그인은 단어의 스펠링이 틀린 부분을 찾아준다.




728x90
728x90

어떤 객체에 대한 접근을 제어하기 위한 용도로 대리인이나 대변인에 해당하는 개체를 제공하는 패턴을 프록시 패턴이라고 한다.


사용하게 되는 곳은 기존 인터페이스의 형태를 변경하지 않고 원형 클래스의 행동을 변경할 때 유용하게 사용된다. 특히 원형 클래스가 서드 파티 라이브러리인 경우 직접적인 변경이 어렵기 때문에 프록시 패턴이 더욱 유용하다.


프록시 패턴의 UML다이어그램은 다음과 같이 그려질 것이다.


아마도 기본적인 Proxy Pattern을 적용하면 이런 형태가 될 것이다.


다른 방법으로 Proxy Pattern을 적용하려면 프록시와 원형 API가 함께 사용하는 추상 인터페이스를 통해 이런 접근 방식을 늘리는 것인데, 이 경우 비록 원형 API를 변경할 상황이 발생한다 해도 두 API를 계속해서 동기화 시킬 수 있다.




이 패턴을 사용했을 때의 장점은 다음과 같다.

 - 원형 객체의 지연된 인스턴스 구현 : 이 경우 원형 객체는 실제로 메서드 호출이 발생하기 전까지 인스턴스화되지 않는다. 

원형 객체의 인스턴스가 많은 메모리를 차지하는 경우라면 지연된 인스턴스 생성이 절대적으로 필요하다.


 - 원경 객체의 접근 제어 구현 : 예를 들어, 올바른 권한을 가진 사용자만이 원형 객체의 특정 메서드를 호출할 수 있는 기능을 구현하기  위해 원형 객체와 프록시 사이에 권한 계층을 두고 접근을 제어한다.


 - 디버그 또는 드라이런 모드 지원 : 프록시 내에서 원형 객체를 호출하는 모든 메서드의 실행 코드를 디버깅하거나, 예를 들어 객체의 상태를 더 이상 저장하지 않도록 행동을 변경하는 것처럼 프록시 내에서 원형 객체의 특정 메서드에 어떤 값을 전달하지 않는 드라이 런 테스트를 진행할 수 있다.


 - 스레드에 안전한 원형 객체 지원 : 뮤텍스 락을 추가시켜 메서드가 스레드에 안전하도록 만들 수 있다.


 - 자원 공유 지원 : 같은 원형 객체를 사용하는 여러 개의 프록시 객체를 사용할 수 있다. 여러 개의 객체가 동일한 데이터를 공유하여 메모리 공간을 최소화 시킨다.


 - 원형 객체의 향후 변경으로부터 보호 : 현재 사용 중인 라이브러리가 향 후 변경될 것을 예상하고 프록시를 생성해서 현재 라이브러리의 동작을 그대로 옮겨 패턴을 구현한다. 그리고 예상대로 라이브러리가 변경이 되면 프록시 객체를 통해 기존의 인터페이스는 그대로 유지하고 새로운 라이브러리의 메서드를 사용하기 위한 구현 부분을 변경하며, 이때는 자연스럽게 어댑터 패턴을 사용한다.

728x90
728x90

이번에 "게임 엔진 아키텍처" 라는 책을 읽으면서 좋은 내용이 있어서 정리해 놓는다.


나의 경우 inline 함수를 최적화를 생각하며 자주 사용하고 있다.

하지만 자세한 내용은 몰랐던 것 같다. ㅎㅎ


inline 함수가 다른 cpp 에서도 사용하기 위해서는 반드시 .h에 정의되어 있어야만 한다.

왜냐하면, 컴파일러가 inline 함수를 처리하려면 컴파일러가 함수의 정의 부분을 볼 수 있어야하는데, .cpp에 있다면 볼 수가 컴파일때에는 볼 수가 없기 때문이다.


// foo.h

inline int max(int a, int b)

{

return (a > b) ? a : b;

}


위의 경우 아주 올바른 inline 함수이다. 왜냐하면 컴파일러가 볼 수있다.


// 이 함수는 inline으로 정의하였지만, inline으로 처리되지 않는다.

// 왜냐하면 컴파일러가 함수의 구현을 볼 수 없기 때문이다.

// foo.h 

inline int max(int a, int b);


// foo.cpp

inline int max(int a, int b)

{

return (a > b) ? a : b;

}



이 내용은 전혀 몰랐던 것이기 때문에 공유한다.


728x90
728x90

C++ 에서는 명시적으로 클래스의 상속을 막는 방법이 없기 때문에 final 이라는 키워드가 추가되었다.


final 키워드

이 키워드는 클래스에 사용하면 클래스를 상속할 수 없고, 함수에 사용하면 함수를 상속할 수 없다.


아래 사진은 클래스에 final을 붙였을 때 이다.


아래 사진은 함수에 final을 붙였을 때 이다.



override 키워드

이 키워드는 클래스 함수의 오버라이드를 막을 때 사용된다.


아래 사진은 함수에 override를 붙였을 때 이다.



728x90
728x90

서로 분할 작업을 하면서 모듈을 개발하다보면, 어떤 함수는 추가가 되고 어떤 함수는 없어지고 할 것이다.


이럴 때, 내가 만든 모듈에서 없어진 함수가 있다면 그것을 사용하는 개발자에게 경고를 띄워주고 싶을 것이다.




deprecated (함수 사용 경고) 이 키워드를 사용하면 된다.



사용법은 아래와 같다.








출처 : https://msdn.microsoft.com/ko-kr/library/044swk7y.aspx

728x90
728x90

리팩토링을 어떨 때 시작하고 어떨 때 그만둬야 할지 판단을 해야하는데, 그것은 사실 상 경험을 많이 해봐야 하는 부분일 것이다.



그냥 가볍게 보통 이럴 때 리팩토링을 어떻게 하고, 이럴 때에는 이렇게 하는게 좋구나... 이 정도만 생각하도록 하자.




1. 중복 코드

리팩토링을 꼭 해야 하는 상황은 중복 코드가 여러 곳에 있을 때이다. 이런 중복 코드는 하나로 통일을 해서 프로그램을 개선해야 한다. 


2. 장황한 메서드

최적의 상태로 장수하는 객체 프로그램을 보면 공통적으로 메서드의 길이가 짧다. 메서드의 길이가 길수록 이해하기 어렵다는 점은 많은 프로그래머들은 알고 있다. 이를 위해서 메서드를 과감하게 쪼개야 한다. 

메서드명은 기능 수행 방식이 아니라 목적(기능 자체)을 나타내는 이름으로 정해야 한다.


3. 방대한 클래스

기능이 지나치게 많은 클래스에는 보통 엄청난 수의 인스턴스 변수가 들어있다. 클래스에 인스턴스 변수가 많으면 중복 코드가 존재하기 마련이다. 클래스들을 추출하면 수많은 인스턴스 변수를 하나로 묶을 수 있다. 서로 연관된 변수를 골라서 클래스로 빼내면 된다. 


4. 과다한 매개변수

매개변수가 간결하다는 것은 장점이다. 매개변수가 길면 서로 일관성이 없어지거나 사용이 불편해지고, 더 많은 데이터가 필요해질 때마다 계속 수정해야 하기 때문에 그 매개변수들을 이해하기 힘들다. 웬만하면 객체를 넘기면 많은 문제가 해결 된다.


5. switch 문

객체지향 코드의 확연한 특징 중 하나는 switch ~ case 문이 비교적 적게 사용된다는 점이다. 

switch 문의 단점은 반드시 중복이 생긴다는 점이다. 같은 switch 문이 프로그램 곳곳에 있을 때가 많다. 그렇기 때문에 switch 문에 새 코드를 추가하려면 여기저기에 존재하는 switch 문을 전부 찾아서 수정해야 한다. 

이 문제를 해결하려면 객체지향 개념 중 하나인 다형성, 즉 재정의를 이용하는 것이다. 대부분의 switch 문은 고민할 필요없이 재정의로 바꿔야 한다. 


6. 인터페이스가 다른 대용 클래스

기능은 같은데 시그너처가 다른 메서드에는 메서드명 변경을 해야 한다. 클래스에 여전히 충분한 기능이 구현되어 있지 않기 때문에 대체로 이 방법만으로는 충분하지 않다. 프로토콜이 같아질 때까지 메서드 이동을 해서 기능을 해당 클래스로 옮겨야 한다. 단 코드를 너무 여러번 옮겨야 한다면 상위클래스 추출을 하면 된다.


7. 불필요한 주석

주석은 많이 사용할 수록 좋다. 하지만, 여기서부턴 이 기능, 여기서부턴 저 기능이라는 주석이 있다면 그것은 다른 메서드로 빼는 것이 좋다. 그 주석들은 불필요하다.


8. 변수명 수정

굳이 변수명을 수정하는 것이 왜 리팩토링이냐고 생각을 할 수도 있다. 하지만, 좋은 코드는 그것이 무슨 기능을 하는지 분명히 들어나야하는데, 코드의 기능을 분명히 드러내는 열쇠가 바로 직관적인 변수명이다.



9. 임시 변수 없애기

임시 변수로 인해 문제가 생길 수 있다. 임시 변수는 자체 루틴 안에서만 효력이 있다 보니, 점점 더 많은 임시변수를 사용하게 되어 코드가 복잡해지기 쉽다. 그렇기 때문에 임시 변수는 질의 메서드(Query Method)로 변경해주는 것이 좋다.



10. switch ~ case 문의 조건문 확인

만약 다른 객체의 속성을 switch 문의 인자로 사용하고 있다면 나쁜 방법이다. switch 문의 인자로는 타 객체 데이터를 사용하지 말고 자신의 데이터를 사용해야 한다.




728x90

'Basic Programming > Refactoring' 카테고리의 다른 글

Refactoring - 리팩토링 관련 문제들  (0) 2017.09.14
Refactoring - 리팩토링 이란 ?  (0) 2017.09.14

+ Recent posts