> For the complete documentation index, see [llms.txt](https://jjlee.gitbook.io/pygame_zero-entry_basic/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://jjlee.gitbook.io/pygame_zero-entry_basic/start_coding/1.2-dog-cat.md).

# 5.1.2 멍멍이와 야옹이가 인사해요2 - 순차

지난 절까지 개임의 무대(배경화면)까지의 준비는 마쳤다. 이제는 그 무대에서 배우 역할을 할 두 오브젝트, 멍멍이와 야옹이를 만드는 것부터 시작해야 한다. 엔트리에서는 오브젝트 자체를 만드는 일은 할 필요가 없었는데, 우리도 모르게 엔트리가 우리 대신해 미리 만들어 놓았기 때문이다. &#x20;

파이게임제로에는 이러한 배우 오브젝트를 생성하기 위해 Actor 라는 **클래스(class)**&#xB97C; 준비해 두었다. 클래스란 용어가 처음 등장했는데 간단히 설명하면 오브젝트(객체)를 정의하는데 사용되는 문법정도라고 이해하자. 마치 우리가 기존에 함수를 정의(definition)하기 위해 사용했봤던 [def 문법](https://jjlee.gitbook.io/entry-python/basic_syntax/3.1-hello-world#undefined-5) 같은 것 말이다.&#x20;

우리는 이미 **함수를 정의한다는 것과 사용한다는 개념이 다르다는 것 정도는 잘 이해하고 있다.** 함수를 정의한다는 것은 다른 말로 함수를 만든다는 것인데, 함수는 안에는 이 함수가 호출되어 사용되게 될 경우 이러이러한 일을 하게 된다는 상세 업무명세를 적어 놓게된다. 이후 이 정의된(만들어진) 함수를 사용하기 위해서는 함수의 이름으로(때로는 함수가 요구하는 인자값(argument)과 함께) 함수를 호출하게 되고, 함수는 호출되는 그 순간, 컴퓨터 메모리에 로딩되어 함수 내에 명세된 그 업무를 실제 수행하는 실체화된 작은 프로그램으로서 동작하는 것이다.

### 클래스와 오브젝트의 차이 <a href="#class_object" id="class_object"></a>

클래스와 오브젝트의 관계도 마찬가지이다. **오브젝트를 정의할 때 사용하는 것이 클래스이고, 실제 사용목적으로 호출되어 메모리 상에서 실체화 된 상태를 오브젝트(특별히 이를 인스턴스(Instance)라 호칭)라고 부른다.** 즉, 클래스 이름으로 호출해(마치 함수를 함수 이름으로 호출하듯이) 오브젝트를 생성할 수 있는 것이다. 실제 코드를 보면서 이를 자세히 이해해 보자.

```python
from pgzhelper import *

TITLE = '멍멍이와 야옹이가 인사해요'
WIDTH = 480
HEIGHT = 265

dog = Actor('dog', (100, 150))

def draw():
    screen.fill('white')
```

새로 추가된 코드는 다음과 같은데, 라이브러리에서 미리 정의된 Actor (게임무대에서 활동하는 배우로서의 의미로 이렇게 이름지어짐) 클래스 호출을 통해 Actor 오브젝트를 생성하고, 컴퓨터 메모리 내에 **생성된 오브젝트(인스턴스)는** **dog**라는 변수에 담아 관리하겠다는 것이다.&#x20;

{% hint style="info" %}
참고로 여기서 변수명을 한글로 하고 싶으면, '멍멍이' 이런식으로 한글로 할 수도 있다. 실전에서 일반적으로 활용되진 않지만, 그럼에도 그게 여러분이 가르치는 아이들의 수준(영어식 표현에 익숙하지 않은 저연령 등)에 더 용이하다고 판단한다면 활용해 볼 가치는 있다. 생기초 단계에서는 우선은 "*텍스트 코딩은 어렵다*"는 선입견을 깨는 것이 훨씬 더 중요하기 때문이다.
{% endhint %}

```python
dog = Actor('dog', (100, 150))
```

**여기서 Actor를 유심히 보면 곧바로 함수 호출이 아니고, 클래스 호출이라는 것을 인지할 수 있는데,** 어떻게 그것을 단번에 알 수 있냐면 **파이썬 문법 관습(꼭 파이썬만이 아닌 다른 프로그래밍 언어도 동일)으로 함수이름은 소문자로 시작해 만들고, 클래스 이름은 대문자로 시작해서 만든다는 관습적인 규칙**을 잘 따랐기 때문이다.&#x20;

*클래스 호출도 함수 호출처럼 유사하게 생성시 클래스로 넘겨야 할 인자값이 있을 수도 있고 없을 수도 있는데*, Actor는 2가지 인자값을 요구하고 있다. 첫번째  값('dog')은 Actor객체가 외관에 사용하게 될 이미지 파일이름(dog.png)이고, 두번째  값(100, 150)은 그 이미지가 화면에 어디에 그려질지에 대한 위치정보(정확하게는 해당 이미지의 중심값(center)의 화면상에 위치정보)를 오브젝트 생성을 위한 인자값으로 넘기게 된다. 만약 Actor 클래스에 대해 더 잘 알고 싶으면, [파이게임제로 라이브러리 메뉴얼(문서)](https://pygame-zero.readthedocs.io/en/latest/builtins.html#actors)를 찾아보면 되는데 라이브러리 저자가 직접 해당 클래스의 목적과 사용방법을 상세히 설명하고 있기 때문이다.&#x20;

{% code lineNumbers="true" %}

```python
from pgzhelper import *

TITLE = '멍멍이와 야옹이가 인사해요'
WIDTH = 480
HEIGHT = 270

dog = Actor('dog', (100, 150))
dog.scale = 0.5

def draw():
    screen.fill('white')
    dog.draw()
```

{% endcode %}

여기까지 오브젝트는 잘 생성되어졌고, 이제 생성된 오브젝트를 화면에 나타내야(그려야) 하는데, 지난 시간에 화면전체를 흰색으로  채운 것에 이어서 그 위에 이 오브젝트를그려주면 될 것이다(12번 라인). 따라서, 7번 라인에서 *생성된 "멍멍이" 오브젝트를 가리키고 있는(참조하고 있는) dog 변수를 통해* 해당 오브젝트가 내장하고 있는 draw 함수를 호출해 화면에 그리면 된다. 이를 코드로는 **dog.draw()** 라고 표현하면 된다. 여기서도 우리가 기존에 라이브러리 안에 어떤 기능(함수 또는 변수 등) 호출시 많이 사용해 본 **.(점 연산자)** 활용해,  멍멍이 오브젝트 안에 있는 draw 함수(메소드)를 호출하고 있는 것이다.

여기서 8번 라인의 코드는 왜 필요할까? dog.scale =  0.5 이란 코드의 의미는 멍멍이 오브젝트 안에 scale 이라는 변수에 값을 0.5 로 변경하고 있다. 만약, 이 코드 없이 지금까지의 코드를 실행시켜보면, 멍멍이 오브젝트의 이미지가 화면에 잘 그려진다는 것을 알 수 있다. 다만, 한 가지 단점이 있는데 멍멍이 오브젝트의 이미지 크기가 너무 크다는 것이다. 그래서, 이 단점을 극복하기 위해, 즉 이미지 크기를 절반으로 줄이기 위해 이 코드가 필요했던 것이다. 이 코드를 추가한 후 다시 실행시켜보면 오브젝트의 이미지가 적당한 크기로 보일 것이다.

### 오브젝트(객체)란 무엇인가? <a href="#object" id="object"></a>

처음으로 오브젝트를 생성하고 사용해 보면서 여러분은 새롭게 등장한 이 오브젝트(객체)라는 개념의 실체가 무엇이라고 느껴지는가? *오브젝트 안에는 함수와 변수가 존재하고, 이를 사용하기 위해서는 .(점연산자)를 사용한다는 것에 있어서 아마도 여러분은 오브젝트가 라이브러리랑 매우 유사하고 어쩌면 소형화된 라이브러리의 개념인가?* 라고 생각할 수 있을 것 같다. **사용법적인 면에서는 라이브러리와 매우 유사성이 크다할 수 있는데, 탄생 목적과 오브젝트를 직접 설계하고 만드는 과정 자체는 많이 다르다.** 반복해서 자주 사용하는 함수들을 어떤 한 공간(라이브러리)에 모아서 활용하면 코드의 재활용성 측면에서 유용하다는 목적에서 탄생한게 라이브러리라 할 수 있다. 오브젝트 역시도 궁극적으로는 코드의 재활용성을 높이려는 목적에서는 동일하긴 하나, 그것과 더불어 소프트웨어 개발의 복잡성을 낮추고자 하는 목적에서 출발하였다고 할 수 있다. 좀 더 상세한 내용을 알고 싶다면, 기존 책에서 언급된 [객체지향 프로그래밍 패러다임](https://jjlee.gitbook.io/entry-python/paradigm/4.4-object-oriented)에 대해 다시한번 읽어보면 좋은 것이다.

이즘에서 코딩에서 말하는 오브젝트(객체)가 무엇인지를 설명하는게 필요하겠다. **오브젝트란 그 이름에서 알 수 있듯이 우리가 살아가고 있는 실 세계(real world)에 존재하는 오브젝트(물체) (예를들어, 컵, 책상, 의자, 꽃병, 텔레비전, 자동차 등등)을 프로그래밍 세계(programming world)에서 가져다 활용하기 위해 오브젝트가 갖는 속성(attribute)과 오브젝트가 할 수 있는 행동(behavior)으로 모델링화한 코드덩어리인 것이다.** *참고로 오브젝트의 속성과 행동을 코드적인 표현법에 있어서 **속성은 변수로 표현하고, 행동은 함수(이러한 함수들을 지칭할 때 메소드라 부름)로 표현한다.***&#x20;

우리의 첫 오브젝트로서 사용해 본 배우(Actor) 오브젝트는 무엇을 모델링화 한 것인가? 사실 이 오브젝트는 실 세계는 존재하진 않는 것으로, 게임무대라는 프로그래밍 세계 안에서 등장인물 배우로서 역할을 기대하며 만들어 낸 것이다. 여러분이 이 오브젝트를 최초로 디자인 한다면 어떻게 디자인 하겠는가? 이 오브젝트가 해내야 할 역할과 책임은 무엇이며 게임무대라는 공간에서 어떤 속성(변수)을 갖고 어떤 행동(함수)을 하면 되는가를 생각보면 알 수 있다. 먼저 필요한 속성을 생각해보면 배우 오브젝트의 외관은 이미지로 되어있으니, 어떤 이미지 파일로부터 외관을 만들어야 할지의 **이미지 이름속성**이 필요할 수 있을 것이다. 때론 해당 이미지의 크기를 화면에 맞는 적절한 크기를 가져야 할 수 있기 때문에, 그 크기를 정할 수 있는 **크기속성(scale)**&#xC774; 있다면 좋을 것이다. 그밖에 화면상에 어디 위치에 이미지를 나타야 할지의 **위치속성(pos)**&#xB3C4; 필요할 것이고, 만약 이 이미지를 회전시켜 표현하고 싶다면 그에 따른 각도를 정해줄 수 있는 **각도속성(angle)**  등이 있을 수 있다. 그렇다면, 배우 오브젝트가 가져야 할 행동측면을 생각해보면, 무엇이 있을까? 기본적으로 배우는 화면에 나타내져야(**그려져야**) 할 것이고, **움직여야** 할 것이고, 게임무대라는 특성상 다른 객체와의 **접촉(또는 충돌(Conflict)) 했는지**의 확인하는 행동 등이 있을 수 있겠다.

Actor 오브젝트는 우리가 방금 예상한 수준에서의 속성과 행동들을 포함한 실제로는 더 많은 속성과 행동들을 갖고 있다.지금당장 구체적으로 Actor 오브젝트가 무슨 속성을 갖고 있고, 무슨 행동을 할 수 있는지에 알고자 한다면, 이미 위에서 언급한 이 오브젝트의 저작자가 만든 [메뉴얼](https://pygame-zero.readthedocs.io/en/stable/builtins.html#actors)을 보고 파악할 수 있다. 그러나 차근차근 이 책의 예제들을 하나씩 격파해 나가면서 자연스럽게 익히게 되어 있으므로 너무 조급해 할 필요는 없다.

이번 장에는 오브젝트(객체)라는 현대 코딩개념에서 가장 중요한 개념을 익히게 된 것을 축하한다. 오브젝트에 대해서는 당장은 이정도의 이해면 충분하고 점점더 심화된 내용은 추후에 더 다뤄질 것을 기대하고, 계속해서 남은 코딩을 이어가 보자.
