프로그래밍을 할 때 무작정 코드부터 작성하는 그다지 많지 않습니다. 특히 팀 단위로 프로그램을 작성할 때는 사용할 데이터 구조나 클래스에 대한 분석 작업부터 해야합니다. 그러므로 프로그램 디자인에 대해 많은 부분을 신경써야 합니다.
Abraham Lincoin
"Give me six hours to chop down a tree and i will spend the first four sharpening the axe"
추상화의 원칙은 현실 상황에 맞게 비유하면 이해가 쉅습니다. 요즘은 집집마다 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;
}
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); //#상태에서 벗어날 때 호출되는 메서드.
}
'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 관계
is-a 관계는 OOP의 핵심 개념중 하나인 상속에 대한 것입니다. 상속은 파생, 서브클래스, 확장 등 다양하게 표현합니다.
unity내에서 has-a의 예시
public class UIInGameView : UIView //is-a 관계
{
...
}
다형성이란 Property와 method의 standard set으로 정해두면 그 형식에 맞는 객체라면 어느 것이든 서로 바꿔서 적용할 수 있다는 개념입니다. Class는 정의 Object와 그 Object를 다루는 Code가 서로 맺는 계약고 같습니다. 따라서 모든 Monkey Object는 Oject Class에 따라 정의된 property와 method을 반드시 제공해야 합니다.
이 개념은 base class에도 그대로 적용됩니다. 모든 원숭이는 동물이기 때문에 Monkey Ojbect는 Animal Class에 정의된 property와 method을 모두 제공해야 합니다. 그렇기에 다형성은 상속이 제공하는 장점을 제대로 살리기에 OOP에서 가장 멋진 부분이라 할 수 있습니다.
[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