본문 바로가기

명령줄 인수 (Command line arguments) 본문

💘 C++/함수

명령줄 인수 (Command line arguments)

Hyonii 2022. 8. 20. 19:39

명령줄 인수 (Command line arguments)

프로그래밍할 때 매번 main() 하고 괄호를 친다.

 

저 괄호 안에 매개변수 넣는 방법을 보여드리겠다.

 


OS가 main을 호출할 때는 파라미터를 여러 가지 넣어 줄 수 있다.

C언어의 컴파일러가 운영체제가 그렇게 작동할 수 있도록 미리 약속을 해둔 것이다.

 

int argc는 개수이고

 

char *argv[] 는 실제 내용들이다.

이걸 출력하는 루틴을 먼저 만들고 실행하는 것을 보여드리겠다.

 

cout으로 받아온 것을 출력을 해준다.

일단 실행해보면

 

실행파일 이름이 뜬다.

 

* 초보 때는 파일의 위치를 출력하는 것이 별 의미가 없다고 생각할 수 있다.

  전체 파일 시스템에서 실행파일의 위치가 어디인지를 아는 것이 매우 중요하다.

  예를 들어서 프로그램이 이미지를 화면에 그려야 하는 프로그램이라면

  이미지 파일의 위치를 실행파일의 위치 근처에서 찾아볼 수 있을 것이다.

 

얘를 직접 실행시켜보자

일단 저 파일이 어디 있는지 위치를 먼저 찾기 위해서

 

마우스 오른쪽 클릭해서 상위 폴더 열기 하면

 

여기 실행파일이 있는 게 보일 거다.

 

비주얼 스튜디오에서 command line 실행시키는 방법도 있는데 많이 사용하지는 않는다.

그것보다 시작 클릭해서

 

x86이니까 86을 선택한다.

 

실행시키면 커맨드 창이 뜬다.

 

여기서 바로 실행파일을 긁어다 붙여서 엔터를 눌러도 된다.

그럼 아까 실행시킨 거랑 똑같은 결과가 나온다.

아니면

 

cd( change directory) 치고 주소를 복붙해서 엔터누르면 그 디렉토리로 이동한다.

exe 파일을 직접 실행시킬 수 있는 거다.

 

실행파일명 Study 까지만 입력하고 tab키 눌러도 자동 완성돼서 입력된다.

 

실행시킬 때 실행시킨 명령문( StudyCPP.exe)이 첫 번째로 나온다.

 

그다음에 my_program 100 1024 3.14 아무거나 친 거다

치고 엔터누르면 순서대로 나오고 있다.

 

   * 위 예제는 문법의 이해를 돕기 위한 최소한의 예제이다.

     100 1024 3.14 출력만을 위해 이렇게 공부하지는 않는다.

     다양한 입력을 받고 그 입력들을 사용하여 매번 다른 출력을 낼 수 있는 프로그램을 만든다면
     훨씬 활용도가 높을 것이다.

 

     예를 들어 my_game.exe "easy_mode" 이렇게 실행을 시킨다면 쉬운 모드로 실행이 되고

     my_game.exe "hard_mode"로 실행을 시킨다면 쉬운 모드로 실행이 되도록 만들 수 있을 것이다.

     물론 비유를 할 뿐 요즘 게임들은 내부에서 GUI로 난이도를 조절한다.

     예전 게임들은 my_game.exe "debug" 같은 방식으로

     개발자들이 일부러 디버깅 데이터를 출력하는 옵션을 만들어 넣어두기도 했다.*

 

 

이렇게 할 수 있는 게 한 가지 있고

매번 command prompt를 여는 게 힘들면 속성에서

 

명령 인수에 직접 입력할 수 있다.

 

아까 쳐본 거 그대로 넣어놓고 실행시키면

 

똑같이 작동한다.

두 가지 방법 다 사용할 수 있고 필요에 따라서 바꿔가면서 사용하면 된다.

 


조금 더 편하게 사용하는 방법을 알아보기 위해

string으로 처리가 되는지 해보자.

 

<string> include 해주고

argv[count]를 argv_single 에다가 대입을 해주면

바뀌나 실행시켜보자.

 

똑같이 잘 작동한다.

그런데 100 1024 3.14는 integer integer float로 변환하고 싶을 수 있다.

이 때도 방법이 있다.

 

여러 가지 방법이 있는데 일단

count가 1일 경우에

 

     * 여기서 1을 넣은 이유는 0은 맨 첫 번째 것이고 실행파일 이름 혹은 실행 path를 통째로 담고 있다.

      첫번째 원소는 program의 이름이다.

      그래서 1번이 두 번째 argument가 될 것이다.

 

아까 입력해놓은 것에서

 

1024 하나만 남겨놓았다.

이 경우에는

 

std에 s to i 하는 것 이 있다.

stoi(argv_single)는 argv_single을 정수로 바꿔서 반환해주는 것이다.

argv_single은 위에 string argv_single = argv[count]; 에서 선언되어 있다.

 

이렇게 정수로 바꿔 줄 수가 있다.

그리고 출력을 해보겠다.

정수니까 계산이 된다는 것을 확인하기 위해서 1만 더해 보자.

그리고 else 붙여서 나머지는 출력을 하게 해보자.

 

이렇게 하고 실행시켜보면

 

1024라는 게 정수로 바뀌고 다시 1이 더해져서 1025가 출력이 되는 것을 확인할 수 있다.

그래서 종종 실행을 할 때에도 command line에서 실행을 할 필요가 있을 때도 있다.

그리고 scripting 할 때는 더 유용하게 사용을 할 수 있을 것이다.

 

들어오는 게 지금 전부 문자열로 들어오고 있다.

필요에 따라서 string으로 바꾸고 그다음에 다시 필요한 데이터 타입으로 바꿔서 원하는 처리를 할 수 있다. 

 

단점도 많이 있다.

사용자가 입력을 잘못했을 때 오류처리를 매번 자세하게 해줘야 한다던가

예기치 못하게 개수가 안 맞게 입력을 한다던가 등 좀 불편한 면이 있다.

이러한 기능들을 구현하실 때 직접 구현하는 방법도 있고 boost라는 라이브러리가 있다.

 

Boost 라이브러리가 준표준 정도라고 생각하면 된다. 

Boost 라이브러리 중에 Program_options라는 게 있다.

이걸 사용하시면 command line argument를 처리할 때 조금 더 편리하게 사용할 수 있다.

나중에 아 이런 거는 누군가 짜 놨을 법 한데? 이런 라이브러리는 당연히 있지 않을까? 싶은 것 들은 거의 Boost에 있다.

Comments