대메뉴 바로가기 본문 바로가기

데이터 기술 자료

데이터 기술 자료 상세보기
제목 비주얼 스튜디오 2015 활용 가이드 : 비주얼 C++와 함께하는 코드 생산성 향상 팁 ①
등록일 조회수 6125
첨부파일  

비주얼 스튜디오 2015 활용 가이드

비주얼 C++와 함께하는 코드 생산성 향상 팁 ①



마이크로소프트(이하 MS)는 빌드 2015에서 새로운 윈도우와 비주얼 스튜디오를 소개했다. 비주얼 스튜디오에 포함된 비주얼 C++에는 MS에 대한 고정관념을 모두 날려버릴 만큼 새롭고 다양한 기능들이 포함됐다. C++ 개발자의 코드 생산성을 향상시킬 수 있는 환경과 기능 업데이트 또한 다수 포함됐다. 이에 프로젝트를 진행하는데 있어 생산성과 효율성 향상을 기대할 수 있는 다양한 기능과 팁들을 알아보는 시간을 마련했다.



윈도우7의 첫 모습이 당황스러웠던 이유 중 하나는 달라진 작업표시줄 때문이었다. 윈도우 비스타까지의 태스크밴드 영역에 현재 실행되고 있는 애플리케이션 윈도우가 작은 아이콘과 문구로 표시됐는데, 윈도우7부터는 이 보다 큰 아이콘으로 대체됐다. 이는 마치 애플리케이션이 실행되고 있는 것으로 착각케 만들었다.



이러한 변화가 적응될 것 같지 않았지만, 윈도우10이 출시되는 지금에 이르러서는 가독성과 편의성이 더 나은 윈도우7 형태의 UI를 더 선호하게 됐다. 이러한 UI와 기능의 변화가 급작스럽게 이뤄진 것 같겠지만 MS는 통계에 기초한 점진적인 방법을 통해 사용자 선호를 반영한 변화를 계속해 왔다. MS 측의 설명에 따르면 작업표시줄을 사용하는 방법과 옵션 및 사용 패턴을 분석한 결과, 사용자들은 작업 표시줄에서 작업 전환을 쉽게 하고, 자주 이용되는 항목이나 작업도 보다 빨리 실행할 수 있기를 바랬다. 또한 작업 중인 프로그램의 진행사항을 한눈에 알 수 있으면서도 보다 세련되고 깔끔한 느낌을 주길 원했다.





사용자들이 동시에 열어 두는 윈도우의 개수는 1~14개 사이가 대부분이었다. 6~9개 창을 열어 두는 이들이 가장 많았다. MS는 이런 자료를 토대로 아이콘의 크기를 조절하고 오버레이 아이콘이나 태스크 바 버튼 프로그래스 등을 반영했다. 그것이 바로 윈도우7의 태스크바 UI다. 진정한 의미의 사용자 경험(UX, User Experience)을 제품에 반영한 것이다.





이처럼 MS는 사용자 피드백을 적극 받아들여 제품에 반영해 왔다. 비주얼 스튜디오 2015 또한 대문자로 구성됐던 메뉴가 일반적인 대소문자 메뉴로 변경되고, 헤더파일 생성 시 ‘#pragma once’ 구문을 자동으로 넣어주는 사소한 개선이 이루어졌다. 이밖에도 리팩토링 기능, 디버거의 성능 향상 등도 모두 전 세계 C++ 개발자의 다양한 의견을 경청하고 개발 트렌드를 면밀히 살펴본 후 바뀐 변화들이다. 이를 통해 비주얼 스튜디오 2015는 더 즐겁고 효율적인 개발 환경이라는 목표에 한걸음 더 다가갔다.





바로가기(Quick Actions)를 통한 리펙토링 기능

비주얼 스튜디오 2015에서는 노란 전구(LightBulb) 모양의 길잡이 기능이 추가됐다. 코딩을 하다 보면 붉은색 밑줄이나 녹색 밑줄 등으로 개발툴이 작성하고 있는 코드에 가이드라인을 주곤 한다. 노란 전구도 이와 비슷하다. 개발자가 코딩할 때 무언가 도움을 줄 수 있거나 안내할 부분이 있을 경우 살며시 나타나 코딩에 실질적인 도움을 준다. 닷넷 언어의 경우 코딩 방법을 제안하거나 코드 분석에 대한 결과 값을 보여준다. 또는 입력한 인터페이스에 대한 코딩 패턴을 제안하기도 한다.

