5.2 파이썬(Python) 시작하기


아래 내용을 NetLogo와 Blockly 학습을 통해 얻은 지식을 발판삼아 볼 것이다.

  • 파이썬 프로그램을 수정하고 실행시키기 위해 파이썬 프로그래밍 환경을 사용하는 방법
  • Blockly 예시를 이용한 파이썬 프로그램 의 구조

 

우선 , Blockly 예제를 위해 생성한 파이썬 코드는 실행을 위해 프로그래밍 환경에다가 잘라 넣거나 붙여 넣을 것이다. Blockly 예제에서 바로 실행이 가능한 파이썬 프로그램으로의 변환은 파이썬 프로그래밍의 세계에 원활하게 입문하는 것에 도움이 될 것이다. 그러나 우리는 파이썬 언어로 바로 알고리즘을 구축할 수 있도록 빠르게 진행 할 것이다. 그리고 우리는 공부를 하면서 Blockly 예시에서 볼 수 없었던 파이썬의 새로운 면을 볼 수 있을 것이다.

 

5.2.1 파이썬 환경

우리는 파이썬 프로그램밍을 위해 무료로 제공되는 통합 개발 환경(IDE) 스파이더(Spyder)를 사용할 것이다. 이를 위하여 독자는 파이썬과 Spyder 그리고 어쩌면 다른 추가 요소들도 컴퓨터에 설치해야 할 것이다. 강의의 조교가 다운로드 및 설치에 도움을 줄 것이다. Spyder는 프로그래밍 환경 중 하나이며 파이썬 뿐만 아니라 다른 언어에서도 다양한 종류의 IDE가 존재한다. Spyder는 파이썬에서 알고리즘을 프로그래밍 하는데 필요한 도구를 제공하기 때문에 “프로그래밍 환경”이다.

 

이 도구들은 파이썬 코드의 텍스트를 편집하거나 프로그램에서 조작하는 데이터를 탐색할 수단, 또는 우리가 제공하는 input과 프로그램에서 출력되는 output을 통해 실행되는 프로그램과 동적으로 상호 작용 할 수 있는 수단들을 제공해준다. 도구들은 프로그램에 대한 정보를 공유할 수 있고, 프로그램을 실행할 수 있다. 또한 도구의 모든 것들을 동시에 보여줄 수 있는 하나의 창을 제공하기 때문에 “통합"이다. Spyder를 성공적으로 설치했을 때 아마 하단에 아이콘이 보일 것이다. 아이콘을 클릭하고 Spyder을 실행시키자.


../_images/Python-Spyder-Icon.png

그림5-1. Spyder IDE 아이콘

 

Spyder IDE 윈도우는 아래 그림과 같다. Spyder은 세 가지 영역이 있다.

  • 파이썬 코드를 수정 할 수 있는 왼쪽 편집창
  • 속성과 관련된 현재의 값을 살펴 볼 수 있는 오른쪽 상단에 있는 변수 관리 창. (참조 : “변수 탐색기” 탭은 창에서 선택되었는지 확인한다.)
  • ● 입력값을 입력하고 출력값을 볼 수 있는 오른쪽 아래의 파이썬 콘솔 창. 나중에 파이썬 콘솔이 다른 용도로도 사용하는 것을 보게 될 것이다. 참조 : “콘솔” 탭이 창에서 선택되어 있는지 확인한다.

Spyder IDE는 많은 그래픽 컨트롤과 메뉴가 있다. 기본 컨트롤 사용하는 방법을 배워보자.


../_images/Python-Spyder-Initial-Screen.png

그림5-2. Spyder IDE

 

파이썬 콘솔 창은 파이썬 코드를 직접 실행하는 파이썬 번역기(interpreter)를 위한 인터페이스이다. 3개 문자 “>>>”는 번역기가 주어진 파이썬 코드를 번역할 수 있는 준비가 되어 있다는 것을 가리키는 콘솔 프롬프트이다.

 

다음 그림은 짧은 세 줄의 프로그램이 입력된 것을 볼 수 있다.이 프로그램은 75 화씨온도를 동등한 수치의 섭씨온도로 전환한다. 코드의 각 라인에 입력되면 번역기는 라인을 읽고 코드에서 지시하는 작업을 수행한다. 코드의 첫 번째와 두 번째 라인은 번역기가 어떤 피드백 없이 수행한 것을 계산한다. 그 후 번역기가 print 명령문을 입력받은 즉시 print 명령문을 수행하여 뒤에 입력되어 있는 변환된 온도 값을 출력한다.

 

