6. 이벤트 신호와 약속 함수

【배우기】


1. 엔트리로 신호와 함수 이해하기

2. 파이선으로 신호와 함수 이해하기

1신호와 함수란 무엇일까요?

신호와 함수 중에선 신호에 대해서 먼저 알아보도록 하자. 신호란 무엇일까? 일상생활에서 자동차 신호등을 생각해본다면, 달리던 자동차는 신호등을 만나서 빨간불인 경우에는 차가 주행하지 못하고 차량 정지선에서 서 있게 된다. 그리고 다시 신호등이 초록색으로 바뀌면, 차는 다시 주행할 수 있다. 이처럼 어떠한 이벤트를 발생시키기 위해서 필요한 것이 신호라고 생각하면 된다. 따라서 엔트리에서의 신호는 각각의 오브젝트들이 서로에게 영향을 주는 것을 말하며, 파이선에서는 호출이 신호와 같은 역할을 한다. 따라서 신호는 서로가 서로에게 영향을 줄 수 있도록 만든 것이다.

이미지. 자동차 도로, 신호등에 파란 불이 켜져있는 그림

다음은 함수에 대해서 알아보도록 하자. 함수란 무엇일까? 함수는 명령어들을 묶어 놓고, 이 묶음에 이름을 주는 것을 말한다. 예를 들어 과자종합선물 세트를 생각하여 보도록 하자. 마트에서 과자 바구니에 여러 가지 과자를 넣어 구성하여 판매대에 올려놓는다. 그리고 그 바구니에 특정한 이름을 붙여서 판매를 한다. 과자를 사러 마트에 온 사람들은 과자종합선물세트를 보고, 필요한 경우 물건을 구입한다. 그리고 가정에 가져가서 맛있게 먹습니다. 이처럼 함수라는 것은 여러 가지 명령어들이 들어 있고, 함수명이 있는데, 이러한 함수는 사용자가 필요한 경우 불러와서 언제든 사용할 수 있도록 되어 있다.

이미지. 마트에서 과자선물세트를 팔고 있는 그림

2엔트리로 신호와 함수 이해하기

1. 엔트리로 우주로 떠나는 로켓 만들기

우주로 떠나는 로켓을 엔트리 블록 프로그램으로 만들어 보도록 하자. 우선은 로켓을 발사하기 위해서는 로켓과 관제탑이 필요하며, 관제탑을 함수로 만들어서 관제탑 신호가 들어오면, 관제탑 함수를 실행할 수 있도록 한다. 또한 신호를 이용하여 로켓에서 관제탑으로 신호를 줘서 영향을 줄 수 있도록 하며, 관제탑은 다시 로켓에게 신호를 줘서 영향을 줄 수 있도록 만들어 보도록 하자.

2단원 2차시의 지체장애 학생을 위한 컴퓨터 환경 만들기의 PC 태블릿 모드 사용법을 참고하여 터치모니터와 함께 사용해보자.

가. 오브젝트 추가

1
이미지. 미래도시 배경 오브젝트 그림
배경으로 미래도시의 오브젝트 추가하는데, 미래도시의 일부 선을 활주로로 표현한다.
2
이미지. 63빌딩 오브젝트 그림
관제탑으로 비슷한 모양의 오브젝트로 63빌딩을 추가한다. 따라서 관제탑에 대한 블록 코딩을 해당 오브젝트에서 한다.
3
이미지. 로켓(3) 오브젝트 그림
로켓의 오브젝트를 추가하는데, 로켓에 대한 블록 코딩을 해당 오브젝트에서 실행한다.
4
이미지. 불(2) 오브젝트 그림
로켓이 출발할 때, 필요한 점화를 표현하기 위해서 불의 오브젝트를 추가하며, 로켓이 출발할 때 신호를 받아 나타날 수 있도록 한다.
5
이미지. 우주(1) 오브젝트 그림
장면 2에 우주 오브젝트를 배경으로 추가한다.
6
이미지. 로켓(3) 오브젝트 그림
장면 2에서 로켓의 오브젝트를 추가하고, 로켓이 이동할 수 있도록 블록 코딩한다.
7
이미지. 불(2) 오브젝트 그림
장면 2에서 로켓이 이동할 때, 필요한 오브젝트로 불을 추가하여 로켓이 이동하는 동안 같이 움직일 수 있도록 블록 코딩한다.

