앞 강의에 이어, 클래스의 구조를 더 자세히 살펴보겠습니다.
속성과 행동
클래스는 속성과 행동으로 구성됩니다.
프로그래밍 언어에서는 속성에 해당하는 것을 ‘변수’라고 하고, 행동에 해당하는 것을 ‘함수’ 또는 ‘메소드’라고 합니다. (정확하게는 속성에 해당하는 것을 ‘필드’라고 지칭하지만, 여기에서는 앞으로의 설명 편의상 ‘변수’라고 하겠습니다.)
참고로, 함수와 메소드는 거의 같은 개념입니다. 현대의 프로그래밍 언어에서는 클래스 내부에 있는 함수들을 주로 메소드라고 부릅니다. 유니티 관련 책에서 ‘함수’ 또는 ‘메소드’라는 용어가 혼용되어 사용되는데, 이 둘은 같은 개념을 가리킵니다.
‘개’라는 클래스를 예로 들어 클래스의 구조를 살펴보겠습니다. ‘개’ 클래스에는 속성과 행동이 있습니다.
속성에 해당하는 것으로는 이름(name), 색(color), 품종(breed) 등의 변수가 있을 수 있습니다.
행동에 해당하는 것은, 예를 들어, 짖는다(bark), 문다(bite), 꼬리 흔든다(wag tail)와 같은 행위들을 나타내는 함수(메소드)입니다.
클래스의 상속
클래스는 ‘상속’ 개념을 가질 수 있습니다. 일상 생활에서 ‘상속’이라고 하면 보통 부모가 자식에게 유산을 남겨 주는 것을 떠 올립니다. 클래스의 ‘상속’ 개념도 비슷하지만 이 경우에는 재산의 상속이라기 보다는 유전자를 전달하는 (유전자의 상속?) 개념에 가깝다고 보시면 됩니다. 즉, 부모가 가지고 있는 속성과 행동을 자식에게 상속한다는 것입니다.
예를 들어, ‘동물(Animal)’ 클래스가 있고, ‘포유류(Mammal)’라는 클래스가 있다면, 이 두 클래스는 부모-자식 관계로 연결될 수 있습니다. ‘동물’ 클래스가 부모가 되고 ‘포유류’ 클래스가 자식이 되는 관계를 형성할 수 있습니다.
여기에 추가적으로 ‘개(Dog)’ 클래스와 ‘원숭이(Monkey)’ 클래스가 ‘포유류’의 자식 클래스로 연결될 수 있습니다. 그런데 개와 원숭이는 부모 자식 관계가 아니라 포유류의 자식으로서 형제에 해당합니다.
이런 식으로 클래스 간의 부모-자식 관계가 형성되면, 조상 클래스에서 정의된 변수나 함수를 자손 클래스에서도 사용할 수 있습니다. 이는 상속의 중요한 특징입니다.
예를 들어, ‘동물’ 클래스에 ‘먹는다(eat)’라는 메소드가 있으면, ‘포유류’, ‘개’, ‘원숭이’ 클래스는 이 메소드를 별도로 정의하지 않아도 사용할 수 있습니다.
마찬가지로, ‘포유류’ 클래스에 ‘번식한다(breed)’라는 메소드가 정의되어 있다면, ‘개’와 ‘원숭이’ 클래스는 이 메소드를 상속받아 사용할 수 있습니다.
만약 ‘개’ 클래스에만 특정한 ‘짖는다(bark)’라는 메소드가 정의되어 있다면, 이 메소드는 ‘개’ 클래스에만 국한되어 사용됩니다. ‘원숭이’ 클래스에는 해당 메소드가 없기 때문에, ‘원숭이’ 클래스는 ‘짖는다’ 메소드를 사용할 수 없습니다.
이처럼 클래스가 상속 관계를 맺을 때, 조상 클래스에서 정의된 메소드나 변수를 자손 클래스에서 사용할 수 있는 것이 상속의 기본 원리입니다. 이 원리를 이해하면 앞으로 유니티 스크립트의 작동 원리를 이해하는 데 큰 도움이 될 것입니다.