../_images/Python-Spyder-Type-Code-Screen.png

그림5-3. Python console에서 코드 실행

 

각각 첫 번째와 두 번째 라인이 파이썬 콘솔 창에 입력된 후에 변수 탐색기 창에서 일어나는 변화를 주목해라. 각 속성(파이썬에서는 변수라고 칭한다)이 정의되면, 적절한 속성(또는 변수)의 이름과 현재 값이 표시되는 새 항목이 탐색 창에서 만들어진다. 그림과 같이 현재 ctemp의 값은 24도이며, ftemp의 값은 75이다.

 

파이썬 콘솔 창에 직접 코드를 입력하는 것은 파이썬에 대한 초기 탐구와 작은 프로그램을 테스트하는데 유용하다. 그러나 파이썬 콘솔 창에서 입력된 코드는 Spyder를 닫을 때 없어진다. 또한 파이썬 콘솔 창에 코드를 편집할 수 없다. 코드를 유지하고 편집하는 코딩을 다룰 때는 편집 창을 사용한다.

 

실제 프로그래밍 할 때 편집창은 파이썬 코드가 포함된 파일을 만들고 수정할 때 사용되어진다. 이 창에서 파이썬 코드는 검색, 이동, 붙여넣기, 절단 등을 원하는 대로 할 수 있다. 아래 그림에서는 편집창에서 “Celsius temperature”라고 출력하는 print 명령어가 추가된 온도 변환 프로그램을 볼 수 있을 것이다.

 

../_images/Python-Spyder-Edit-Window.png

그림5-4. 편집 창에 코드 작성

 

편집 창의 위에 탭은 temp.py를 알아두자. 창 상단의 파일 메뉴에서 Save As...옵션을 사용하여 저장하도록 하자. Save As 대화상자에서 파일 이름을 선택하도록 하자. 탭 "temp.py"는 선택한 파일의 이름으로 변경되는 것을 알 수 있을 것이다. 이 경우 파일은 "Temp-Convert.py"로 저장되었다. “.py”는 파이썬 코드가 포함된 파일을 의미한다.

 

편집 창에서 작성된 파이썬 프로그램은 다음과 같은 방법으로 실행 할 수 있다.

  • 실행 아이콘을 클릭한다.(Spyder 창 상단의 녹색 삼각형)
  • Spyder 창 상단 Run 메뉴에서 Run 선택한다.

 

밑에 그림을 통해 알 수 있다. 변수 탐색기 창에 두 속성 ftempctemp 의 이름과 값을 볼 수 있는 두 항목이 나타났다는 점을 주목해야 한다.

../_images/Python-Spyder-Execution.png

그림5-5. 편집된 코드 실행

 

Variable explorer는 파이썬 번역기와 상호작용을 하여 현재 파이썬 프로그램에서의 처리되고 있는 속성의 이름과 현재 값을 보여준다.

../_images/Python-Spyder-Interpreter-Interactions.png

그림5-6. Spyder과 파이썬 변환 상호작용

 

우리는 이제 파이썬 코드 편집기를 사용하여 큰 파이썬 프로그램을 만들고, 수정할 도구들을 가지고 있으며, 파이썬 번역기를 사용하여 이러한 프로그램을 실행시킬 수 있다.


이전에 만들었던 Blockly 프로그램들에서 사용했던 일반적인 프로그래밍 구조들은 대부분 파이썬에서 계산, 순서, 선택 그리고 반복을 위해 쓰이기도 하는 것들이다. 파이썬의 문법을 배우는 편리한 방법으로 Blockly 프로그램을 배웠던 능력으로 Blocly 프로그램을 파이썬 프로그램으로 변환하면서 배우는 법을 쓸 수 있다.

 

다음 그림은 함수 장에서의 예제와 Blockly에서 만든 코드와 동일한 일을 하는 파이썬 코드를 보여준다. 참고 : 디스플레이는 나란히 보여지도록 Blocky 버전과 파이썬 코드 버전 둘 다 허용하기 위해 그림 안에서 약간 이동되었다. 비슷한 방법으로 어떤 Blocky 프로그램이든 간에 그에 해당하는 파이썬 코드를 볼 수 있다.