나. 오브젝트에 엔트리 블록 코딩

이번 엔트리 블록 코딩에서는 로켓과 관제탑이 서로 신호를 주고받을 수 있도록 하여 오브젝트 간에 영향을 주고받는 방법을 알아보고, 관제탑을 함수로 만들어 함수의 활용 방법에 대해서 살펴보며, 블록 프로그램 코딩해 보도록 하자.
1
이미지. 블록들 이미지. 시작하기 버튼을 클릭했을 때 블록, 관제탑..관제탑..을 2초동안 말하기 블록, 모든 이륙준비 완료, 를 2초동안 말하기 블록, 신호1 신호 보내기 블록이 연결되어 있다.

순번 3 오브젝트를 클릭

블록탭-[시작]-[시작하기 버튼을 클릭했을 때]

블록탭-[생김새]-[안녕!을(를) 4초 동안 말하기]-“안녕!”을 “관제탑.. 관제탑..”으로 변경하고, 4초를 2초 동안으로 변경

블록탭-[생김새]-[안녕!을(를) 4초 동안 말하기]-“안녕!”을 “모든 이륙준비 완료”로 변경하고, 4초를 2초 동안으로 변경

속성-[신호]-[신호1 입력]-[확인]

블록탭-[시작]-[신호 1 신호보내기]

2
이미지. 블록들 이미지. 신호2 신호를 받았을 때 블록, 출발하겠다를 2초동안 말하기 블록, 2초동안 x:260, y:180 위치로 이동하기 블록, 만일 벽에 닿았는가? 라면 다음 장면 시작하기 블록이 연결되어 있다.

순번 3 오브젝트를 클릭 (로켓)

블록탭-[시작]-[신호2 신호를 받았을 때]

블록탭-[생김새]-[안녕!을(를) 4초 동안 말하기]-“안녕!”을 “출발하겠다”로 변경하고, 4초를 2초 동안으로 변경

블록탭-[움직임]-[2초 동안 x:10 y:10 만큼 움직이기]-x:260, y:180으로 변경

블록탭-[흐름]-[만일 참이라면]-[판단]-[벽에 닿았는가?]-“참”을 “벽에 닿았는가?”로 변경

블록탭-[시작]-[다음 장면 시작하기]

3
이미지. 블록들 이미지. 신호2 신호를 받았을 때 블록, 모양보이기 블록, 2초 기다리기 블록, 2초동안 x:260, y:180 만큼 우직이기 블록, 만일 벽에 닿았는가? 라면 다음 장면 시작하기 블록이 연결되어 있다.

순번 4 오브젝트를 클릭 (불)

블록탭-[시작]-[신호2 신호를 받았을 때]

블록탭-[생김새]-[안녕!을(를) 4초 동안 말하기]-“안녕!”을 “출발하겠다”로 변경하고, 4초를 2초 동안으로 변경

블록탭-[움직임]-[2초 동안 x:10 y:10 만큼 움직이기]-x:260, y:180으로 변경

블록탭-[흐름]-[만일 참이라면]-[판단]-[벽에 닿았는가?]-“참”을 “벽에 닿았는가?”로 변경

블록탭-[시작]-[다음 장면 시작하기]

4
이미지. 블록들 이미지. 함수 정의하기 관제탑. 블록, 체크, 활주로 확인.을 2초동안 말하기 블록, 모든 준비가 끝났다. 이륙해도 좋다. 출발을 2초동안 말하기 블록이 연결되어 있다.

속성탭-[함수]-[추가]-[관제탑]

블록탭-[생김새]-[안녕!을(를) 4초 동안 말하기]-“안녕!”을 “체크 활주로 확인”으로 변경하고, 4초를 2초 동안으로 변경

블록탭-[생김새]-[안녕!을(를) 4초 동안 말하기]-“안녕!”을 “모든 준비가 끝났다 이륙해도 좋다. 출발”로 변경하고, 4초를 2초 동안으로 변경

5
이미지. 블록들 이미지. 신호1신호를 받았을 때 블록, 관제탑 블록, 신호2 신호보내기 블록이 연결되어 있다.

순번 2 오브젝트 클릭

블록탭-[시작]-[신호 1] 신호를 받았을 때

블록탭-[함수]-[관제탑]