C++의 경우 닷넷 계열의 언어 환경처럼 많은 것을 지원해 주지는 않지만 노란 전구를 통해 개발자들이 오랫동안 기다렸던 리팩토링을 수행할 수 있게 됐다. 노란 전구를 호출하는 기능의 한글화된 이름은 ‘바로가기(Quick Actions)’다. 단축키는 Ctrl + '.'다. 바로가기를 통해 적용할 키워드나 적용할 범위를 블록 설정한 후 바로가기 기능을 호출하면 해당 범위에 적용할 리팩토링 기능을 선택할 수 있는 노란 전구 아이콘이 나타난다.


리팩토링 기능이 수행되면 출력 창(Output Windows)에서 해당 리팩토링 결과를 확인할 수 있다. 뿐만 아니라 출력창의 로그 항목을 더블클릭하면 해당 리팩토링 기능이 수행된 코드 에디터로 커서가 이동한다. 리팩토링 수행 후 추가적인 코드 작업을 할 때 유용한 기능 중 하나다.


노란 전구를 통해 수행할 수 있는 기능은 현재 리팩토링으로 한정돼 있지만 차기 버전의 비주얼 C++에서는 닷넷 계열 언어에서의 노란 전구처럼 다양한 기능이 추가되기를 기대해 본다.



기호 이름 변경(Rename Symbol)

‘기호 이름 변경’ 기능은 리팩토링 기능 중 빈번히 쓰이는 기능 중 하나다. 리팩토링 기능이 없는 에디터에서 기호 이름을 변경하기 위해서는 찾기 및 바꾸기(Find and Replace) 기능을 써야 했다. 그 동안은 찾기로 소스 코드 내의 문자열을 검색한 다음 변경할 이름을 바꾸기로 일괄 변경하거나 직접 눈으로 하나하나 확인하면서 변경해야 했다. 이 경우 개발자가 미처 생각지 못한 부분의 소스 코드까지 변경될 수 있어 실수할 여지가 많았다.


비주얼 스튜디오 2013의 비주얼 C++에서 기호 이름 변경을 사용하려면 비주얼 어시스트와 같은 비주얼 스튜디오 확장을 통해서만 가능했다. 그런데 비주얼 스튜디오 2015에서는 기본 기능으로 기호 이름 변경 기능이 포함됐다. 비주얼 스튜디오 2013에서 기호 이름 변경을 이용하고 싶다면, 다음 링크에서 무료로 다운로드할 수 있다.

https://visualstudiogallery.msdn.microsoft.com/164904b2-3b47-417f-9b6b-fdd35757d194

기호 이름 변경이 좀 더 정확하게 수행되려면 소스 코드 편집기가 소스 코드상의 심볼. 즉 기호를 분석할 수 있어야 한다. 비주얼 C++의 리팩토링 기능은 비주얼 스튜디오가 가지고 있는 심볼 정보를 이용해 정확하게 기호들의 이름을 변경한다. 기호 이름 변경을 실행하기 위해서는 먼저 변경할 심볼 위에서 컨텍스트 메뉴를 열고 [이름 바꾸기(Rename)] 메뉴를 선택해야 한다.


이름 바꾸기 창에서는 바꿀 이름과 함께 변경을 적용할 검색 범위(Search Scope)를 선택한다. [참조가 모두 확인될 경우 변경 내용 미리 보기 건너뛰기(Skip preview changes if reference are all confirmed)]를 체크하면 기본 설정 값으로 기호 이름 변경 기능이 수행된다. 만약 체크하지 않고 미리보기(Preview)를 클릭할 경우 [변경 내용 미리 보기?이름 바꾸기(Preview Changes?Rename)] 창에서 변경할 내용을 확인할 수 있다.


변경 내용 미리 보기 창에서는 심볼과 주석, 그리고 문자열로 분류해 변경되는 내용을 표시해줄 뿐 아니라 소스 코드의 미리 보기 그림에서 적용 후의 코드 모습까지 확인할 수 있다.




순수 가상 함수 구현(Implement Pure Virtuals)

애플리케이션 디자인과 디자인 패턴의 설계 원칙 중 가장 강조되는 것 중 하나는 ‘인터페이스를 통해 프로그래밍하라(Program to an interface, not an implementation)’는 것이다. 그러나 C++언어에는 인터페이스를 정의하는 키워드가 없기 때문에 코드를 정의하지 않는 형태의 순수 가상함수를 이용해 인터페이스를 구현해야 한다.


