Visual Studio 2013 소소한 팁

Posted by 나에요임마
2017. 7. 19. 02:02 Program/Visual Studio

VS 테마 변경하기

개발 도구를 사용하다보면 생산성을 높이기 위해서(가독성이나… 기분을 전환하거나ㅎ) 테마를 변경하게 되는 경우가 종종 있다. Visual Studio에서도 Color Theme을 변경할 수 있는 기능이 있다.

Tools > Options 에서 Environment 섹션을 클릭하면 Color Theme을 선택할 수 있는 옵션이 있다. 기본적으로 제공되는 테마는 Black, White, Blue 세가지인데 Visual Studio를 설치하는 과정에서 선택하게 되어 있기 때문에 직접 변경하게 되는 일은 거의 없다.

이 외에 새로운 테마를 사용하고 싶다면 Visual Studio Gallery에서 제공하는 Visual Studio 2013 Color Theme Editor를 활용할 수 있다. 해당 확장을 설치하면 기본적으로 추가적인 테마가 제공되며 또 자신의 취향에 맞는 테마를 쉽게 만들어 낼 수 있다.

다음과 같이 추가된 테마를 확인할 수 있다.

Color Theme Options

Solarized (Dark)를 적용했다.

Theme Changed

행 번호 표시하기

이미 많은 분들이 켜서 사용하고 있는 옵션인데 Tools > Options > Text Editor 에서 활성화 하고 싶은 언어의 General 섹션을 클릭하면 Line Numbers 옵션이 있다.

스크롤바 맵모드 사용하기

Sublime Text에서 제공되는 것과 같은 스크롤바 맵모드를 활용할 수 있다. Tools > Options > Text Editor에서 활성화 하고 싶은 언어의 Scroll Bars 섹션을 클릭하면 Behavior에서 스크롤 모드를 변경할 수 있다. 여기서 map 모드로 변경하고 적용하면 맵모드를 확인할 수 있다.

Scroll Map Mode Options

활성화 된 스크롤맵에 마우스 커서를 올리면 코드를 바로 확인할 수 있는 Preview Tooltip 도 지원한다.

주석 켜고 끄기

해당 코드를 주석으로 바꾸고 싶으면 영역을 선택하고 Ctrl + K, Ctrl + C 로 주석을 달 수 있다. 반대로 주석을 없에고 싶으면 Ctrl + K, Ctrl + U.

문서 포메팅하기, 들여쓰기 자동 지정하기

VS는 코드 작성할 때 기본적으로 설정된 코딩 컨벤션에 맞게 잘 동작하지만 가끔 애매하게 제대로 되지 않을 때가 있다. 그럴 때 Format Document를 사용할 수 있다. 단축키는 Ctrl + K, Ctrl + D. 문서 전체가 아닌 선택된 영역만 하고 싶다면 Ctrl + K, Ctrl + F.

Format Document

현재 행을 다른 행으로 이동하기

코드를 작성하다가 코드의 위치를 옮기고 싶다면 복사 붙여넣기를 해도 되지만 간단하게 Alt + 위, 아래단축키를 사용할 수 있다. 여러 행을 선택하면 한번에 이동도 가능하다.

Peek Definition

C#은 여러 클래스가 많은 파일에 산재되어 있어 직접 작성한 코드라도 해당 위치를 찾을 때 불편한 경우가 종종 있다. 이럴 때 Peek Definition을 활용할 수 있다. 현재 작성된 메소드나 인스턴스, 클래스에서 Alt + F12를 누르면 작은 창으로 해당 코드를 바로 열어볼 수 있다.

Pick Definition

열린 작은 창 안에서도 해당 단축키로 계속 탐색이 가능하고 그 자리에서 바로 코드를 수정 및 저장하는 것도 가능하다. 창을 닫으려면 ESC를 누르면 된다.

이전에 복사한 내용 붙여넣기

내용을 복사해 붙여넣는 도중에 다른 내용을 복사하면 이전에 가지고 있던 내용을 잃어버리게 된다. 만약 그 이전에 있던 내용을 붙여넣고 싶다면 Ctrl + Shift + V 를 반복해서 입력하면 된다.

'Program > Visual Studio' 카테고리의 다른 글

