인프런 커뮤니티 질문&답변

하가현님의 프로필 이미지

작성한 질문수

홍정모의 따라하며 배우는 C++

7.15 명령줄 인수 command line arguments

7_15강 명령줄인수 강의에서 명령줄 인수를 쓰는 이유가 무엇인가요

작성

·

1.1K

13

안녕하세요.

강의가 내용이 점점 어려워지지만 배우고 공부할 것이 많아 기쁜마음으로 수강중입니다. 

이런 말씀을 드려 죄송하지만 이번 강의는 도저히 무슨 내용인지 이해하기가 어렵고 답답하여 질문글을 올립니다.

강의 00:35에 메인함수의 매개변수로 여러가지가 들어갈 수 있다고 하셨는데 왜 얘들(int main(int argc, char *argv[]))이 들어가는지 설명 부탁드리고,

강의 01:14 까지 코딩을 한 이유는 단지 실행파일의 저장 위치를 프린트하기 위함인가요? 

02:48 명령 프롬프트에서 my_program 100 1024 3.14를 쓰는 것과 03:17 비주얼 스튜디오에서 명령줄 인수에 100 1024 3.14를 써서 실행을 하면 그 숫자들만 프린트가 될 뿐인데 cout << 100 << endl; cout << 1024 << endl; cout << 3.14f << endl; 이것과 차이점이 무엇인가요?

 

코드 자체도 어떻게 돌아가는지 이해가 되지 않아서 통째로 첨부합니다.

 

#include <iostream>

#include <string>

 

using namespace std;

 

int main(int argc, char *argv[]) // 메인함수에 들어가는 매개변수들이 무엇을 의미하나요 파일 위치를 프린트하기위함인가요?

{

for (int count = 0; count < argc; ++count)

{

string argv_single = argv[count];

 

if (count == 1) // 왜 1일때 아래를 프린트 하게 하나요? 04:35에서 말씀해주시는데 이해가 잘 안됩니다.

{

int input_number = stoi(argv_single); // 05:05 stoi는 정수로 바꾼다고 하셨는데 무엇을 정수로 바꾸나요? s가 string이라면 어떤 문자열을 바꾸려고 한 것인가요?

cout << input_number + 1 << endl;

}

else

cout << argv_single << endl;

}

 

return 0;

}

 

너무 답답해서 해결 못하면 오늘 잠 안올 것 같아요 ㅠㅠ 

이미 두번 세번 돌려봤는데 전체적으로 이해가 되지 않아서 질문글을 올립니다.

항상 유익한 강의 감사합니다.

답변 6

18

홍정모님의 프로필 이미지
홍정모
지식공유자

잠이 안올 것 같다고 하시니 얼른 답을 해드려야겠네요. 현재는 한국 시간으로 2019년 6월 2일 일요일 오후 2시 14분입니다. 20분 전에 질문을 올리셨다고 나오네요 ^^;

1. 초보 때는 Visual Studio에서 Ctrl+F5로 실행시키는 것이 프로그램을 실행시키는 방법의 전부라고 생각하실 수 있습니다. 특히 요즘은 GUI 사용이 대부분이기 때문에 콘솔창에서 프로그램을 실행시키는 경우가 거의 없습니다. 그러나 조금만 실무에 가까워지면 콘솔창으로 실행시키는 것이 훨씬 효율적인 경우가 많이 생깁니다. 콘솔창 사용하는 방법은 본 강의의 초반부에 몇 차례 보여드렸습니다만 (특히 코드 블럭스 사용법에서) 앞에서부터 보고 오셨는데도 잘 모르시겠다면 유튜브에서 "홍정모 C언어 명령줄"로 검색하시면 [따배씨] 1.11에서 보실 수 있습니다. Visual Studio code 사용법도 함께 보시면 좋습니다.

2. 본 강의에서 보여드리는 예제는 문법의 이해를 돕기 위한 최소한의 예제입니다. 설마 100 1024 3.14 출력만을 위해 이렇게 힘들게 프로그래밍을 공부하지는 않겠지요. 100 1024 3.14를 출력하는 프로그램을 만든다면 영원히 100 1024 3.14를 출력할 뿐이지만 다양한 입력을 받고 그 입력들을 사용하여 매번 다른 출력을 낼 수 있는 프로그램을 만든다면 훨씬 활용도가 높을겁니다. 비유를 하나 드리자면 my_game.exe "easy_mode" 이렇게 실행을 시킨다면 쉬운 모드로 실행이 되고 my_game.exe "hard_mode"로 실행을 시킨다면 쉬운 모드로 실행이 되도록 만들 수 있을겁니다. 물론 요즘 게임들은 내부에서 GUI로 난이도를 조절합니다. 비유를 할 뿐입니다. 예전 게임들은 my_game.exe "debug" 같은 방식으로 개발자들이 일부러 디버깅 데이터를 출력하는 옵션을 만들어 넣어두기도 했습니다.