컴파일러는 구현부를 찾을 수 없는 순수 가상 함수를 컴파일할 수 없다. 따라서 정의부를 구현해야 하는데, 비주얼 스튜디오 2015에 추가된 순수 가상 함수 구현 기능을 이용하면 좀 더 쉽게 손수 가상 함수 정의부를 추가할 수 있다.



<리스트 1> 순수 가상 함수 정의부 테스트 예 // foo.h class IFoo { virtual void foo1() = 0; virtual int foo2(int a) = 0; virtual double foo3(int a, double b) { return 0; } }; struct IBar { virtual void bar1() {} virtual bool bar2(int a, double b) = 0; virtual double bar3(int a, double b) = 0; }; class MyClass : public IFoo, public IBar { }; // foo.cpp #include "foo.h“ int main() { MyClass a; }



순수 가상 함수 구현 기능은 가상 함수를 상속받은 클래스를 정의한 곳의 클래스 명에서 컨텍스트 메뉴의 바로가기를 선택하고, 노란 전구 클래스의 모든 순수 가상 구현(Implement all Pure Virtuals for class ‘Class’)를 선택하면 실행할 수 있다.


순수 가상 함수 구현 기능을 수행하면 소스 코드의 정의부와 구현부에 순수 가상 함수로 임의의 스켈렉톤 코드를 만들어 준다. 정의부가 없는 순수 가상 함수들을 찾아 헤더파일에 함수를, CPP 파일을 찾아 임의의 구현 부를 만들어 준다. 만일 CPP 파일이 없으면 파일을 만든 후 스캘렉톤 코드를 추가한다. 비주얼 스튜디오가 생성한 코드는 수정할 수 있도록 정의 피킹(Peek Definition) 창이 열린다. 간단한 비즈니스 로직은 창 전환 없이 바로 구현할 수 있다.


클래스 내부의 정의 부분에는 어떤 인터페이스가 구현됐는지 주석을 통해 알려준다. 구현부에 생성된 코드는 일반적으로 스켈렉톤 코드에서 사용하는 0과 false를 반환 값으로 부여하면 바로 컴파일할 수 있다. 만일 특정 인터페이스 코드에만 순수 가상 함수 구현 기능을 적용하고 싶다면 다중 상속을 받은 클래스에 기술된 인터페이스 중 구현하고 싶은 인터페이스명에서 바로가기를 수행하면 된다.




선언 또는 정의 만들기(Create Declaration of Definition)

선언 또는 정의 만들기 기능은 순수 가상 함수 구현 기능과 유사하다. 함수나 클래스 내의 메소드 선언을 헤더파일에, 혹은 정의부를 CPP 파일에 만들어 줄 수 있다.


헤더파일에 일반 함수를 선언하고 함수 명에서 바로가기 기능을 실행한 뒤 노란 전구에서 [선언/정의 만들기(Create Declaration/Definition)]를 선택하면 CPP 파일에 스캘렉톤 코드가 만들어진다. 피킹 창에서는 추가된 내용을 편집할 수도 있다.


헤더파일에 함수 선언부가 있지만 구현부가 없는 경우 헤더파일의 함수 명에 커서를 가져다 대면 구현부가 없다는 메시지와 함께 바로가기 아이콘이 나온다. 이 메뉴를 통해 CPP 파일에 구현부를 만들거나 클립보드에 내용을 복사할 수 있다.



비주얼 스튜디오 2015에서 코딩하다 보면 함수나 클래스의 메소드에 녹색 밑줄이 나타날 때가 있다. 붉은색 밑줄의 경우 문법이 잘못되거나 문제가 있다는 의미인 반면, 녹색 밑줄은 노란 전구처럼 도움을 주는 기능을 통해 스켈랙톤 코드 작성과 같은 기능을 사용할 수 있음을 뜻한다.



이동 함수 정의(Move Function Definition)

C++ 소스??된 인라인 형태 또는 헤더파일의 구현 부분을 별도의 CPP 파일로 분리하는 두 가지 방식으로 코드를 작성할 수 있다. 일반적으로 개발자들이 함수를 처음 구현할 때는 헤더파일에 함수를 인라인 형태로 구현한다. 함수를 구현하면서 반환값 타입이나 인자 등이 변경 및 추가될 수 있고, 함수 명을 변경하는 일도 더러 있기 때문이다.