Visual Studio 2017 사용 시 환경 셋팅  (0) 2018.06.21
AnkhSVN으로 소스관리하기  (0) 2018.01.23
디버깅  (0) 2017.08.02

int main / void main 차이 (리눅스기준)

Posted by 나에요임마
2017. 7. 18. 00:07 Program/C


뭐 별건 없다. 사실 void로 선언해도 보통 잘 되잖아? 한번 알아보도록 하자.



int main에서 리턴을 한다는 것을 생각을 해보자. 뭔가 정수값을 하나 리턴하지?



int main() {

  return 0;


}



초간단한 main 함수다. 왜 메인에서 되도않는 값을 하나 리턴하는걸까? 이게 어디 쓰이는지 한번 볼게.


main이 어디서 호출이 되는지 봐야하거든?



여기서부터는 컴파일러마다 쪼금씩 다른데, 기본적으로 숨겨진 라이브러리들이랑 링크를 하게 된다.


main함수를 호출해주는건 C 표준 라이브러리고 보통 libc라고 많이 부름. 윈도에선 msvcrt라고 한다. vc runtime. ㅇ.



이 libc에는 main을 호출하는 __libc_start_main이라는 함수가 있다.


안에서 뭐 하는지는 대충 넘기고, main 호출 관련된 구분은 이래.



  /* Nothing fancy, just call the function.  */


  result = main (argc, argv, __environ MAIN_AUXVEC_PARAM);


...


  exit (result);



ㅇㅇ. 이 말은 뭐다? main에서 exit를 호출해도 main에서 무언가를 리턴하는거랑 똑같다는거야.


main의 리턴값은 exit로 가는거지.



근데 exit 코드는 어디 쓰이냐? 어디 쓰이냐면,


뭐 딱히 없다. 그냥 쓰고싶은대로 쓸 수 있는데, 너네가 일단 저걸 ./program 이라는 실행 파일로 만들었다고 해봐.



$ ./program


그럼 이제 exit code가 지정되었겠지? 이 지정된 값을 우리가 얻어올 수가 있어.



$ echo $?


0



자, 근데 이러면 좀 별로 쓸모없어보이는거같지? 근데 exit code가 0인거는 약간 특별한 의미야.


0이면 프로그램이 성공했다, 0이 아니면 프로그램에 뭔가 에러가 있었다라고 여기는 곳이 많거든.



그래서 아래와 같은 문법이 있다. exit(0);이라고 해보자. return 0이던 뭐던.



$ ./program && sleep 5



! 이러면 5초 기다려진다.


이번엔 exit(1); 을 해보자.



$ ./program || sleep 5



! 이래도 된다. 이번엔 exit(2);를 해보자.



$ ./program || sleep 5



똑같겠지 뭐 그냥 0이 아니면 다 똑같다는 말을 하고 싶었음


저게 왜 저렇게 작동하는지 궁금하다고? 쉘 소스코드 까보면 나올거임



근데 &&랑 ||하면 뭐가 생각나겠냐? C언어에도 and랑 or할때 저거 쓰지? 쉘 스크립트 해본사람은 대충 감이 올텐데,


쉘 스크립트에서도 if문에 넣을때 쓰이는 참, 거짓값이 exit code다.



뭐 하튼 그래서 저게 리턴값이 저렇게 쓰일수 있다 라는것은 알겠고, 그럼 void main()은 int랑 뭔 차이가 있냐? 하면


void로 선언했을 경우에는 리턴 값을 신경을 안써. 그래서 사실 어떤 값이 리턴 값으로 올지는 모르거든. 근데 main의 리턴값을 어떻게 libc_start_main에서 받을까?



답은, C언어에서는 뭐 딱히 함수 타입 신경 안써도 잘만 호출되거든.


libc_start_main에 들어가는 인자는 int를 리턴하는 함수 포인터값인거다. 아래는 함수 선언이야.