3. 00:35에서는 C언어의 컴파일러가 운영체제가 그렇게 작동할 수 있도록 미리 약속을 해둔 것입니다.

4. 1:14 초보때는 파일의 위치를 출력하는 것이 별 의미가 없다고 생각하실 수도 있습니다. 전체 파일 시스템에서 실행파일의 위치가 어디인지를 아는 것이 매우 중요할 수 있습니다. 예를 들어서 프로그램이 이미지를 화면에 그려야 하는 프로그램이라면 이미지 파일의 위치를 실행파일의 위치 근처에서 찾아볼 수 있을겁니다.

5. stoi(argv_single)는 argv_single을 정수로 바꿔서 반환해줍니다. argv_single은 위에 string argv_single = argv[count]; 에서 선언되어 있습니다.

6. count 가 0일 때도 출력해보세요. 4번 답변과 연결됩니다.

 

일단 여러가지로 답을 드렸는데 확실하게 이해하실 만큼 쉽게 설명드렸는지는 잘 모르겠네요. 조금 더 생각해보시고 또 다시 질문 주셔도 됩니다. 예전에도 종종 질문 주셨던 것 같은데 아직 프로그래머처럼 생각하는 방법이 익숙하지 않으신 것 같습니다. 이해가 안가서 답답하다는 것은 바꿔서 말하면 큰 도약을 이루기 직전이라는 의미이기도 합니다. 꾸준히 노력하시기를 바라고 유튜브에 무료로 연재중인 [따배씨] (C언어 강의) 앞 부분을 보시면 장기적인 측면에서 도움이 될 것 같습니다.

 

좋은 하루 보내세요.

 

9

나중에 다른 수강생들도 비슷한 질문을 할거 같아서, 위에 홍교수님께서 잘 정리해 주신부분데 덧데어서 말씀 드리자면,

Command Line Argument 명령어를 사용하는 이유는 만드신 프로그램을 밖에서도 컨트로를 할 수 있게 하기위함인데요, 이 예로 교수님이 게임의 난이도를 말씀하셨습니다. 예를 들면 실무에서 프로그래밍을 할때, 한 program이 여러tasks를 수행하는 프로그램을 만드시겠죠, 그럴때 hard coding해서 모든 변수를 program 안에서 만드실 필요가 없는거에요. 그렇기 때문에 main에서 argument를 받아, 그에 따른 다른 func를 작동시키는 것이죠, 교수님 말씀대로, user가 program을 실행하면서 프로그램이  game_easy나 game_hard 둘중 어느버전으로 실행될지를 정할 수 있는거에요. 

여기서 왜,  if (count == 1) 일때 cout를 하냐고 물어보셨는데, argv[0]은 주로 program name을 담고 있어요. char도 array이에 한 종류죠, 그렇기 때문에, code보시면 교수님이 argv[count]로 작성 하셨어요. 그렇기 때문에, count = 1로 하게 된것이죠. 즉 user가 입력한 정보는 argv[1] 부터 시작된다는 말입니다. 여기서 만약 count = 0으로 하게 되면 저 코드는 아무 의미가 없어지죠, 왜냐 argv[0]는 그냥 프로그램 이름을 보여주는 것이니까요. 교수님의 코드는 command line argument의 예를 위한 코드이게 그냥 cout를 해서 보여준것만 이죠.

제가 이해한 부분에 잘못된 부분이 있다면 알려주세요~

그리고 더 자세히 설명해주는 글이 있어요

https://www.quora.com/What-is-the-use-of-command-line-arguments-in-C-programming

3

홍정모님의 프로필 이미지
홍정모
지식공유자

다른 학생들이 인터넷에 정리한 내용 보시면 도움이 될까 해서 링크 가져왔습니다.

https://blog.naver.com/gkdud4797/221545584435

 

2

저도 이번 강의가 이전 강의들에 비해 처음부터 끝까지 제3 외국어 처럼 들렸는데 덕분에 댓글들을 보면서 알아가네요 !!

0

ㅋㅋ 그렇네요. 제 3 외국어처럼 들렸는데 모두의 답변 덕분에 빠르게 이해하고 다음 챕터로 넘어갑니다.

감사합니다~!

0

하가현님의 프로필 이미지
하가현
질문자

먼저 빨리 답변 달아주셔서 감사합니다. 이상하게 프로그래밍 공부를 시작한 이후로 이해가 안되는 부분이 있으면 잘때 왜 안됐었지 하고 계속 생각이 되더라구요. 

답변내용 잘 고민해보고 이해 안되는 것은 다시 질문드리겠습니다.

네이버 블로그에 저 분이 올리는 공부내용도 이미 보았습니다. 강의마다 정리를 잘 해두셔서 이웃추가 해서 도움을 받고 있습니다.

유튜브 연재 강의도 참고해서 보겠습니다.

좋은강의와 질의응답에 항상 감사드립니다.