../_images/Python-Spyder-Blockly-To-Python.png

그림5-7. Blockly를 파이썬으로 변환

 

Blocky 프로그램의 파이썬 코드는 다음의 그림과 같이 Spyder 편집 창에 복사 붙여넣기 할 수 있다. 코드를 붙여 넣은 후 편집 창의 코드는 Blockly-Demo.py로 저장된 후에 실행된다. 독자는 이 실행의 결과물을 Variable explorer과 파이썬 콘솔 창에 결과를 볼 수 있다. 이것이 Blockly 버전에 의해 생성된 결과와 같은지 확인해보길 바란다. 아래 파일은 그림 5-8 실행 실습을 위한 weather.py 모듈이다. 아래 파일은 import가 필요한데, weather.py를 Python 프로그램의 경로 중 하나인 'Lib'폴더에 추가하면 쉽게 import 할 수 있다. Anaconda를 설치했을 때 Windows의 경우 'C:\Program Files\Anaconda3\Lib'의 경로에 파일을 옮겨놓으면 되고, Mac의 경우 'C:\Program Files\Anaconda3/lib/python 3.5'에 파일을 옮겨주면 된다.

 

../_images/Python-Executing-Blockly-Code-Spyder.png

그림5-8. Blockly 버전 파이썬 코드 실행

 

이 데모에서 중요한 점은 Blockly에서 생성된 파이썬 코드가 파이썬 번역기에 의해 직접 실행될 수 있는 완벽하고 정확한 파이썬 프로그램이라는 점이다. 이제 파이썬 편집기로 코드를 편집할 수 있고 이 코드의 변수를 생성할 수 있다.

 

연습문제 : 예시를 수정하여 문자열 “Blacksburg, VA”를 “Miami, FL”로 바꾸어봐라. 그리고 나서 파이썬 코드를 실행하라. 문자를 바르게 쓰는 것과 콤마와 대문자 “F"사이에는 정확히 하나의 공간이 있음을 주의해라.

 

Multiple Choice 위 그림 5-8에 대한 설명으로 틀린 것은?



이다." ]

 

 

5.2.2 파이썬 프로그래밍의 구조

Blocky 예시에 의해 생성된 파이썬 코드는 파이썬 프로그램의 중요한 몇가지 부분을 설명하는데 사용될 것이다.

 

전체적인 구조
그림5-9는 크게 세 부분으로 구성되어 있는 파이썬 프로그램을 보여준다. 우리는 곧 돌아와서 코드 각각의 줄을 자세히 분석할 것이나, 지금 당장은 “큰 그림”을 볼 것이다.

../_images/Python-Anatomy-Program1.png

그림5-9. 파이썬 프로그램의 부분

 

예제 코드의 맨 윗부분은 한 쌍의 import 문이다. import 문은 프로그램 안에서 재사용될 코드들이 포함된 파이썬 모듈을 사용할 수 있게 해준다. 첫 번째 문은 weather라는 이름의 모듈을 사용하겠다는 것이고 두 번째 문은 math이라는 이름의 모듈을 사용하겠다는 의미이다. weather 모듈은 메인 프로그램에서 사용되는 get_forecasts 함수에 대한 코드를 포함하고 있다. 또한 weather 모듈은 weather 데이터 스트림에 들어가는 다른 함수들도 포함하고 있다. math 모듈은 변환 함수에서 사용되는 라운드 작업에 대한 코드를 포함하고 있다. 또한 math 모듈은 다른 많은 math 연산 (제곱근, 삼각 함수 연산, 대수 등)도 포함하고 있다.

 

import문이 중요한 이유는 그 어떤 큰 파이썬 프로그램 중 이전에 개발된 파이썬 코드를 재사용하지 않는 프로그램은 없기 때문이다. 사실상, 대부분의 애플리케이션은 많은 양의 코드를 재사용한다. 코드의 재사용은 새로운 애플리케이션 개발의 비용을 줄일 뿐만 아니라, 재사용된 코드는 이전에 사용된적이 있어 프로그래밍 에러가 미리 제거되어 있을 확률도 높다. 파이썬 개발자 그룹은 많은 모듈들을 사용할 수 있게 만들어 놨으며 그 중 일부는 나중에 우리가 데이터 시각화 할 때 사용하게 될 것이다.

 