STATIC int LIBC_START_MAIN (int (*main) (int, char **, char **


                                         MAIN_AUXVEC_DECL),


... (생략) (존나많음)



근데 int가 아니네? 딱히 상관 없다. 함수 포인터는 서로 호환이 되기도 하고, 사실 C언어 링커는 함수 타입같은거 신경 안써. C++ 링커는 신경을 쓰는데, 걔는 사실 애초에 함수 이름이 인자 타입마다 내부적으로 다 다르게 되있다. C++ mangling이라고 검색해보면 나와.



뭐, 그러니까, void인지 int인지 사실 링커에서는 신경을 안쓴다는거야. 그럼 리턴 값은 어디서 나올까?


자, 이제 어셈블리어로 쪼금만 들어가보자. 맨 위의 초간단한 main을 한번 다시 불러와볼게.



int main() { return 0; }



ㅇㅇ. 어셈블리어로 어떨까? (보통 함수 앞뒤에 뭔가 붙기는 하는데 딱히 이걸 설명하는데는 중요하지 않을거같아서 뺌)



main:


  mov eax, 0


  ret



ㅇㅇ


존나 쉽지?


eax라는 "레지스터"에 0을 넣는다. 레지스터는 CPU에 있는 임시 변수같은거야.


그리고 보통 C언어에서 함수 호출을 할 때는 eax라는 "레지스터"에 리턴 값을 넣지. 실수형 리턴값은 xmm0에 넣고.. 어쩌구 저쩌구


뭐 하여튼 그렇다고. 근데 void면 어떨까?



void main() {}


main:


ret



ㅇㅇ. eax가 지정이 안된다. 뭐 컴파일러 종류나 버전마다 약간 다르긴 할거야.


CPU를 대충 순차적으로 실행하는 기계라고 생각을 해보면 eax가 지정이 안되어있다면 그 전에 지정된 eax가 리턴되겠지?


간단하게 말하면 신경을 안쓴다는거야.



그럼 뭐 대충 이런 경우는 어떨까?



int f() { return 1; }



void main() {


  f();

}



어셈블리어는 어떨까?


f:


mov eax, 1


retn



main:


call f


retn



결과부터 말하면 1이 리턴된다. 엌ㅋㅋ 뭐 그렇다고. 안녕!


오버로딩Overloading-오버라이딩Overriding

Posted by 나에요임마
2017. 7. 9. 00:27 Program/Java

오버로딩(Overloading) 오버라이딩(Overriding)

이름이 비슷해 사람들이 많이 헷갈려한다. 정확하게 말해 오버로딩과 오버라이은 다른 개념이다.

1. 오버로딩(Overloading)

오버로딩은 한 클래스 내에서 이름이 같은 메서드를 선언할 수 있다. 하지만 아래와 같은 조건이 성립해야 한다.

  • 매개변수의 타입과 개수는 달라야 한다.(반환형은 무조건 같아야 한다.)
  • 매개변수는 같으나, 반환형이 다를 경우 오버로딩이 되지 않는다.
  •  public class Test{
        public static void main(String[] args) {
           Hello h = new Hello();
           System.out.println(h.method());
           System.out.println(h.method("bbigbros"));
           System.out.println(h.method("java", 100));
        }    
     }
    
     class Hello {
        public String method() {
           return "hello world";
        }
        public String method(String name) {
           return name + " hello world!";
        }
        public String method(String name, int age) {
           return name + ", " + age + "Age..";
        }
     }
    

2. 오버라이딩(Overrding)

오버로딩(Overloading)과 달리 상속과 관련이 있다. 부모 클래스로부터 물려 받으며 자신에 맞게 수정한다.

  • 메서드의 이름이 같아야 한다.
  • 매개변수가 같아야 한다.
  • 리턴 타입이 같아야 한다.
  • 이런 것을 다형성이라고 부른다.
  •  public class Test{
        public static void main(String[] args) {
           Dog d = new Dog();
           Cat c = new Cat();
           System.out.println(d.Info());
           System.out.println(c.Info());
        }    
     }
     class Animal {
        public String Info() {
           return "나는 동물이야";
        }
     }
     class Dog extends Animal {
        // 강아지 클래스 오버라이딩 적용
        public String Info() {
           return "나는 강아지야";
        }
     }
     class Cat extends Animal {
        // 고양이 클래스 오버라이딩 적용
        public String Info() {
           return "나는 고양이야";
        }
     }



출처: http://bbigbros.tistory.com/entry/자바JAVA-오버로딩Overloading-오버라이딩Overriding [ABCProgramming]