본문 바로가기

Education

[부스트 코딩 뉴비 챌린지 2020] week3: 배열

반응형

1. 컴파일링

들어가기 전에

우리가 작성한 C 코드를 실행하기 위해서는 컴파일링을 해줘야 합니다. C문법로 작성된 텍스트 형식의 파일은 컴파일링시 구체적으로 어떤 단계를 거쳐서 컴퓨터가 해석 가능한 파일로 변환될까요?

학습 목표

컴파일링의 네 단계를 설명할 수 있습니다.

핵심 단어

      • 컴파일링
      • 어셈블링
      • 링킹

 

stdio.h

  • 헤더파일
  • C언어로 작성되어 있으며 파일명이 .h로 끝나는 파일이다.
  • 이 파일에는 printf 함수의 프로토타입이 있어서 clang컴파일러가 프로그램을 컴파일할 때 printf가 무엇인지 알려주는 역할을 한다.

1.

clang hello.c
./a.out

2.

clang -o hello hello.c     #실행 옵션 중 하나로, 생성되는 파일명을 지정하게 해준다
./hello

 

cs50.h

cs50 라이브러리를 나타냄(다른 사람들이 코드. 강의 조교). 이들은 get_string 같은 함수 프로토타입을 사전에 정의하여 c에서 기본으로 제공하는 것보다 많은 함수를 사용할 있게 해준다.

그리고 string이라는 데이터 종류도 있어 get_string 파일 안에서 선언된 것이다. 모든 cs50.h string get_string 선언해서 가능한 일이다.

cs50 라이브러리를 사용한 프로그램을 컴파일할 때는 clang 하나의 프로그램이 필요했다. -lcs50 뒤에 붙여주어야 clang 실행되었다. 이는 clang에게 cs50 라이브러리에 있는 모든 0 1들을 여기에 연결하라는 의미이다.

 

3.

make hello
./hello

훨씬 간단하고, 우리가 적은 모든 것들을 자동으로 수행한다.

 

컴파일링은 계속 했고, 몇주간 계속 하겠지만, 파이썬을 배우고 나면 이상 컴파일링을 하지 않아도 된다. 자동으로 컴파일 것이다. 그런데 컴파일링은 사실 우리가 지금까지 해온 것들을 아주 간단하게 표현한 말이다. 사실 make clang 사용하여 프로그램을 실행할 아래와 같은 4단계를 거친다.

 

1. preprocessing(전처리)

#include <stdio.h>  ➡️  int printf(string format, …);

#include <cs50.h>  ➡️  string get_string(string prompt);

clang cs50.h파일에 직접 들어가 해당 코드를 가져와서 ehllo.c라는 파일에 붙여넣는 것이다. 라이브러리 파일 내에 해당하는 코드로 대체된다.

2. compiling(컴파일링)

머신 코드 -> 어셈블리 코드 (저수준 프로그래밍 언어)

clang 같은 컴파일러에 의해 어셈블리 코드로 바뀌어진다. 매우 어렵고 복잡해보인다. ex) xorl %eax, %eax (컴퓨터구조에서 배운 )

이는 자세히 필요는 없다. clang 모두 해주기 때문이다.

3.assembling(어셈블링)

어셈블리 코드 -> 머신 코드 (=오브젝트 코드)

어셈블리 코드를 입력으로 받아 0 1 이루어진 머신 코드를 만든다. (연속된 0 1들로 바꿔주는 작업)

4.linking(링킹)

여러 개의 파일 -> 하나의 오브젝트 파일로 합침

하지만 hello.c 같은 프로그램은 여러 다른 파일들과 연관되어 있다.  ex) cs50.h, stdio.h

, 3개의 다른 파일들을 clang 컴파일해야만 한다. 만약 이를 위해 우리가 clang 3 해야한다면 매우 귀찮을 것이다. 하지만 그럴 필요가 없다. 자동으로 해주기 때문이다.

그래서 이제 전처리와 컴파일링, 어셈블링이 끝난 뒤에 프로그램이 거치는 마지막 단계는 바로 모든 0 1들을 하나의 파일로 합치는 것이다. hello a.out처럼요. ehllo.c cs50.c 같은 소스코드는 컴퓨터의 하드 드라이브 어딘가에 있다. stdio.c 역시 하드 어딘가에 있었는데, 사실 stdio.c 안에 있는 printf.c 라는 파일을 사용한다.