블록탭-[시작]-[신호 2] 신호 보내기

6
이미지. 블록들 이미지. 장면이 시작되었을 때 블록, 대기권 탈출..성공..가자..우주로.를 2초동안 말하기 블록, 1초 기다리기 블록, 계속 반복하기 블록, 2초동안 x:228, y:0 만큼 움직이기 블록, 크기를 0.5만큼 바꾸기 블록, 만일 벽에 닿았는가 이러면? 블록 모양 숨기기 블록이 연결되어 있다.

순번 6 오브젝트 클릭

블록탭-[생김새]-[안녕!을(를) 4초 동안 말하기]-“안녕!”을 “대기권 탈출.. 성공.. 가자..우주로..”로 변경하고, 4초를 2초 동안으로 변경

블록탭-[흐름]-[2초 기다리기]-2초를 1초로 변경

블록탭-[흐름]-[계속 반복하기]

블록탭-[움직임]-[2초 동안 x:10 y:10 만큼 움직이기]-x:228, y:0으로 변경한 후 “계속 반복하기” 블록 안에 삽입

블록탭-[생김새]-[크기를 10만큼 바꾸기]-10을 0.5로 변경

블록탭-[흐름]-[만일 참이라면]-[판단]-[벽에 닿았는가?]-“참”을 “벽에 닿았는가?”로 변경하고 “계속 반복하기” 안에 삽입

블록탭-[생김새]-[모양 숨기기]

7
이미지. 블록들 이미지. 장면이 시작되었을 때 블록, 3초 기다리기 블록, 계속 반복하기 블록, 북의 색을 빨강색으로 정하기 블록, 붓의 굵기를 2만큼 바꾸기 블록, 그리기 시작하기 블록, 2초동안 x:228, y:0 만큼 움직이기 블록, 크기를 0.5만큼 바꾸기 블록, 만일 벽에 닿았는가 이러면? 블록 모양 숨기기 블록이 연결되어 있다.

순번 7 오브젝트 클릭

블록탭-[흐름]-[4초 기다리기]-4초를 2초로 변경

블록탭-[흐름]-[계속 반복하기]

블록탭-[붓]-[붓의 색을(으)로 정하기]-색을 빨간색으로 변경한 후 “계속 반복하기” 블록 안에 삽입

블록탭-[붓]-[붓의 굵기를 1만큼 바꾸기]-1을 2로 변경한 후 “계속 반복하기” 블록 안에 삽입

블록탭-[움직임]-[2초 동안 x:10 y:10 만큼 움직이기]-x:228, y:0으로 변경한 후 “계속 반복하기” 블록 안에 삽입

블록탭-[생김새]-[크기를 10만큼 바꾸기]-10을 0.5로 변경

블록탭-[흐름]-[만일 참이라면]-[판단]-[벽에 닿았는가?]-“참”을 “벽에 닿았는가?”로 변경하고 “계속 반복하기” 안에 삽입

블록탭-[생김새]-[모양 숨기기]

다. 오브젝트에 엔트리 블록 코딩 실행 결과

엔트리 블록 코딩을 끝낸 후 실제적인 실행 결과를 확인해 보도록 하자. 우주로 떠나는 로켓 프로그램 엔트리 블록 코딩의 결과는 아래와 같이 실행된다.

이미지. 우주로 떠나는 로켓 프로그램 엔트리 블록 코딩의 동영상의 스크린샷

실행 결과를 살펴보면, 시작과 동시에 로켓에서 “관제탑.. 관제탑..”과 “모든 이륙 준비 완료.”가 출력된다. 그리고 다음으로 신호가 관제탑으로 이동하게 되며, 관제탑에서는 “체크, 활주로 확인.”와 “모든 준비가 끝났다. 이륙해도 좋다. 출발”을 출력한다. 그리고 다시 로켓으로 신호를 보내고, 로켓에서는 “출발하겠다.”를 출력하고 활주로를 따라 올라가며, 화면에 로켓이 닿았다면, 장면 2로 넘어가게 된다. 장면 2에서는 로켓에서 “대기권 탈출.. 성공.. 가자.. 우주로.”를 출력하며, 화면의 끝까지 이동하며 프로그램을 종료한다.

3파이선으로 신호와 함수 이해하기