5-10

그림5-10. import 사용 예

 

그림 5-10에는 import문의 사용 예가 나와 있다. greeting.py라는 모듈을 사용자가 정의하고 main.py에서 import greeting 문장을 사용하면 greeting.py에서 이미 작성한 코드를 다시 작성하지 않고 바로 사용할 수 있는 것을 볼 수 있다.

 

예제 코드의 중간 부분은 convert 함수를 정의하는 부분이다. 나중에 각각 명령어들의 자세한 구문을 살펴보기 위하여 돌아올 것이나, 현재 이 코드가 대충 무엇을 의미하는 코드인지는 꽤 명확할 것이다. 현실에서도 종종 실제로 사용되는 프로그램이라면 이런 식의 함수 정의를 많이 포함된 경우가 많다.

 

예제 코드의 마지막 부분은 메인 프로그램이다. 각각 한개의 메인 프로그램을 가지고 있다. 이것이 프로그램의 실행을 시작하는 코드이다. 이 코드가 완전히 실행을 마치게 되면 프로그램의 실행도 종료된다.

 

들여쓰기
파이썬 프로그램의 또 다른 일반적인 특성은 코드 들여쓰기의 중요성이다. 모든 텍스트 프로그래밍 언어에서 봉착하게 되는 문제를 파이썬은 들여쓰기를 사용하여 해결한다. 파이썬에서 함수 정의의 시작은 명확하게 def 단어에 의해 표시되고 반복의 시작은 for 단어에 의해 표시된다. 하지만, 반복에 대한 코드의 마지막 부분은 어디인가? 또한 함수에 대한 코드의 마지막 부분은 또 어디인가? 이러한 문제에 대한 해결법은 언어마다 다르다. NetLogo는 반복문의 코드 범위를 한정하는 대괄호와 함수 정의 끝을 표시하기 위해 단어 end를 사용한다. Blockly는 블록의 형태를 통해 해결한다. 반복에 대한 모든 명령어들은 반복 몸체 블록 안에 들어가 있으며, 함수 정의에 대한 모든 코드는 함수 정의 블록 안에 들어간다. 그리고 파이썬은 이 문제를 들여쓰기를 통해 해결한다.

 

그림 5-10에서 예제 코드의 들여쓰기는 설명을 위한 목적으로 약간 확대하였다. 빨간 선과 파란 선은 들여쓰기가 사용된 곳을 식별하기 위해 그림에서 사용된다. 보이다시피 함수 정의의 몸체에 해당하는 모든 라인은 적어도 띄어쓰기가 4번씩 있으며 반복의 몸체에 해당하는 모든 라인들도 적어도 띄어쓰기를 4번 추가한 것(통합 8개)을 볼 수 있다. 새로운 들여쓰기를 할 때마다 띄어쓰기를 4번씩 추가해서 사용하는 것은 일반적인 관례이다.

 

../_images/Python-Anatomy-Indentation1.png

그림5-11. 코드의 들여쓰기 라인

 

“Tab"키를 사용한 들여쓰기는 띄어쓰기를 사용한 것과 다르기 때문에 주의가 필요하다. 눈으로 보기에는 동일하게 보일 수 있지만 파이썬 번역기에게는 다르다. 띄어쓰기 4번은 4개의 문자로 취급되지만, 하나의 tab은 하나의 문자로 취급되기 때문이다.

 

주석
코드가(특히 복잡한 코드가) 무엇을 하는지 이해하는 것은 어렵다. 그런 만큼 코드가 무엇을 수행하는 것인지 잘 문서화시키는 것도 숙련된 프로그래머의 표식이기도 하다. 각각의 프로그래밍 언어는 프로그램 텍스트 안에 주석을 쓰는 방법들이 있다. 이런 주석들은 작성자가 코드에 대한 중요한 정보를 사용자에게 전달할 수 있게 해주는 방법이다. 코드의 의미, 목적, 디자인은 종종 이러한 방법으로 문서화된다. 주석은 사람이 사람을 위해 작성되는 것이며, 파이썬 번역기에서는 무시된다. 그림5-11은 코멘트가 추가된 예제 코드를 보여준다.

 

../_images/Python-Anatomy-Comments1.png

그림5-12. 파이썬 코드 주석 달기

 

