[Unity/C++] 4 Characteristics of OOP

녹차·2024년 8월 2일

Unity

목록 보기
6/11
post-thumbnail

Introduction

객체지향 철학

Body

프로그래밍을 할 때 무작정 코드부터 작성하는 그다지 많지 않습니다. 특히 팀 단위로 프로그램을 작성할 때는 사용할 데이터 구조나 클래스에 대한 분석 작업부터 해야합니다. 그러므로 프로그램 디자인에 대해 많은 부분을 신경써야 합니다.

Abraham Lincoin
"Give me six hours to chop down a tree and i will spend the first four sharpening the axe"

01. Abstration(추상화)

추상화의 원칙은 현실 상황에 맞게 비유하면 이해가 쉅습니다. 요즘은 집집마다 TV가 한 대씩 있어서 TV를 켜거나 끄는 방법, 채널을 변경하는 방법, 불륨을 조절하는 방법 etc.. tv의 기능을 누구나 잘 알고있습니다. TV 내부에서 구체적으로 어떻게 작동하는지는 설명하기는 쉅지 않지만, 사용하는 데는 아무런 어려움이 없습니다.

그 이유는 TV의 내부 구현외부 인터페이스가 명확히 분리되어 있기 때문입니다. TV를 사용할려면 전원 버튼, 채널 버튼, etc TV의 인터페이스만 알아도 되기에 이 과정에서 내부 작동 원리를 알 필요는 없습니다.

이와 같이 프로그래밍에서 cmath, iostream의 내부 구현은 모르더라도 cout, cin 등등 인터페이스를 사용할 수 있습니다.

#include<cmath>
#include<iostream>

namespace std;

int main()
{
	int num1;
    int num2;
    
    cin << num1 << endl;
    cout << num1.sqrt() << endl;
}

interface & implementation

OOP에서 인터페이스는 외부에서 접근할 수 있는 클래스의 프로퍼티와 메서드로 구성됩니다. 잘 정의한 인터페이스는 public 메서드만 가지고 있고, 클래스의 property는 절대 공개하면 안되기에 Get/Set 통해 접근하도록 구성해야 합니다.

unity version
public interface IState<T>
{
    public void Begin(T owner); //#상태에 진입할 때 호출되는 메서드.

    public void Runtime(T owner); //#상태가 활성화되어 있는 동안 매 프레임 호출되는 메서드.

    public void End(T owner); //#상태에서 벗어날 때 호출되는 메서드.
}

외부에 공개할 인터페이스 결정하기

  1. 사용자 고려하기
  2. 용도 고려하기(API, 유틸리티 클래스 or 라이브러리, 서브시스템 인터페이스스)

02. Inheritance(상속)

What is 'has-a'

'A는 B를 가진다 혹은 A에 B가 있다고 표현되는 객체 관계를 has-a(포함 관계, 소유 관계) 또는 집합 관계라고 합니다. 한 객체가 다른 객체의 일부분이라고 생각하면 이해하기 쉅습니다.

has-a 관계에 대한 현실세계의 예는 동물원과 원숭이의 관계로 들 수 있습니다. 동물원에는 원숭이가 있습니다. or 동물원은 원숭이를 가지고 있다고 표현할 수 있습니다. 이를 코드로 나타내면 동물원 객체는 원숭이 컴포넌트를 가집니다.

이 또한 Button과 Text는 분명히 다른 객체이지만 일정한 관계를 맺고 있습니다.

unity내에서 has-a의 예시
[SerializeField] TextMeshProUGUI curStageTxt; //has-a 관계	
[SerializeField] TextMeshProUGUI subTitleTxt; //has-a 관계
[SerializeField] TextMeshProUGUI titleTxt; //has-a 관계

public StateMachine<UIInGameView> StateMachine { get; set; } //has-a 관계

What is 'is-a'

is-a 관계는 OOP의 핵심 개념중 하나인 상속에 대한 것입니다. 상속은 파생, 서브클래스, 확장 등 다양하게 표현합니다.

unity내에서 has-a의 예시
public class UIInGameView : UIView //is-a 관계
{
	...
}

03. Polymorphism(다형성)

다형성이란 Property와 method의 standard set으로 정해두면 그 형식에 맞는 객체라면 어느 것이든 서로 바꿔서 적용할 수 있다는 개념입니다. Class는 정의 Object와 그 Object를 다루는 Code가 서로 맺는 계약고 같습니다. 따라서 모든 Monkey Object는 Oject Class에 따라 정의된 property와 method을 반드시 제공해야 합니다.

이 개념은 base class에도 그대로 적용됩니다. 모든 원숭이는 동물이기 때문에 Monkey Ojbect는 Animal Class에 정의된 property와 method을 모두 제공해야 합니다. 그렇기에 다형성은 상속이 제공하는 장점을 제대로 살리기에 OOP에서 가장 멋진 부분이라 할 수 있습니다.

04. Encapsulation(캡슐화)

[Title("Text 관련")][Space(25)]
[SerializeField] TextMeshProUGUI curStageTxt; //외부에서 접근 X
[SerializeField] TextMeshProUGUI subTitleTxt; //외부에서 접근 X
[SerializeField] TextMeshProUGUI titleTxt; //외부에서 접근 X

public StateMachine<UIInGameView> StateMachine { get; set; } //외부에서 접근 O
public TutorialController TutorialController { get; set; } //외부에서 접근 O

Conclusion

profile
CK23 Game programmer

0개의 댓글