1. 파이선으로 우주로 떠나는 로켓 만들기

파이선으로 우주로 떠나는 로켓 프로그램을 만들어 보도록 하자. 우선 전체적인 구성은 엔트리 블록 프로그램 코딩과 비슷할 수 있다. 그러나 파이선에서는 가장 먼저 로켓과 관제탑의 함수를 만들고, 로켓 함수에서 관제탑 함수를 호출하여, 함수와 함수 간에 어떠한 영향을 줄 수 있는지에 대해서 생각하며, 우주로 떠나는 로켓 프로그램을 코딩하여 보도록 하자.

TIP - 함수

함수라는 것은 여러 가지 명령어들의 묶음으로 생각할 수 있으며, 함수의 종류에는 파이선에서 제공하는 내장함수와 직접적으로 만들어서 사용하는 직접 함수로 나누어서 정의할 수 있으며, 함수의 사용 방법은 아래의 구문과 같다.

def 함수이름(매개변수 목록):

# 코드블록

return 결과

가. 파이선 프로그램 코딩

파이선으로 우주로 떠나는 로켓 프로그램을 작성한 전체 코딩은 아래의 내용으로써, 전체적 코딩을 살펴보면, 가장 먼저 로켓과 관제탑의 함수가 각각 만들어져 있다. 그리고 로켓의 함수만을 시작과 함께 호출하였다. 따라서 로켓 함수가 불려와져서 함수의 내용이 실행되면서, 중간에 관제탑의 함수를 호출하여 관제탑 함수의 명령어가 실행될 수 있도록 하였다. 그렇다면 전체적인 파이선 프로그램 코딩 내용을 살펴보고, 사칙연산 계산기 프로그램이 어떻게 코딩 되었는지 학습하여 보도록 하자.

화상키보드 사용법은 2단원 2차시의 지체장애 학생을 위한 컴퓨터 환경 만들기를 참조하자.

import time


def rocket( ):



     print(“로켓: 관제탑, 관제탑 ⁄ n”)

     time.sleep(2)

     print(“로켓: 모든 이륙준비 완료 ⁄ n”)

     time.sleep(2)

     control_tower( )

     time.sleep(2)

     print(“로켓: 출발하겠다. ⁄ n”)

     time.sleep(2)

     print(“로켓: 5,4,3,2,1,0 ⁄ n”)

     time.sleep(2)

     print(“로켓: 대기권 탈출, 성공.. ⁄ n”)

     time.sleep(2)

     print(“로켓: 가자 우주로.. ⁄ n”)


     def control_tower( ):

       print(“관제탑: 체크, 활주로 확인 ⁄ n”)

       time.sleep(2)

       print(“관제탑: 모든 준비가 끝났다. 이륙해도 좋다. 출발. ⁄ n”)


rocket()

전체적인 프로그램 코딩을 살펴보면, 단순한 구조를 가지고 있는데, 가장 윗부분에는 “def rocket( ):”라는 함수와 “def control_tower( ):” 함수가 선언되어 각 각의 함수에 여러 가지 명령어를 포함하고 있다. 그리고 마지막 부분에는 rocket( ) 함수를 호출하여 명령어를 실행할 수 있도록 하였으며, rocket( ) 함수 안에는 “control_tower( )” 호출하여 사용하고 있다. 전체적인 내용을 이해하였다면, 아래에서 세부적으로 프로그램 코딩의 내용을 학습하여 보도록 하자.

     print(“로켓: 관제탑, 관제탑 ⁄ n”)

     time.sleep(2)

     print(“로켓: 모든 이륙준비 완료 ⁄ n”)

     time.sleep(2)

     control_tower( )

     time.sleep(2)

     print(“로켓: 출발하겠다. ⁄ n”)

     time.sleep(2)

     print(“로켓: 5,4,3,2,1,0 ⁄ n”)

     time.sleep(2)

     print(“로켓: 대기권 탈출, 성공.. ⁄ n”)

     time.sleep(2)

     print(“로켓: 가자 우주로.. ⁄ n”)

이미지. 순서도 그림, rocket 시작, 다음 화살표, 로켓 : 관제탑, 관제탑 /n, 다음화살표, 로켓: 모든 이륙준비 완료  /n, 다음화살표, control_tower()호출, 다음 화살표, 로켓:출발하겠다 ⁄ n, 다음화살표, 로켓: 대기권 탈출, 성공... /n, 다음화살표, 로켓 : 가자 우주로.. /n