파일들이 프로그램에 사용되었다.

hello.c,   cs50.c     printf.c

위의 파일을 어셈블링하여 0 1 바꾸어진 파일들이 하나로 합쳐져서 hello a.out이라고 하는 하나의 파일이 되는 것이다.

=> 여러 개의 파일로 이루어진 프로그램을 하나의 오브젝트 파일로 합치는

이제부터 모든 4단계를 컴파일링이라고 하겠다. 코드를 컴파일한다고 하면 모든 일이 일어나는 것이다. 결국 우리에게 중요한 것은, 소스 코드 입력과 머신 코드 출력이지만 그 사이에는 이런 일이 일어나고 있는 것이다.

 

생각해보기

만약 컴파일링 과정을 거치지 않기 위해 바로 머신코드로 우리가 원하는 프로그램을 작성하려고 한다면 어떤 문제가 있을까요?

연속된 0 1로만 이루어진 머신 코드로 우리가 원하는 프로그램을 작성하게 된다면, 코드가 어떤 일을 하는지 한눈에 알아보기 어려우며 가독성이 떨어지기 때문에 언어를 배우고 익히며 이해하는 데에 시간이 많이 걸릴 것이다.

 

 

2. 디버깅

들어가기 전에

우리가 소스코드를 작성하다보면, 때때로 우리 의도와는 다른 오류나 결과를 맞닥뜨리게 됩니다. 이를 “버그”라고 하는데요, 버그를 효과적으로 찾고 해결하는 방법에 대해 알아 보겠습니다.

학습 목표

디버깅 하는 여러 방법을 설명할 수 있습니다.

핵심 단어

  • 디버깅
  • help50
  • debug50

우리는 버그를 경험해보았다. 사실 프로그래밍 수업에서 배울  있는 중요한 기술은 코드 작서뿐만 아니라 여러분의 코드를 디버깅하는 방법이다.

 

버그와 디버깅

어떤 시스템의 문제를 가리켜 '버그'라는 표현을 사용한다. , 버그는 여러분이 의도하지 않은 프로그램  실수를 뜻한다.

  • 버그: 코드에 들어있는 오류.
  • 디버깅: 코드에 있는 버그를 식별하고 고치는 과정.

help50 cs50 제공하는 디버깅하는 도구들  하나이다.

 

help 50

(ex) help50 make buggy0

이를 입력하여 자체 help50 소프트웨어를 통해 이해가능한 메시지를 찾는다. 만약 오류 메시지  이해할  있는 내용이 있다면, 노란색으로 강조 해준다. 에러를 보여줄 뿐만 아니라 그게 어디에 있는지 에러의 위치도 알려준다.

, 여러분이 명령어를 실행할  문제가 생겼거나 이상한 메시지가 나온다면 help50 입력한다면 자세히 설명해줄 것이다. 그후 같은 실수를 반복하지 않게  것이다.

터미널 clear
- clear
- ctrl + l
프로그램 종료하고 터미널로 돌아오기
ctrl + c

 

printf

여러분의 프로그램 안에서 무슨 일이 일어나는지 이해하기 위해 사용할  있는 가장 간단한 도구이다.

 

debug50

  • IDE : 통합 개발 환경. (ex) visual studio, eclipse, netbeans.
  • CS50 IDE: cs50 샌드박스의   개선된 버전이다. 디버깅 도구와 같은 추가 기능을   더한 것이다.
    • 현재 디렉토리를 터미널에서 보여줌
    • IDE 왼족의  수를 클릭하면 옆에 빨간색 점이 생긴다. 이는 중지점이라고 하는데, 컴퓨터에게 프로그램을 실행할  평소처럼 실행하지 않고 여기서 멈춘  사용자가  단계씩 진행할  있도록 미리 말해주는 것이다.
    • 이를 사용하려면 "debug50"  앞에 붙여준다 (ex) debug50 ./buggy2

help50 에러 메시지를 이해할  있도록 도와준 것처럼, debug50 프로그램을 단계별로 실행할  있도록 도와준다. 이렇게 실행하게 되면, 노란색 줄이 생기는데 이의 의미는 디버거가 프로그램을  지점에서 멈췄으니 여기저기 살펴볼  있다는 뜻이다.

