OOP(객체 지향 프로그래밍): Object Orient Programming.
객체를 생성하고 코드 구조를 조직화하려 모듈화 하는 프로그래밍 방법.
앞서 배운 클래스는 참조 타입이다. 즉, 클래스가 다른 변수에 할당되거나 전달될 때, 새 복사본이 아닌 원본 객체가 참조된다.
클래스를 public으로 선언하면 다른 클래스에서 현재 클래스의 인스턴스를 생성할 수 있다.
코드를 작성한다.


Hero클래스가 초기화 되면 name은 null값으로 할당되고 exp는 0이 된다.
public으로 선언 된 Hero스크립트는 Learn스크립트에서 인스턴스로 사용이 가능하다.
Hero타입 변수로 Character를 선언한다.
이후 Debug.Log를 사용해 Character의 name 변수와 exp변수를 출력한다.
생성자: 클래스 인스턴스가 생성될 때 자동으로 실행되는 특수한 메서드이다.
생성자는 반환 타입이 없으며 메서드 이름과 클래스 이름이 같다.
초기화 필드값을 설정하는데 사용하며 클래스는 여러 생성자를 가질 수 있다.

이런 식으로 여러 생성자를 사용할 수 있다. 이것을 '생성자 오버로딩'이라고 한다.
생성자 오버로딩을 통해 다양한 초기화 방법을 설정할 수 있고, 코드의 중복을 최소화시킨다.
여러 출력이 필요하다면 Hero스크립트에 PrintStatsInfo메서드를 생성해 Learn스크립트를 간결하게 사용할 수 있다.


구조체: 클래스와 다르게 참조타입이 아닌 값 타입이다. 구조체가 다른 변수에 할당되거나 전달되면 새 복사본이 생성되기 때문에 원본은 참조되지 않는다.
구조체의 필드는 static이나 const로 지정되지 않는 한 선언 내부에서 값으로 초기화될 수 없다.

참조타입
- 힙(Heap)에 저장
- 클래스(class), 배열, 인터페이스
- 크거나 복잡한 데이터에 주로 사용
- 동일한 메모리 참조에 저장하는 변수가 여러 개 있을 때 하나를 바꾸면 모든 변수에 영향을 줌
값 타입
- 스택(stack)에 저장
- int, double, float, bool, char... 등
- 빠르고 경량화된 데이터에 주로 사용
- 별도의 객체로 복사되고 수정된다.(다른 변수에 영향을 주지 않음)
OOP의 주요 규칙 세 가지: 캡슐화, 상속, 다형성
캡슐화(Encapsulation)
외부 코드에 객체의 필드와 메서드를 액세스 하는 방법을 정의하는 것.
접근제한자(access modifier)를 이용해 캡슐화를 구현한다. public, private 등 접근 제한자를 통해 데이터의 동작을 적절히 노출하게끔 한다.
상속(Inheritance)
부모, 자식 개념이 존재한다.
이 개념을 통해 클래스 간의 계층 구조를 형성하고 코드의 중복을 피하고 코드의 재사용성을 높일 수 있다.
에서 ItemBehaviour는 자식 클래스 MonoBehaviour는 부모 클래스로
ItemBehaviour클래스에서 MonoBehaviour의 클래스의 특성과 메서드를 상속받아 사용할 수 있다.
어떤 클래스가 다른 클래스에 상속되면 부모 클래스는 자식 클래스를 인지하지 못하지만, base() 생성자를 이용하면 호출할 수 있다.

base키워드는 부모 생성자를 나타낸다. 따라서 자식 클래스는 매개변수를 부모 생성자에 전달할 수 있다.
다형성(Polymorphsim)
다양한 형태라는 뜻이며 같은 이름의 메서드나 함수가 다양한 객체에서 다르게 동작할 수 있게 하는 능력이다.
부모 클래스에서 virtual로 메서드를 선언, 자식 클래스에서 override로 메서드를 선언하면, override메서드에서 재정의한 코드가 실행된다.
따라서 virtual(가상)으로 지정을 하면 override를 통해 여러 형태로 바꾸어 사용이 가능해 유연한 설계가 가능해진다.

Weapon클래스에 Attack메서드를 virtual로 선언한다.
Weapon클래스를 상속받는 Knife클래스에서 override를 사용해 Attack메서드를 재정의 할 수 있다.
Unity에 적용

Main Camera를 살펴보면 각 컴포넌트들은 유니티에서 클래스로 시작이 된다.
재생버튼을 클릭하면 이 컴포넌트들은 컴퓨터 메모리에서 객체가 되고 해당 필드와 메서드를 갖춘다.
유니티의 모든 게임 오브젝트들은 GameObject클래스에서 상속된다.
Inspector에서 private필드를 표시해야 할 때는 SerializeField를 사용한다.

코드의 컴포넌트에 액세스 하기 위해 코드를 작성했다.
public Transform CamTransform;// 새로운 타입 필드를 추가한다.
CamTransform=this.GetComponent<Tansform>();// CamTransform의 초기화. 이 스크립트는 MainCamera에 연결되어
있다. 따라서 this키워드를 이용해 Transform이라는 컴포넌트를 가져와 CamTranform에 반환한다.
이후 CamTransform의 위치를 출력한다.
MainCamera가 아닌, 다른 게임 오브젝트의 컴포넌트를 가져오기 위해선 Find를 사용할 수 있다.

Directional Light의 컴포넌트인 Transform의 위치를 출력해 보겠다.

LightTransform필드를 선언하고, Find를 통해 Directional Light라는 게임 오브젝트를 찾아, Transform컴포넌트를 LightTransform에 반환한다. 이후 출력한다.

Find메서드는 속도가 약간 느리다는 단점이 있다.
'Unity & C# Basics' 카테고리의 다른 글
| C#책 공부일지 : Simple Animation, Animation Script (0) | 2023.08.17 |
|---|---|
| C#책 공부일지 : 3D공간, 프리펩, Light (0) | 2023.08.17 |
| C#책 공부일지 : Basics2 (0) | 2023.07.27 |
| C# 공부일지 : Basics (1) | 2023.07.12 |
| Unity 공부일지 : SerializeField, Instance, 접근지정자, Awake, Start, Update, 반복문, 클래스 메서드 (0) | 2023.06.16 |