첫 부분은 로켓함수를 “def rocket( ):” 선언하면서 함수가 시작된다. 그리고 print( ) 함수로 “로켓: 관제탑, 관제탑 ⁄ n”을 출력한다. 그리고 다음으로 “로켓: 모든 이륙준비 완료 ⁄ n”을 출력한 후,“control_tower( )”를 호출하게 되는데, 이 것은 관제탑의 함수를 호출한 것으로써 관제탑의 함수는로켓함수 다음에 정의하였다. 따라서 control_tower( )의 함수 안에 있는 모든 명령어를 실행하고 나면, 다음으로 다시 로켓 함수에서 print( ) 함수를 사용하여 “로켓: 출발하겠다. ⁄ n”를 출력한 후 “로켓: 5,4,3,2,1,0 ⁄ n”를 출력한다. 그리고 마지막으로 “로켓: 대기권 탈출, 성공.. ⁄ n”과 “로켓: 가자 우주로.. ⁄ n”를 출력하고 함수를 종료하게 된다.

     def control_tower( ):

       print(“관제탑: 체크, 활주로 확인 ⁄ n”)

       time.sleep(2)

       print(“관제탑: 모든 준비가 끝났다. 이륙해도 좋다. 출발. ⁄ n”)


이미지. 순서도 그림, control_tower 시작, 다음화살표, 관제탑:체크, 활주로 확인  /n, 다음 화살표, 관제탑: 모든 준비가 끝났다. 이륙해도 좋다. 출발  /n

다음으로는 관제탑에 대한 control_tower( ) 함수가 정의 되어 있는데, 함수의 선언은 “def control_tower():”이다 그리고 다음으로 print( ) 함수를 이용해서, “관제탑: 체크, 활주로 확인 ⁄ n”이 출력되도록 한 후, “관제탑: 모든 준비가 끝났다. 이륙해도 좋다. 출발. ⁄ n”가 출력되면서 함수를 종료하게 된다.

rocket()

이미지. 순서도 그림, control_tower시작, 다음 화살표, rocket()

마지막으로 파이선 프로그램이 시작되면서 실행되는 프로그램 코딩으로써 프로그램 시작과 동시에 로켓함수인 rocket( )을 호출하게 된다. 따라서 함수 호출로 인해서 rocket( ) 함수의 모든 내용을 출력하게 되는데 rocket( ) 함수에서는 control_tower( ) 함수를 호출하므로 로켓함수의 호출 중간에 관제탑 함수를 호출하여 실행하고 남은 로켓함수의 명령어들을 실행하고 프로그램을 종료하게 된다.

나. 파이선 프로그램 코딩 결과

파이선으로 우주로 떠나는 로켓 프로그램을 완성하였다면, 프로그램을 실행하여 함수가 어떻게 호출되고 사용되었는지 생각하며, 프로그램의 결과를 알아보도록 하자. 프로그램 실행 결과는 아래와 같다.

이미지. 파이선으로 우주로 떠나는 로켓 프로그램 동영상의 스크린샷

실행 결과를 살펴보면, 프로그램이 시작과 동시에 “로켓: 관제탑, 관제탑”과 “로켓: 모든 이륙 준비 완료”를 출력한다. 그리고 그다음으로 관제탑이 출력되는데, “관제탑: 체크, 활주로 확인”과 “관제탑: 모든 준비가 끝났다. 이륙해도 좋다. 출발.”이 출력된다. 관제탑이 호출이 끝나고 난 다음으로는 다시 로켓으로 돌아와서, “로켓: 출발하겠다.”과 “로켓: 5,4,3,2,1,0”을 출력한다. 그리고 마지막으로 “로켓: 대기권 탈출, 성공..”와 “로켓: 가자 우주로..”을 출력하고 프로그램은 종료되게 된다.

생각해보기

1) 각 동물들의 함수를 만들고, 함수를 호출하여 동물들의 소리를 출력되도록 해 보자.

2) 사칙연산을 함수로 만들어 각 연산에 따라 출력되도록 해 보자.

3) 이진법으로 변환하는 함수를 만들고 함수를 호출하여 십진법을 이진법으로 출력되도록 해 보자.