그리고 오른쪽 메뉴를 보면,

  • Resume: 프로그램이 끝까지 실행함
  • Step Over: 코드를  줄씩 실행한다. (노란색 줄이  줄씩 내려가게 된다)
  • Local Variables : 변수의 , type   있는 공간이 있다. Step Over 기능을 이용하여 값을 시각적으로   있으므로 무엇이 문제인지   있게 된다.

 

생각해보기

디버깅을 도와주는 프로그램은 어떤 경우에 더 큰 도움이 될까요? 만약 이런 프로그램의 도움 없이 직접 디버깅을 해야 한다면 어떻게 코드를 작성하는 것이 좋을까요?

문법상 문제가 없으나 원하는 값을 출력하지 못한 경우, 혹은 코드의 길이가 길어서  눈에 오류가 보이지 않는 경우에 디버깅을 도와주는 프로그램을 사용하면  도움이  것이다.

하지만 이런 디버깅을 도와주는 프로그램을 사용하기 이전에 미리 디버깅을 대비할  있다.  코드를 입력할 때마다 원하는 출력값이  나오는지 수시로 점검하고, 조건문 속의 코드는 들여쓰기를 하는 것처럼 코드가 가독성 있도록 깔끔하게 작성을 하면 디버그가 생길 확률이 적을 것이다.

 

 

3. 코드의 디자인

들어가기 전에

규모가 큰 프로그램을 작성할 때는 보통 한 사람이 아닌 여러 사람들이 함께 작업을 진행하게 됩니다. 이 때는 내가 기여한 부분이 프로그램에 오류를 발생시키지 않도록 주의를 기울여야 합니다. 또한 코드의 내용 뿐만 아니라 그 형식도 신경써야 합니다. 같은 내용이라 하더라도 어떻게 표현하느냐에 따라 코드를 이해하고 수정하는 속도가 달라질 수 있기 때문입니다. 코드의 정확성과 디자인을 어떻게 잘 관리할 수 있을지 배워봅니다. 

학습 목표

코드의 정확성과 디자인을 관리하는 방법을 설명할 수 있습니다.

핵심 단어

  • check50
  • sytle50
  • 고무 오리


 

check 50

과제를 수행할 때에 정확성을 자동으로 검사할  있다. cs50 강의를 위해서 작성되었지만, 함께 작업하는 환경에서 이와 같은 자동 검사 프로그램이 많이 도움이 된다. 여러 사람들이 각자  부분을 맡아 코드를 작성할 , 각자가 수정한 코드가 전체 프로그램의 정확성을 해치지는 않는지 쉽게 확인할  있기 때문이다.

 

style 50

코드가 심미적으로  작성되었는지 검사할  있다. 공백의 수나 줄바꿈과 같은 것들은 코드의 실행에 직접적으로 영향을 주지는 않지만 코드를 작성하는 사람들이 코드를 읽고 이해하는데 영향을 주기 때문이다.

은 회사들은 사내에서 코드를 작성할 때 특정한 스타일 가이드를 따르도록 합니다. 여러 사람들이 코드를 작성하기 때문에 서로 불필요한 오해를 없애고, 코드를 이해하는 데 드는 비용을 최소화하기 때문입니다.

 

고무 오리

때로는 코드에 포함된 오류를 해결할 때 앞서 소개한 help50, debug50, check50과 같은 프로그램들이 존재하지 않거나, 있다 하더라도 디버깅에 큰 도움이 안 될 수 도 있습니다. 이 때는 먼저 한숨 돌리고 직접 곰곰히 생각해보는 수 밖에 없습니다.

한가지 유명한 방법으로 ‘고무 오리’와 같이 무언가 대상이 되는 물체를 앞에 두고, 내가 작성한 코드를 한 줄 한 줄 말로 설명해주는 과정을 거쳐볼 수 있습니다. 이를 통해 미처 놓치고 있었던 논리적 오류를 찾아낼 수도 있습니다.

 

생각해보기

만약 여러 사람들이 함께 참여하는 프로젝트에서, 각자가 작성하는 코드 스타일 서로 다르다면 어떤 비효율적인 일이 발생할까요?

스타일이 다르다면 나중에 코드를 하나로 합치는 과정에서 혼란이 일어날 수 있다. 또한 다른 개발자의 코드를 검토하고자 할 때, 통일된 형식으로 작성되지 않았다면 이해하기 어렵다. 각자가 작성한 코드를 읽을 때 오해가 생길 수 있고, 코드를 이해하는 데 드는 비용이 늘어난다.

 

 

