λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
C++ 기초

[C/C++] 6. μ—”νŠΈλ¦¬ 포인트(Entry point)(feat. argc/argv)

by μ„œμ•„λž‘πŸ˜ 2021. 4. 5.

 

 

 

μ˜€λŠ˜μ€ μ—”νŠΈλ¦¬ 포인트(Entry point)에 λŒ€ν•΄μ„œ 이야기해보렀고 ν•©λ‹ˆλ‹€. μ—”νŠΈλ¦¬ 포인트라고 ν•˜λ©΄ μ’€ κ±°μ°½ν•œ λŠλ‚ŒμΈλ°, 사싀 별 κ±° μ—†μŠ΅λ‹ˆλ‹€.

 

 

이전 ν¬μŠ€νŒ… 쀑 μ»΄νŒŒμΌλŸ¬μ™€ μ‹€ν–‰νŒŒμΌμ— λŒ€ν•΄μ„œ λ§μ”€λ“œλ ΈμŠ΅λ‹ˆλ‹€. μš°λ¦¬κ°€ C/C++둜 μ§  μ†ŒμŠ€μ½”λ“œλ₯Ό μ‹€ν–‰ν•  λ•Œ 항상 mainν•¨μˆ˜μ—μ„œ μ‹œμž‘ν•©λ‹ˆλ‹€. μ—¬λŸ¬ νŒŒμΌμ— μˆ˜λ§Žμ€ ν•¨μˆ˜κ°€ μžˆλ”λΌλ„ μ‹œμž‘μ€ 항상 mainν•¨μˆ˜λΆ€ν„° μ‹œμž‘ν•˜κΈ° λ•Œλ¬Έμ—, μ‹œμž‘ ꡬ문은 mainμ—μ„œ μ‹€ν–‰ν•΄μ•Ό ν•©λ‹ˆλ‹€.

 

 

// C
#include <stdio.h>

int main()
{
    printf("Hello world");
    return 0;
}

μœ„ μ˜ˆμ œμ™€ 같이 κ°„λ‹¨ν•œ μ½”λ“œλ₯Ό λ§Œλ“€λ”λΌλ„ mainν•¨μˆ˜μ—μ„œ λ™μž‘ν•˜λŠ” 것을 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

 

// C++
#include <iostream>

int main()
{
    std::cout << "숫자λ₯Ό μž…λ ₯ν•˜μ„Έμš”:" << std::endl;
    int num = 0;
    std::cin >> num;
    
    std::cout << "μž…λ ₯ν•œ μˆ«μžλŠ” " << num << "μž…λ‹ˆλ‹€." << std::endl;
    
    return 0;
}

 

ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ 쀑에 μ‚¬μš©μžμ—κ²Œ μž…λ ₯λ°›μ•„μ•Ό ν•  상황이 생기면 standard inputꡬ문을 ν†΅ν•΄μ„œ μž…λ ₯값을 받을 수 μžˆμŠ΅λ‹ˆλ‹€.(Cμ—μ„œλŠ” scanf/scanf_s, C++μ—μ„œλŠ” cin)

 

 

λ§Œμ•½ ν”„λ‘œκ·Έλž¨ μ‹œμž‘μ‹œ λ°›μ•„μ•Ό ν•  μΈμžκ°€ 항상 10개 이상 ν˜Ήμ€ 50개 이상이라고 κ°€μ •ν•˜λ©΄, 인자 개수만큼 μž…λ ₯λ°›λŠ” μ½”λ“œλ„ μž‘μ„±ν•΄μ•Ό ν•˜κ³  μ‹€ν–‰ν•  λ•Œλ§ˆλ‹€ 개수만큼 μž…λ ₯ν•΄μ€˜μ•Ό ν•  κ²λ‹ˆλ‹€. ν•˜λ£¨μ— ν”„λ‘œκ·Έλž¨μ„ 10번만 싀행해도 μž…λ ₯값을 100개 500개 μž…λ ₯ν•˜λŠ” λ²ˆκ±°λ‘œμ›€μ΄ μžˆμŠ΅λ‹ˆλ‹€.

 

 

 

κ°œμ„ λ°©λ²•μœΌλ‘œ μ €λŠ” μΈμžλ“€μ„ λͺ¨μ•„놓은 νŒŒμΌμ„ λ§Œλ“€κ³  κ·Έ νŒŒμΌμ„ μž…λ ₯κ°’μœΌλ‘œ λ°›μ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

// C++
#include <iostream>
#include <string>

int main()
{
    std::cout << "경둜λ₯Ό μž…λ ₯ν•˜μ„Έμš”:" << std::endl;
    
    // 파일 경둜 μž…λ ₯
    std::path;
    std::cin >> path;
    
    std::cout << "μž…λ ₯ν•œ κ²½λ‘œλŠ” " << path << "μž…λ‹ˆλ‹€." << std::endl;
    
    // 파일 읽기 μ‹œμž‘
    FILE* fd = fopen(path.c_str(), "r");
    ...
    
    return 0;
}

 

μœ„μ™€ 같이 파일 경둜λ₯Ό μž…λ ₯λ°›μ•„μ„œ μˆ˜μ‹­κ°œμ˜ 인자λ₯Ό ν•˜λ‚˜μ˜ 인자둜 μž…λ ₯λ°›μ•„μ„œ μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

 