파이썬의 주석은 "#"(파운드 기호 또는 해시 기호)로 시작하며 줄의 끝까지 확장 할 수 있다. 위 그림에서 볼 수 있듯이 주석은 한 줄 전체 또는 한 줄의 일부를 점유 할 수 있다. 함수 정의 앞에 코멘트들은 해당 줄 전체를 차지한다. 종종 무언가에 대해 할 말이 많이 있을 때 이러한 방법이 사용된다. 이런 주석들은 모두 번역기가 해석하지 않는다는 것을 기억하길 바란다. 메인 프로그램에서의 개별적 주석 3개는 오직 해당 줄의 일부분만을 차지한다. 그리고 각각의 주석은 해당 줄에서 하는 것을 설명한다. 이 같은 주석들은 프로그램 코드에 대한 간단한 설명만이 필요할 때 사용된다.

 

지막으로, 그 어떤 방식으로도 주석이 “정확”하거나 “의미있다”는 보장은 주어지지 않는다. 함수 정의에 대한 주석에서 ‘이 함수는 화씨를 Kelvin으로 전환해준다’고 말할 수 있다. 그러나 인터프리터는 주석을 무시하고 코드가 시키는 일; 즉, 화씨에서 섭씨로의 변환 계산만을 수행한다. 주석의 의미와 정확함은 전적으로 작성자의 책임인 것이다.

 

연습문제 : 다른 Blockly 예를 가지고 파이썬 프로그램으로 실행해라.
연습문제 : 연습문제에 주석을 추가하고 그 결과를 저장해라.
연습문제 : 또 다른 Blockly 예를 가지고 파이썬 프로그램으로 실행해라.
연습문제 : 연습문제에 주석을 추가하고 그 결과를 저장해라.

 

Multiple Choice 다음 중 코드를 재사용하기 위해서 작성된 것을 골라라



 

Multiple Choice 다음 중 함수를 정의하기 위해서 작성된 것을 골라라



 

Multiple Choice
print('#Celsius temperature')   ---------------a)
#print(ctemp)            ---------------------b)
Cstream = 1 ------------c)
print(Cstream)             -------------------d)
다음 코드에서 주석이 사용된 line을 골라라




 

Multiple Choice
-(-2**2)**3/2
다음 연산 결과를 골라라




 

Multiple Choice
(-16%2)**4/2
다음 연산 결과를 골라라




 

Multiple Choice
4*(-2)--3%2
다음 연산 결과를 골라라




 

Multiple Choice “3.14”는 float형 이다.


 

Multiple Choice “Hello world!”에서 w 문자의 색인은 몇인가?



 

5.2.3 메시지 오류

자연어로 글을 쓸 때처럼 프로그래밍 언어로 명령어를 작성할 때 종종 실수를 한다. 그러한 오류를 문법(구문)오류라고 한다. 편집기 창에 구문을 입력하면 Spyder가 자동으로 코드의 구문을 검사한 뒤 문제를 보고한다. 구문 오류를 설명하기 위한 그림 5-13에서의 예 중 하나의 코드를 소개한다. 구문 오류는 def convert()를 읽는 라인에 있고 def convert():를 읽어야한다: 밑의 잘못된 예시에서 (“:”) 콜론이 누락됐다는 것에 주목하라. 이 라인의 끝에서 콜론의 부재가 바로 문법 오류이다. Spyder가 문법 오류가 있다는 것을 알리기 위해 코드 줄의 왼쪽 여백에 작은 경고 아이콘을 표시한다는 것을 알아두자. 이 아이콘 위에 커서를 놓으면 그림에 표시되는 메시지 상자가 표시된다. 문법 실수를 수정하면 경고 아이콘은 없어진다.

 

../_images/Python-Spyder-Syntax-Checking.png

그림5-13. 코드 문법 확인

 

편집기는 오직 처음으로 찾은 문법 오류만 보고할 것이다. 코드가 여러 문법 오류가 포함 된 경우 문법 검사는 각 오류마다 다시 반복해야한다. 작성중인 코드에 대한 경고 아이콘을 주기적으로 확인하는 습관을 갖는 것이 좋다.

 