4. 배열 - 1

들어가기 전에

우리가 특정 자료형의 변수를 선언하면 이는 메모리상 어딘가에 특정 크기만큼의 자리를 차지하게 됩니다. 만약 비슷한 종류의 값을 모아서 저장하고 싶다면 어떻게 해야 할까요? 메모리상에서 여러 값을 연이어서 저장하고 사용하는 방법과 그 이점을 알아보겠습니다.

학습 목표

배열을 정의하고 사용하는 방법을 설명할 수 있습니다

핵심 단어

배열

 

메모리

C에는 아래와 같은 여러 자료형이 있고, 각각의 자료형은 서로 다른 크기의 메모리를 차지합니다.

  • bool: 불리언, 1바이트
  • char: 문자, 1바이트
  • int: 정수, 4바이트
  • float: 실수, 4바이트
  • long: (더 큰) 정수, 8바이트
  • double: (더 큰) 실수, 8바이트
  • string: 문자열, ?바이트

컴퓨터 안에는 아래 사진과 같은 RAM 이라고 하는 물리적 칩이 메모리 역할을 합니다. 쉽게 생각하면 아래 사진에서 여러 개의 노란색 사각형이 메모리를 의미하고, 작은 사각형 하나가 1바이트를 의미한다고 볼 수 있습니다.

예를 들어 char 타입의 변수를 하나 생성하고, 그 값을 입력한다고 하면 위 사진에서 한 사각형 안에 그 변수의 값이 저장되는 것이죠.

 

배열

배열은 같은 자료형의 데이터를 메모리상에 연이어서 저장하고 이를 하나의 변수로 관리하기 위해 사용한다.

   int scores[3];
    scores
[0] = 72;
    scores
[1] = 73;
    scores
[2] = 33;

int scores[3]; 이라는 코드는 int 자료형을 가지는 크기 3의 배열을 scores 라는 이름으로 생성하겠다는 의미입니다. 배열의 인덱스는 0부터 시작하기 때문에, scores의 인덱스는 0, 1, 2 세 개가 있습니다. (+ 마지막 scores[3] 널문자(\0) 이용함)

이 인덱스를 변수명 뒤 대괄호 [ ] 사이에 입력하여 배열의 원하는 위치에 원하는 값을 저장하고 불러올 수 있습니다. 하지만 위와 같은 코드는 여전히 점수의 개수가 바뀌는 상황에서 제약이 많습니다.

다음 강의에서는 배열을 보다 동적으로 선언하고 저장하는 방법을 알아보겠습니다.

 

 

5. 배열 - 2

들어가기 전에

우리가 특정 자료형의 변수를 선언하면 이는 메모리상 어딘가에 특정 크기만큼의 자리를 차지하게 됩니다. 만약 비슷한 종류의 값을 모아서 저장하고 싶다면 어떻게 해야 할까요? 메모리상에서 여러 값을 연이어서 저장하고 사용하는 방법과 그 이점을 알아보겠습니다.

학습 목표

배열을 정의하고 사용하는 방법을 설명할 수 있습니다.

핵심 단어

  • 배열
  • 전역 변수

 

전역 변수

이전 강의에 이어서, 아래 코드에서 scores 배열의 크기를 정해주는 N이라는 변수를 새로 선언하였습니다.

만약 N이 고정된 값(상수)이라면 그 값을 선언할 때 const를 앞에 붙여서 전역 변수, 즉 코드 전반에 거쳐 바뀌지 않는 값임을 지정해줄 수 있습니다. 관례적으로 이런 전역 변수의 이름은 대문자로 표기 합니다.

scores의 크기로 전역 변수를 선언하였기 때문에 점수 개수가 바뀌었을때 수정해야 하는 코드가 조금 줄었습니다.

 

배열의 동적 선언  저장

아래 코드에서와 같이 루프와 함수를 선언하여 좀 더 동적인 프로그램을 작성할 수 있습니다.

여기서는 배열의 크기를 사용자에게 직접 입력 받고, 배열의 크기만큼 루프를 돌면서 각 인덱스에 해당하는 값을 역시 사용자에게 동적으로 입력 받아 저장합니다.