이렇게 함수의 첫 버전을 만든 후 비즈니스 로직에 반영할 때는 인라인 형태로 만들어진 함수의 구현 부분을 CPP 파일로 옮겨야 한다. 애플리케이션의 소스 코드를 프로젝트나 솔루션 형태로 구성할 경우 헤더파일에 구현체가 있으면 링크 과정에서 문제가 발생할 수 있기 때문이다. 이 과정은 개발자에게 복사, 붙여넣기가 반복되는 지루한 작업일 뿐이다.



<리스트 2> 이동 함수 정의 기능을 위한 코드 예제 // foo.h 의 내용 int foo(int a, int b) { return a + b; }



리팩토링 중 이동 함수 정의 기능을 이용하면 비주얼 스튜디오에서 헤더파일과 소스 파일간의 코드 이동을 쉽고 간편하게 할 수 있다. 먼저 헤더파일에 테스트를 위한 코드를 작성한다. 다음 코드 에디터상의 헤더파일의 함수명 위에서 바로가기를 클릭한 다음 [정의 위치 이동(Move Definition Location)]을 선택한다.


정의 위치 이동을 선택하면 이동 함수 정의 기능이 수행돼 헤더파일과 같은 이름의 CPP 파일로 함수의 정의부가 이동된다.



<리스트 3> 이동 함수 정의 기능으로 만들어진 코드의 예 // foo.h int foo(int a, int b); // foo.cpp int foo(int a, int b) { return a + b; }



만일 헤더파일과 같은 이름의 CPP 파일이 없는 경우 CPP 파일이 생성되고 프로젝트에 포함된 후에서야 이동 함수 정의 기능이 수행된다. 이동 함수 정의 기능이 수행된 다음 정의 피킹 창을 통해 CPP 파일로 윈도우를 전환하지 않아도 비즈니스 로직을 수정하거나 코딩 컨벤션을 적용할 수 있다.


헤더파일에서 CPP 파일로 또는 CPP 파일에서 헤더파일로도 이동 함수 정의 기능을 수행할 수 있다.



<리스트 3> CPP 파일에서 헤더파일로 이동 함수 정의 기능 수행 테스트 코드의 예 // foo.h int foo(int a, int b); // foo.cpp int foo(int a, int b) { return a + b; } int foo(int a, int b, int c) { return a + b + c; }



CPP 파일에서 헤더파일로 이동하고 싶은 함수의 함수명에서 바로가기를 통해 정의 위치 이동을 선택하면 헤더파일로 인라인 함수화돼 이동된다. 만일 CPP 파일과 같은 이름의 헤더파일이 없다면 헤더파일에서 CPP 파일로의 정의 위치 이동한 것처럼 파일이 생성된 후 구현부가 이동된다.


만일 2개 이상의 함수를 정의 위치 이동할 경우 이동할 함수들을 블록 설정한 후 단일 함수와 마찬가지로 바로가기를 통해 구현사항을 이동할 수 있다.



원시 문자열 리터럴로 변환(Convert to Raw String Literal)

원시 문자열 리터럴을 사용하면 이스케이프 문자가 생략돼 코드 상에서 문자열을 쉽게 파악할 수 있다.



<리스트 4> C++ 문자열과 원시 문자열 리터럴의 비교 std::string data1 = "< HTML> " "< BODY LINK="#0000ff" BGCOLOR="#ffffff"> " "C:\WORK\TEST.H " "< /BODY>"; std::string data2 = R"( < HTML> < BODY LINK = "#0000ff" BGCOLOR = "#ffffff"> C:WORKTEST.H < /BODY> )";



원시 문자열 리터럴을 사용하지 않는다면 html 코드를 복사하거나, 윈도우 탐색기의 파일 경로를 복사해 소스 코드에 붙여 넣은 후 C++ 문자열이 허용하지 않는 문자들에 대해서 이스케이프 문자로 바꾸는 작업을 해야 한다. 비주얼 스튜디오 2013 출시와 함께 업데이트된 원시 문자열 리터럴은 다른 언어나 데이터에서 문자열을 그대로 복사만 하면 되므로 소스 코드상에서 사용할 때 매우 유용하다.

