• [게임 개발] 프로그래밍 - 부모/자식 (parent/child)2014.08.07 PM 03:18

게시물 주소 FONT글자 작게하기 글자 키우기


1. 상속 (Inheritance)의 출현
학교 다니면서 OOP를 공부하던 때였습니다.
상속에 대해 배우면서 부모 클래스와 자식 클래스의 예제를 많이 보았지요.
영어로는 parent class, child class 라고 표현하더라구요.


95년, 96년이었으니 MS Dos 환경에서 TC, BC로 컴파일 하던 상황이었거든요.
당시까지만 해도 OOP는 개념적인 것이었고, Windows 95를 깔고 조금씩 익숙해지던 참이었습니다.

Class의 상속에 대해 공부한 것까지는 문제가 없었는데.
MFC와 Visual Basic으로 프로그래밍을 시작하면서부터 뭔가 문제가 발생하기 시작했습니다.
객체간의 관계에서 부모와 자식이라는 (상속과 동일한 단어를 사용하나 의미는 다른) 관계가 나타난 것입니다.


2. 객체간의 관계
얼굴 그림과 눈 그림이 있습니다.
얼굴 그림과 눈 그림은 서로 따라다니지요. (얼굴이 움직이면 눈도 같이 움직입니다)
이 경우, 구현하면서 얼굴 그림 위에 눈 그림을 그리게 되는데요.
얼굴 그림은 부모(parent), 눈 그림은 자식(child)으로 설명합니다.


3. 개념의 충돌
상속 관계는 기본적으로 부모의 코드를 자식이 공유하는 개념인데,
객체간의 관계는 생성된 객체의 제어와 관련된 개념이지요.
이와 같이 다른 개념인데 공부를 하다보니 두 경우 모두 부모 / 자식 이라는 용어를 사용해서 설명합니다.
그로 인해 명확한 개념 정리를 못한 채, 일단 동작하는 과제 결과물만 만들고 상황을 봉합했습니다.
덕분에 20년이 지난 지금까지도 이 두 개념은 서로 섞여 푸욱 썩어가고 있었지요.


4. 재등장
최근 안드로이드 프로그래밍을 공부하면서, 봉인해 두었던 저의 혼란이 다시 부활했습니다.
대표적인 것이 글에 첨부된 그림처럼 ViewGroup과 View의 포함 관계입니다.

재미있는 것은 ViewGroup과 View의 경우, 상속관계이면서 동시에 객체간의 관계를 맺고 있습니다.
상속에서도 부모 - 자식이라고 하면서, 객체간에도 부모 - 자식이라고 하는 것이죠.
안그래도 Android의 Layout은 가변식 동적 구조라서 머리가 아픈데... 제대로 걸린 거지요.


5. 해결책
일단 Android reference 등에서는 이 둘을 다르게 표현해 주고 있습니다. (제게는 큰 도움이 되었습니다)
상속에서는 Super class - Sub class 라고 표현합니다.
물론 parent class - child class 혹은 base - derived 등의 표현도 유효합니다. 개발자 블로그들을 검색하다보면 이렇게 표현하는 분들도 많이 계시고요. 하지만 일단 Android reference에서는 일반적으로 super - sub 로 표현하고 있습니다.
이 표현이 더욱 빛을 발하는 것은, sub class에서는 항상 super 라는 객체를 가지고 있다는 점이죠.
상속 관계에서 부모의 함수를 호출하거나 속성을 구하고 싶을 때에는 super로 접근하면 됩니다.

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
public class
View
extends Object
implements Drawable.Callback KeyEvent.Callback AccessibilityEventSource

public abstract class
ViewGroup
extends View
implements ViewManager ViewParent

위에서 보이듯이 ViewGroup은 View를 상속받은 class이지요.
즉, super class = View, sub class = ViewGroup 입니다.
옛날 학생때 제가 배울 때에는 이를 parent class, child class로 많이 불렀기 때문에 혼란이 심했지요.
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=


객체간의 관계에서는 parent와 child로 표현합니다.
얼굴 그림과 눈 그림의 예에서 더미 코드로 보자면
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
View face = View Image(얼굴);
View eye = View Image(eye);

/*
* face : parent
* eye : child
*/
face.addView(eye);
// void addView(View child, int index, ViewGroup.LayoutParams params)

View parent = eye.getParent();
// final ViewParent getParent()
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=



이번에 다시 공부하며서 생각한 건데,
상속 관계는 부모 자식이라기 보다는 동물분류학(종속과목강문계)
그리고 객체간의 관계는 주종 관계에 가까운거 같은데 말이죠.
얼굴이 주인님, 눈이 종놈... 주인님이 종놈 불러다가 이것 저것 시키고, 주인님이 어디 가면 졸졸졸 따라다니고...


차근 차근 개념을 쌓아오신 분들에게는 가벼운 에피소드일 것 같지만...
제게 있어서는 20년을 괴롭혀오던 내용이라 이번에 아예 작정하고 정리해 보았습니다.
댓글 : 9 개
좋은 표현이네요.
부모 자식보다는 주종의 관계가 더 와닿네요 ㅋㅋ
아 잠깐... 생각해보니 주종은 아니겠다...
부모의 지식을 자식들이 무상으로 사용하는거니... 주종은 아니겠네요 ㅋ;;
그렇네요. 주종도 적당한 표현은 아니네요.
그런데 왠지 저에게는 농장주랑 소작농같은 장면이 자꾸 겹쳐서요. ㅎㅎㅎ
농장주가 소작농들 뽑아놓고 이거해라 저거해라 일 시키는 느낌이랄까요?
진짜 말이 부모자식이지
하는 짓은 주종관계죠 ㅋㅋㅋㅋㅋㅋ
공감해 주시는 분이 계셔서 즐겁습니다. :D
부모 자식관개라 그냥 보편적인놈 그보편적인놈을사용해 특정 기능에 최적화 시킨노 정도되지 않을까요?
그렇죠. 공부하면서 base(기반) class - derived(파생) class 가 의미상 제일 잘 맞는 호칭인거 같았어요. 대부분 parent / child 로 부르면서 설명하더라구요. 그래서 처음 공부할 때 오히려 개념이 헷갈리는 느낌도 있었어요. 대부분의 경우 자식이 부모보다 기능도 많고 일도 많이 해서... 부모란 이렇게 무기력한 것인가? 싶었거든요. (나중에 코딩하다보면 부모의 역할이 엄청나다는 것을 깨닫긴 하지만요)
전 OOP관계를
묶으면 편하게 관리 할 수 있는 것들 이란 관점에서 접근합니다.
virtual 개념을 적용할 수 있을때 가장 강력한 파워를 보인다고 생각되구요~
OOP 알고나면 되게 실용적인 내용들인데, 처음에 공부할때는 머리가 핑핑 돌죠.
생각해보면 중고등학교 수학시간에 "이걸 왜 배우는지 모르면서" 공식들을 외우는 느낌이랄까요? 나중에 사회 생활하면 통계나 배열같은것도 다 유용한데 말이죠.
친구글 비밀글 댓글 쓰기