그리고 average 라는 함수를 따로 선언하여 평균을 구합니다. average 함수는 length 와 array[], 즉 배열의 길이와 배열을 입력으로 받습니다. 함수 안에서는 배열의 길이만큼 루프를 돌면서 값의 합을 구하고 최종적으로 평균값을 반환합니다.

이와 같은 방법을 통해서 임의의 점수 개수와 점수 배열에 대해서 동적으로 평균값을 구하는 프로그램을 작성할 수 있습니다.

 

 

6. 문자열과 배열

들어가기 전에

우리는 여태껏 문자열을 저장하기 위해 string 자료형을 사용하였습니다. ‘문자열’이라는 단어는 다시 말해 문자가 ‘나열되어 있다’ 또는 ‘배열되어 있다’ 라는의미로 추측해 볼 수 있습니다. 이런 관점에서 봤을 때 string 자료형은 C에서 정확히 어떻게 정의되어 있을까요? 배열이라는 개념이 문자열과 어떻게 연결되는지 알아보도록 하겠습니다.

학습 목표

문자열이 C에서 정의되는 방식과 메모리에 저장되는 방식을 설명할 수 있습니다.

핵심 단어

  • 문자
  • 문자열

 

학습하기

우리가 여지껏 사용한 문자열(string) 자료형의 데이터는 사실 문자(char) 자료형의 데이터들의 배열이었습니다. 

string s = “HI!”; 과 같이 문자열 s가 정의되어 있다고 생각해봅시다. s는 문자의 배열이기 때문에 메모리상에 아래 그림과 같이 저장되고, 인덱스로 각 문자에 접근할 수 있습니다.

여기서 가장 끝의 ‘\0’ 문자열의 끝을 나타내는 널 종단 문자입니다. 단순히 모든 비트가 0인 1바이트를 의미합니다.

 

그럼 아래 코드와 같이 여러 문자열이 동시에 선언된 경우를 살펴보겠습니다.

names라는 문자열 형식의 배열 네 개의 이름이 저장되어있습니다.

첫 번째 printf에서는 names의 첫번째 인덱스의 값, 즉 “EMMA”를 출력합니다.

두 번째 printf에서는 형식 지정자가 %s가 아닌 %c로 설정되어 있음을 확인할 수 있습니다. 따라서 출력하는 것은 문자열이 아닌 문자입니다.

여기서는 각 이름의 두번째 문자를 출력하고자 합니다. 이는 names[0][1]과 같이 2차원 배열을 통해 접근할 수 있습니다. 다시 말해 names[0][1]는 names의 첫 번째 값, 즉 “EMMA”라는 문자열에서, 그 두번째 값, 즉 ‘M’ 이라는 문자를 의미합니다.

아래 그림에서 names가 실제 메모리상에 저장된 예시와 해당하는 인덱스를 확인할 수 있습니다.

 

 

7. 문자열의 활용

들어가기 전에

여태까지의 강의에서 문자열의 기본적인 개념들을 학습하였습니다. 이번 강의에서는 문자열을 좀 더 깊이 활용하는 방법을 배워보겠습니다. 문자열 안에 포함되어 있는 문자를 검색하기 위해서는 어떻게 해야 할까요? 또 특정 문자를 다른 문자로 바꾸기 위해서는 어떻게 해야 할까요? 이런 질문들에 답해보도록 하겠습니다.

학습 목표

문자열을 탐색하고 일부 문자를 수정하는 코드를 구현할 수 있습니다.

 핵심 단어

  • strlen
  • toupper

 

문자열의 길이 및 탐색

사용자로 부터 문자열을 입력받아 한 글자씩 출력하는 프로그램을 만들어 보겠습니다. 간단하게 for 루프를 통해 문자열의 인덱스를 하나씩 증가시켜가면서 해당하는 문자를 출력하면 될텐데요, 문자열의 끝은 어떻게 알 수 있을까요?

한가지 방법은 해당하는 인덱스의 문자가 널 종단 문자, 즉 ‘\0’와 일치하는지 검사하는 것입니다. 즉, s라는 문자열이 있다고 할 때 for (int i = 0; i < s[i] != ‘\0’; i++) { ..} 과 같은 루프를 사용하면 되겠죠.

하지만 아래 코드와 같이 strlen() 이라는 함수를 사용할 수도 있습니다.