기존에 있었던 C++ 스타일의 문자열을 가독성을 높이거나 문자열 길이를 비교하기 위해 원시 문자열 리터럴로 변환해야 할 때가 있다. 원시 문자열 리터럴로 변환 기능은 , , ', “, ?, \ 등의 이스케이프 시퀀스가 포함된 문자열을 원시 문자열 리터럴로 변환해주는 리팩토링 기능이다. 노란 전구를 이용하면 손쉽게 C++ 스타일의 문자열을 원시 문자열 리터럴로 변환할 수 있다.

문자열에서 바로가기 기능으로 노란 전구를 이용해 [원시 문자열 리터럴로 변환(Convert to Raw String Literal)]을 선택한다.



<리스트 5> 이스케이프 시퀀스가 포함된 문자열의 예 std::string s = " Some reasons this string is hard to read: 1. It would go off the screen in your editor 2. It has sooooo many escape sequences. They should make a type for this called "long" string, har har har. Have fun parsing this! (maybe?) ";




몇 번의 클릭만으로 원시 문자열 리터럴로 변환할 수 있을 것이다. 원시 문자열 리터럴로의 변환 기능은 모든 이스케이프 문자를 지원하지 않음에 주의하자.



<리스트 6> 원시 문자열 리터럴로 변환된 예 std::string s = R"( Some reasons this string is hard to read: 1. It would go off the screen in your editor 2. It has sooooo many escape sequences. They should make a type for this called "long" string, har har har. Have fun parsing this! (maybe?) )";



원시 문자열 리터럴로 변환된 문자열은 다시 이스케이프 문자가 포함된 문자열로 변환할 수 없다. 다만 원시 문자열 리터럴로 변환한 작업이 후회된다면 컨트롤 키와 Z키를 함께 눌러 원래대로 되돌려야 한다.



터치 모니터에 대한 기능 강화

일반적으로 스마트폰과 같은 터치 기기에서 콘텐츠를 손가락으로 위로 밀거나 아래로 당기면 콘텐츠가 스크롤된다. 만약 비주얼 스튜디오 2013에서 이러한 동작을 하면 소스 코드의 드래그 영역이 블록 설정이 된다. 물론 우측의 스크롤바를 이용해 소스 코드를 드래그 할 수 있지만, 스크롤바를 손가락으로 짚기에는 너무 얇아 사용이 어렵다. 그렇기에 비주얼 스튜디오에서는 키보드와 마우스가 필수일 수밖에 없다. 터치 모니터가 있더라도 대부분의 상황에서 키보드나 마우스를 이용하게 되므로 터치할 일이 거의 없다. 비주얼 스튜디오 또한 터치에 대한 지원이 거의 없었다.

비주얼 스튜디오 2015에서는 터치를 적극 지원하기 시작했다. 드래그하거나 두 손가락을 이용해 화면을 확대하거나 축소하는 등의 작업이 가능해졌다. 터치 디바이스에서 드래그는 코드 개발보다는 코드 조회 시 더 유용하다. 사실 윈도우7부터 OS 차원에서 터치 지원이 강화되기 시작했었다. 이로 인해 윈도우7은 이전 세대의 OS보다 윈도우 탐색기 간격이 더 넓게 구성돼 있었다.



터치 모니터를 사용해 보면 비주얼 스튜디오 2015의 터치를 위한 UI 부분이 눈에 띄게 이전 버전보다 수월한 것을 느낄 수 있을 것이다. 예컨대 비주얼 C++의 라인 번호 영역과 소스 코드 영역 사이를 마우스로 클릭 하거나 터치하면 해당 문장 전체가 블록 설정된다. 이는 이전 버전의 비주얼 스튜디오와 2015 버전의 기능이 같지만, 비주얼 스튜디오 2013의 경우 간격이 조금 더 넓어서 잘못 터치할 확률이 더 적어졌다.



생산성 향상을 위한 비주얼 스튜디오 2015의 기능

비주얼 C++와 함께하는 코드 생산성 향상 팁 그 첫 번째 시간인 이 글에서는 비주얼 스튜디오 2015에 추가된 리팩토링 기능에 대해 살펴봤다. 리팩토링은 C++ 개발자가 매우 고대하던 기능임에도 다소 늦게 추가됐다는 감도 없지 않다. 그러나 안드로이드나 iOS 개발 등 비주얼 C++을 다양한 분야에 적용할 수 있는 시작점인 지금에서라도 생산성 향상을 위한 다양한 기능들이 추가된 점은 환영할 만하다.



출처 : 마이크로소프트웨어 7월호

제공 : 데이터 전문가 지식포털 DBguide.net