5.1.2 멍멍이와 야옹이가 인사해요2 - 순차
Last updated
Last updated
지난 절까지 개임의 무대(배경화면)까지의 준비는 마쳤다. 이제는 그 무대에서 배우 역할을 할 두 오브젝트, 멍멍이와 야옹이를 만드는 것부터 시작해야 한다. 엔트리에서는 오브젝트 자체를 만드는 일은 할 필요가 없었는데, 우리도 모르게 엔트리가 우리 대신해 미리 만들어 놓았기 때문이다.
파이게임제로에는 이러한 배우 오브젝트를 생성하기 위해 Actor 라는 클래스(class)를 준비해 두었다. 클래스란 용어가 처음 등장했는데 간단히 설명하면 오브젝트(객체)를 정의하는데 사용되는 문법정도라고 이해하자. 마치 우리가 기존에 함수를 정의(definition)하기 위해 사용했봤던 같은 것 말이다.
우리는 이미 함수를 정의한다는 것과 사용한다는 개념이 다르다는 것 정도는 잘 이해하고 있다. 함수를 정의한다는 것은 다른 말로 함수를 만든다는 것인데, 함수는 안에는 이 함수가 호출되어 사용되게 될 경우 이러이러한 일을 하게 된다는 상세 업무명세를 적어 놓게된다. 이후 이 정의된(만들어진) 함수를 사용하기 위해서는 함수의 이름으로(때로는 함수가 요구하는 인자값(argument)과 함께) 함수를 호출하게 되고, 함수는 호출되는 그 순간, 컴퓨터 메모리에 로딩되어 함수 내에 명세된 그 업무를 실제 수행하는 실체화된 작은 프로그램으로서 동작하는 것이다.
클래스와 오브젝트의 관계도 마찬가지이다. 오브젝트를 정의할 때 사용하는 것이 클래스이고, 실제 사용목적으로 호출되어 메모리 상에서 실체화 된 상태를 오브젝트(특별히 이를 인스턴스(Instance)라 호칭)라고 부른다. 즉, 클래스 이름으로 호출해(마치 함수를 함수 이름으로 호출하듯이) 오브젝트를 생성할 수 있는 것이다. 실제 코드를 보면서 이를 자세히 이해해 보자.
새로 추가된 코드는 다음과 같은데, 라이브러리에서 미리 정의된 Actor (게임무대에서 활동하는 배우로서의 의미로 이렇게 이름지어짐) 클래스 호출을 통해 Actor 오브젝트를 생성하고, 컴퓨터 메모리 내에 생성된 오브젝트(인스턴스)는 dog라는 변수에 담아 관리하겠다는 것이다.
참고로 여기서 변수명을 한글로 하고 싶으면, '멍멍이' 이런식으로 한글로 할 수도 있다. 실전에서 일반적으로 활용되진 않지만, 그럼에도 그게 여러분이 가르치는 아이들의 수준(영어식 표현에 익숙하지 않은 저연령 등)에 더 용이하다고 판단한다면 활용해 볼 가치는 있다. 생기초 단계에서는 우선은 "텍스트 코딩은 어렵다"는 선입견을 깨는 것이 훨씬 더 중요하기 때문이다.
여기서 Actor를 유심히 보면 곧바로 함수 호출이 아니고, 클래스 호출이라는 것을 인지할 수 있는데, 어떻게 그것을 단번에 알 수 있냐면 파이썬 문법 관습(꼭 파이썬만이 아닌 다른 프로그래밍 언어도 동일)으로 함수이름은 소문자로 시작해 만들고, 클래스 이름은 대문자로 시작해서 만든다는 관습적인 규칙을 잘 따랐기 때문이다.
클래스 호출도 함수 호출처럼 유사하게 생성시 클래스로 넘겨야 할 인자값이 있을 수도 있고 없을 수도 있는데, Actor는 2가지 인자값을 요구하고 있다. 첫번째 값('dog')은 Actor객체가 외관에 사용하게 될 이미지 파일이름(dog.png)이고, 두번째 값(100, 150)은 그 이미지가 화면에 어디에 그려질지에 대한 위치정보(정확하게는 해당 이미지의 중심값(center)의 화면상에 위치정보)를 오브젝트 생성을 위한 인자값으로 넘기게 된다. 만약 Actor 클래스에 대해 더 잘 알고 싶으면, 파이게임제로 라이브러리 메뉴얼(문서)를 찾아보면 되는데 라이브러리 저자가 직접 해당 클래스의 목적과 사용방법을 상세히 설명하고 있기 때문이다.
여기까지 오브젝트는 잘 생성되어졌고, 이제 생성된 오브젝트를 화면에 나타내야(그려야) 하는데, 지난 시간에 화면전체를 흰색으로 채운 것에 이어서 그 위에 이 오브젝트를그려주면 될 것이다(12번 라인). 따라서, 7번 라인에서 생성된 "멍멍이" 오브젝트를 가리키고 있는(참조하고 있는) dog 변수를 통해 해당 오브젝트가 내장하고 있는 draw 함수를 호출해 화면에 그리면 된다. 이를 코드로는 dog.draw() 라고 표현하면 된다. 여기서도 우리가 기존에 라이브러리 안에 어떤 기능(함수 또는 변수 등) 호출시 많이 사용해 본 .(점 연산자) 활용해, 멍멍이 오브젝트 안에 있는 draw() 함수(메소드)를 호출하고 있는 것이다.
여기서 8번 라인의 코드는 왜 필요할까? dog.scale = 0.5 이란 코드의 의미는 멍멍이 오브젝트 안에 scale 이라는 변수에 값을 0.5 로 변경하고 있다. 만약, 이 코드 없이 지금까지의 코드를 실행시켜보면, 멍멍이 오브젝트의 이미지가 화면에 잘 그려진다는 것을 알 수 있다. 다만, 한 가지 단점이 있는데 멍멍이 오브젝트의 이미지 크기가 너무 크다는 것이다. 그래서, 이 단점을 극복하기 위해, 즉 이미지 크기를 절반으로 줄이기 위해 이 코드가 필요했던 것이다. 이 코드를 추가한 후 다시 실행시켜보면 오브젝트의 이미지가 적당한 크기로 보일 것이다.
처음으로 오브젝트를 생성하고 사용해 보면서 여러분은 새롭게 등장한 이 오브젝트(객체)라는 개념의 실체가 무엇이라고 느껴지는가? 오브젝트 안에는 함수와 변수가 존재하고, 이를 사용하기 위해서는 .(점연산자)를 사용한다는 것에 있어서 아마도 여러분은 오브젝트가 라이브러리랑 매우 유사하고 어쩌면 소형화된 라이브러리의 개념인가? 라고 생각할 수 있을 것 같다. 사용법적인 면에서는 라이브러리와 매우 유사성이 크다할 수 있는데, 탄생 목적과 오브젝트를 직접 설계하고 만드는 과정 자체는 많이 다르다. 반복해서 자주 사용하는 함수들을 어떤 한 공간(라이브러리)에 모아서 활용하면 코드의 재활용성 측면에서 유용하다는 목적에서 탄생한게 라이브러리라 할 수 있다. 오브젝트 역시도 궁극적으로는 코드의 재활용성을 높이려는 목적에서는 동일하긴 하나, 그것과 더불어 소프트웨어 개발의 복잡성을 낮추고자 하는 목적에서 출발하였다고 할 수 있다. 좀 더 상세한 내용을 알고 싶다면, 기존 책에서 언급된 객체지향 프로그래밍 패러다임에 대해 다시한번 읽어보면 좋은 것이다.
이즘에서 코딩에서 말하는 오브젝트(객체)가 무엇인지를 설명하는게 필요하겠다. 오브젝트란 그 이름에서 알 수 있듯이 우리가 살아가고 있는 실 세계(real world)에 존재하는 오브젝트(물체) (예를들어, 컵, 책상, 의자, 꽃병, 텔레비전, 자동차 등등)을 프로그래밍 세계(programming world)에서 가져다 활용하기 위해 오브젝트가 갖는 속성(attribute)과 오브젝트가 할 수 있는 행동(behavior)으로 모델링화한 코드덩어리인 것이다. 참고로 오브젝트의 속성과 행동을 코드적인 표현법에 있어서 속성은 변수로 표현하고, 행동은 함수(이러한 함수들을 지칭할 때 메소드라 부름)로 표현한다.
우리의 첫 오브젝트로서 사용해 본 배우(Actor) 오브젝트는 무엇을 모델링화 한 것인가? 사실 이 오브젝트는 실 세계는 존재하진 않는 것으로, 게임무대라는 프로그래밍 세계 안에서 등장인물 배우로서 역할을 기대하며 만들어 낸 것이다. 여러분이 이 오브젝트를 최초로 디자인 한다면 어떻게 디자인 하겠는가? 이 오브젝트가 해내야 할 역할과 책임은 무엇이며 게임무대라는 공간에서 어떤 속성(변수)을 갖고 어떤 행동(함수)을 하면 되는가를 생각보면 알 수 있다. 먼저 필요한 속성을 생각해보면 배우 오브젝트의 외관은 이미지로 되어있으니, 어떤 이미지 파일로부터 외관을 만들어야 할지의 이미지 이름속성이 필요할 수 있을 것이다. 때론 해당 이미지의 크기를 화면에 맞는 적절한 크기를 가져야 할 수 있기 때문에, 그 크기를 정할 수 있는 크기속성(scale)이 있다면 좋을 것이다. 그밖에 화면상에 어디 위치에 이미지를 나타야 할지의 위치속성(pos)도 필요할 것이고, 만약 이 이미지를 회전시켜 표현하고 싶다면 그에 따른 각도를 정해줄 수 있는 각도속성(angle) 등이 있을 수 있다. 그렇다면, 배우 오브젝트가 가져야 할 행동측면을 생각해보면, 무엇이 있을까? 기본적으로 배우는 화면에 나타내져야(그려져야) 할 것이고, 움직여야 할 것이고, 게임무대라는 특성상 다른 객체와의 접촉(또는 충돌(Conflict)) 했는지의 확인하는 행동 등이 있을 수 있겠다.
Actor 오브젝트는 우리가 방금 예상한 수준에서의 속성과 행동들을 포함한 실제로는 더 많은 속성과 행동들을 갖고 있다.지금당장 구체적으로 Actor 오브젝트가 무슨 속성을 갖고 있고, 무슨 행동을 할 수 있는지에 알고자 한다면, 이미 위에서 언급한 이 오브젝트의 저작자가 만든 메뉴얼을 보고 파악할 수 있다. 그러나 차근차근 이 책의 예제들을 하나씩 격파해 나가면서 자연스럽게 익히게 되어 있으므로 너무 조급해 할 필요는 없다.
이번 장에는 오브젝트(객체)라는 현대 코딩개념에서 가장 중요한 개념을 익히게 된 것을 축하한다. 오브젝트에 대해서는 당장은 이정도의 이해면 충분하고 점점더 심화된 내용은 추후에 더 다뤄질 것을 기대하고, 계속해서 남은 코딩을 이어가 보자.