strlen 문자열의 길이를 알려주는 함수로, string.h 라이브러리 안에 포함되어 있습니다. 위 코드에서는 n이라는 변수에 문자열 s의 길이를 저장하고, 해당 길이 만큼만 for 루프를 순환합니다. 따라서 일일이 널 종단 문자를 검사하는 것 보다 훨씬 효율적입니다.

 

문자열 탐색 및 수정

사용자로부터 문자열을 입력받아 대문자로 바꿔주는 프로그램을 아래와 같이 작성할 수 있습니다.

방법1 - ASCII 활용

먼저 사용자로부터 입력받은 문자를 s라는 변수에 저장합니다. 그리고 s의 길이만큼 for 루프를 돌면서, 각 인덱스에 해당하는 문자가 ‘a’보다 크고 ‘z’보다 작은지 검사합니다. 즉, 소문자인지 검사하는 것과 동일합니다.

여기서 문자의 대소비교가 가능한 이유는 ASCII값, 즉 그 문자가 정의되는 ASCII 코드 상에서의 숫자값으로 비교할 수 있기 때문입니다. 또한 알파벳의 ASCII 값을 잘 살펴보면 각 알파벳의 소문자와 대문자는 32씩 차이가 남을 확인할 수 있습니다. 따라서 각 문자가 소문자인 경우 그 값에서 32를 뺀 후에 ‘문자’ 형태로 출력하면 대문자가 출력이 됩니다.

각 문자가 이미 대문자인 경우는 그냥 그대로 출력하면 됩니다.

 

방법2 - toupper()

이와 동일한 작업을 수행하는 함수가 ctype 라이브러리에 toupper() 이라는 함수로 정의되어 있습니다. 이를 이용하면 간단하게 아래와 같이 대문자 변환 프로그램을 작성할 수 있습니다.

 

 

8. 명령행 인자

들어가기 전에

make나 clang과 같은 프로그램을 실행할 때 컴파일하고자 하는 코드 외에도 컴파일 후 저장하고자 하는 파일명과 같이 추가적인 정보를 함께 줄 수도 있습니다. 이런 정보들을 명령행 인자 라고 부릅니다. 우리가 작성하는 프로그램에서도 명령행 인자를 받을 수 있도록 설계할 수 있습니다.

학습 목표

명령행 인자를 받는 프로그램을 C로 작성할 수 있습니다.

핵심 단어

  • 명령행 인자
  • argv
  • argc

 

argc, argv

우리가 여태껏 많이 사용해온 main 함수를 보다 자세히 들여다볼 때가 왔습니다. main도 그 형태를 보면 하나의 함수임을 알 수 있는데요, 이젠 더이상 main() 안에 기계적으로 void 라고 입력하는 대신 아래 코드와 같이 argc, argv 를 정의해보겠습니다.

여기서 첫번째 변수 argc는 main 함수가 받게 될 입력의 개수입니다. 그리고 argv[]는 그 입력이 포함되어 있는 배열입니다. 프로그램을 명령행에서 실행하므로, 입력은 문자열로 주어집니다. 따라서 argv[]는 string 배열이 됩니다.

argv[0]는 기본적으로 프로그램의 이름으로 저장됩니다. 만약 하나의 입력이 더 주어진다면 argv[1]에 저장될 것입니다.

예를 들어 위 프로그램을 “arg.c”라는 이름으로 저장하고 컴파일 한 후 “./argc”로 실행해보면 “hello, world”라는 값이 출력됩니다. 명령행 인자에 주어진 값이 프로그램 이름 하나밖에 없기 때문입니다. 하지만 “./argc David”로 실행해보면 “hello, David”라는 값이 출력됩니다. 명령행 인자에 David라는 값이 추가로 입력되었고, 따라서 argc 는 2, argv[1] 은 “David”가 되기 때문입니다.

ex) ./argc hello world

  • int argc = 3이 된다.
  • argv[0]= argc(파일명) / argv[1] = hello / argv[2] = world. 따라서 argc=3
  • 따라서, 결국엔 return값이 생략되어도 main()함수에서는 암묵적으로 0을 반환하는 것으로 되어있다. 왜냐하면 ./file (blank)  실행하기 때문이다.

 

생각해보기

명령행 인자는 프로그램의 확장성에 어떤 도움이 될까요? 구체적인 예시를 떠올려보세요.

명령행 인자가 없을 때에 비해 더 많은 입력을 받을 수 있어 더 동적인 프로그램 구현이 가능합니다.

 

 

반응형