ν•˜μ§€λ§Œ μœ„ 방법도 μ‹€ν–‰ν•  λ•Œλ§ˆλ‹€ 경둜λ₯Ό μž…λ ₯ν•΄μ£Όμ–΄μ•Ό ν–ˆκΈ° λ•Œλ¬Έμ— μ™„μ „νžˆ κ°œμ„ λλ‹€κ³ λŠ” ν•  수 μ—†μŠ΅λ‹ˆλ‹€. μž…λ ₯값을 받지 μ•Šκ³  ν”„λ‘œκ·Έλž¨ μ‹œμž‘μ‹œ 인자λ₯Ό 받을 수 μžˆλŠ” 방법이 μžˆμ„κΉŒμš”?

 

 

μ—¬κΈ°μ„œ μ—”νŠΈλ¦¬ 포인트(Entry point)κ°€ λ‚˜μ˜΅λ‹ˆλ‹€.

 

// C
#include <stdio.h>

int main(int argc, char* argv[])
{
    printf("인자의 κ°œμˆ˜λŠ”: %d개 μž…λ‹ˆλ‹€."\n);
    for ( int i = 0; i < argc; i++ )
    {
        printf("인자 %d: %s\n", i+1, argv[i]);
    }
    
    return 0;
}

 

μ—¬κΈ°μ„œ argcλŠ” μž…λ ₯받은 인자의 개수(argument count), argvλŠ” μž…λ ₯받은 인자의 λ°°μ—΄(argument vector)을 λ‚˜νƒ€λƒ…λ‹ˆλ‹€. μž…λ ₯받은 μΈμžκ°’μ€ λ¬Έμžμ—΄ ν˜•νƒœλ‘œ λ°›κΈ° λ•Œλ¬Έμ— λ°›μ•„μ˜¨ 값을 μ μ ˆν•˜κ²Œ μ²˜λ¦¬ν•  ν•„μš”κ°€ μžˆμŠ΅λ‹ˆλ‹€.

 

 

 

main의 λ§€κ°œλ³€μˆ˜μΈ int argc, char* argv[]λŠ” κ³ μ •λœ ν˜•νƒœμ΄λ―€λ‘œ μž„μ˜λ‘œ λ°”κΎΈλ©΄ λ™μž‘ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

 

main.exe hello world g-stack

 

μ‹€ν–‰μ‹œ μœ„μ™€ 같이 μž…λ ₯값을 μ€€λ‹€λ©΄ 좜λ ₯ 값은 λ‹€μŒκ³Ό 같이 λ‚˜μ˜΅λ‹ˆλ‹€.

 

인자의 κ°œμˆ˜λŠ” 4개 μž…λ‹ˆλ‹€.

인자 1: ./main.exe

인자 2: hello

인자 3: world

인자 4: g-stack

 

 

 

μ—¬κΈ°μ„œ μ•Œμ•„λ‘¬μ•Ό ν•  것은 첫 번째 인자(argv[0])λŠ” 항상 μ‹€ν–‰νŒŒμΌμ˜ 이름이 λ“€μ–΄μ˜΅λ‹ˆλ‹€. κ·Έλž˜μ„œ μ‹€μ œλ‘œ λ‚΄κ°€ 넣은 첫 번째 μΈμžλŠ” argv[1]둜 가져와야 ν•©λ‹ˆλ‹€. 

 

μœˆλ„μš°μ—μ„œλŠ” cmdλ₯Ό 톡해 인자λ₯Ό 쀄 수 μžˆμŠ΅λ‹ˆλ‹€.(μΈμžκ°’: config.txt경둜)

 

 

 

μ•„κΉŒμ˜ μƒν™©μœΌλ‘œ λŒμ•„μ™€μ„œ 파일 경둜λ₯Ό main의 인자둜 μ „λ‹¬ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

// C
#include <stdio.h>

int main(int argc, char* argv[])
{
    if ( argc > 2 )
        printf("μΈμžλŠ” ν•˜λ‚˜λ§Œ μž…λ ₯ν•΄μ£Όμ„Έμš”\n");
    
    char* path = argv[1];
    
    // 파일 읽기 μ‹œμž‘
    FILE* fd = fopen(path, "w");
    ...
    
    return 0;
}

 

argcλŠ” μ‹€ν–‰νŒŒμΌ 이름을 ν¬ν•¨ν•΄μ„œ 2κ°œκΉŒμ§€λ§Œ ν—ˆμš©ν•˜λŠ” μ˜ˆμ™Έμ²˜λ¦¬λ₯Ό λ¨Όμ € ν–ˆμŠ΅λ‹ˆλ‹€. 그리고 μž…λ ₯받은 경둜λ₯Ό ν†΅ν•΄μ„œ νŒŒμΌμ„ μ½μ–΄μ„œ μ‹€μ œ ν•„μš”ν•œ 인자λ₯Ό 자유둭게 κ°€μ Έμ˜¬ 수 있게 λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

 

 

 

 

μœ„ 상황 말고도 μ—”νŠΈλ¦¬ν¬μΈνŠΈλ₯Ό ν™œμš©ν•˜λŠ” 방법은 λ§ŽμŠ΅λ‹ˆλ‹€. ν”„λ‘œκ·Έλž¨ μ‹œμž‘μ‹œ μ‹€ν–‰λ˜λŠ” mainν•¨μˆ˜μ— 인자λ₯Ό μ£Όκ³  μ‹Άλ‹€λ©΄ μ—”νŠΈλ¦¬ν¬μΈνŠΈλ₯Ό κΈ°μ–΅ν•˜μ‹œκΈΈ λ°”λžλ‹ˆλ‹€.

 

 

λŒ“κΈ€