Spyder 편집기에 문법 경고를 무시하거나 간과하고 프로그램을 실행할 수는 있다. 그러면 번역기는 문법 오류의 지점까지만 프로그램을 실행할 수 있다. 그러나 문법 오류 지점 이후로 부터는 번역기 이해할 수 없는 명령문을 만들기 때문에 더 이상 진행할 수 없다. 파이썬 콘솔 창(오른쪽 아래)에서는 그림과 같이 에러를 볼 수 있다. 에러메시지는 문법 오류 라인(줄 끝에 작은 부호)와 오류 메시지(“잘못된 문법 오류”)를 볼 수 있다.

 

../_images/Python-Spyder-Syntax-Errors.png

그림5-14. 프로그램 실행 시 문법 오류 보고

 

파이썬 튜토리얼에서의 설명과 예제를 보면 파이썬 문법에 대한 도움을 더 받을 수 있다. 좀 더 읽기는 어렵더라도 소스에 대한 도움을 받을 수 있는 좋은 방법은 파이썬 언어 참조를 찾아보는 것이다. 이 문서들은 IDLE 편집기 창을 통해서도 접근할 수 있다. : Help 메뉴에서 Python Docsentry 선택하면 된다. 다른 많은 웹 자습서 및 예제들을 웹 검색을 통해 찾을 수도 있다.

 

프로그램에서 각 명령어 문장은 그 문법의 언어를 넘어서는 의미적 측면도 가지고 있다. 이러한 의미적 측면은 언어로 표현되는 내용의 의미를 말한다. 예를 들자면 "하늘이 삼각형이다."라고 말하는 것은 문법적으로는 정확하지만 의미적으로는 맞지 않다.


프로그램에서도 또한 문법적으로는 옳으나 의미적으로 잘못된 문장들이 있을 수 있다. 예를 들어, 화씨온도를 섭씨온도(T)로 변환하는 올바른 방법은 (T-32) /1.8 공식을 사용하는 것이다. 하지만 대신에 (32-T)/8.1식을 사용하여 프로그램을 작성한다면 문법적으로는 정확하지만 의미적으로는 잘못된 문장이 된다. - 제대로 된 섭씨온도를 생성하지 않기 때문이다. 경우에 따라서는 의미적인 잘못이 너무 커서 번역기가 프로그램 자체를 실행시키지 못하는 일이 벌어질 수도 있다. 밑의 예시를 보라.

 

번역기가 어떠한 공식을 0으로 나누는 것을 실행해달라고 요청한다. 하지만 이러한 요청은 수학적으로 의미가 없는 요청이다. 이러한 경우, 번역기는 프로그램 실행을 멈추며 run time error을 보고할 것이다. 이런 실행 도중에 나타나게 되는 오류들을 고치는 것을 디버깅(debugging)이라고 하며 종종 매우 어렵고 지루한 작업 중 하나다.

연습문제 : 일부러 코드 연습문제 중 하나에서 다른 구문 오류를 만든 뒤, 위에서 배운 단계들을 복습해보자.



퀴즈 풀때 버튼 클릭 조심!

퀴즈 작성할 때 오류가 생겨 " "기호 -> ' '기호로 한 점 양해바랍니다.

 

Multiple Choice
text = 'computational thinking class is so interesting. so, I like this class.'
length = len(text)
print('has', length, 'characters')

print(text(3))
print(text(9))
다음 코드의 실행 결과를 골라라




 

Multiple Choice
text = 'computational thinking class is so interesting. so, I like this class.'
slice1 = text(1:10)
slice2 = text(10:20)
print(slice1)
print(slice2)

slice3 = text(:15)
slice4 = text(35:)
print(slice3)
print(slice4))
다음 코드의 실행 결과를 골라라



 

Multiple Choice
text = 'computational thinking class is so interesting. so, I like this class.'
middle = len(text) // 2

start = text(0:middle)
rest = text(middle:)
print(start)
print(rest)

slice3 = text(:10)
slice4 = text(35:)
join = slice3 + '...' + slice4
print(join)
다음 코드의 실행 결과를 골라라




 

Multiple Choice
text = 'computational thinking class is so interesting. so, I like this class.'
if 'class' in text:
    print('contains the word 'class'')

number = text.count('so')
print('contains the word'so'', number, 'times')

where = text.find('thinking')
print('The word 'thinking' starts at', where)

new_text = text.replace('is', 'is not')
print(new_text)
다음 코드의 실행 결과를 골라라



Leave a Reply

Your email address will not be published. Required fields are marked *

*