CLASS 와 STRUCT 차이
SRUCT 는 깊은 복사
CLASS 는 얕은 복사 ( 참조 )
객체지향
있는그대로 알아서 돌아면 된다 그것이 객체지향
어떠한 형태가 있고 이를 이제 가져가서 사용
일종의 부품을 만든다라고 생각 할 수도 있음 만들어 놨으면 그 부품을 가져다 쓰면 될 뿐
서로 엉켜서 연관되서 돌아가지 않아도 되게 만드는 것을 목표로 함.
Namespace
이름이 주어진 공간이라고 생각하면 된다.
예를 들어 내가만든 class A
A가 만든 class A 가 있다면 class 이름이 중복이되어 문제가 된다.
이를 구분하기 위한것이 namespace
MySpace.A
MadeByA.A
namespace MySpace{
class A{
불라불라불라불라
}
}
namespace YourSpace{
classs A{
불라불라
}
}
Class 상속
public class 자식이름 : 부모이름
class Child : Parent
{
}
Class 오버라이딩
public
class Parent
{
public void Print() {
Debug.Log("Parent");
}
}
public
class Child
{
public new
void Print()
{
Debug.Log("Child");
}
}
Class 다형성
다양한 형태를 가지는 성질로 모든 자식은 부모처럼 취급될 수 있다. !
이때 어디서 Pring() 를 호출하던 Garand Parent 가 호출된다 !!
Parent 를 상속받는 모든 자식 class 는 Parent 형태로 관리가가능하다. 즉
Parent[ ] 을 통해 어떤 형태의 자식이든, 몇 단계 밑에 자식들 모두를 담을수 있다.
위의 메모리 구조를 보면 이유를 알수있다.
Child 를 선언해도 GrandParent Parent 등이 다 만들어져 있다는 것.
※ Private : 안방 / 엄마아빠만 갈수있음
Protected : 우리집 / 우리 가족만 올수있음
Public : 아파트 / 누구든 접근은 가능
가상 함수 ( Virtual ) ( Virtual 파괴자와 묶어서 회사면접 100% ?! )
기본 형태를 선언만 하고 자식이 각자 구현을해서 자식이 부를때 알맞은 함수를 불러옴
public
class GrandParent
{
public virtual
void
Print()
{ Debug.Log(“Grand
Parent");
}
}
public
class Parent
{
public override void
Print()
{ Debug.Log(“Parent");
}
}
public
class Child
{
public override void
Print()
{ Debug.Log(“Child");
}
}
이러한 형태로 되어있고
GrandParent grandParent
= null;
grandParent
=
new
Parent();
grandParent.Print();
grandParent
=
new
Child();
grandParent.Print();
이렇게 쓰면 결과값이 어떻게 될까 ??
Parent
Child
순으로 출력 된다.
GrandParent 로 만들어진 grandParent 는 메모리에서 GrandParent 까지밖에 못봄 만약 Parent 단계에만 있는 새로운 함수가 있다면 그것은 호출할수 없다.
모든 자식은 부모가 될수 있지만, 부모가 자식이 될순 없는것
GrandParent 로 만들어져서 override 된 print 함수들은 호출된거에 따라 다르게 호출된다. 하지만 다른형태 Parent , Child 만의 무언가에는 접근이 불가능
애가 커서 할아버지가 될순 있지만 할아버지가 어려져서 애가될순없다.
추가적으로 Parent p = (Parent)gp ;
p.Print() 를 하면 뭐가 호출될까??
Child 가 호출 된다.
※ MonoBehaviour 을 상속받는 class 의 이름이 파일이름과 같아야하는것 나머지는 상관 없다.
※ using System.Collections.Generic List, Dictionary 사용을 위해 추가해줘야한다.
List
배열의 단점인 정적인 것을해결한 것 List 는 동적 배열이라고 할수 있다.
List 는 System.Collections.Generic 네임 스페이스에 선언도어있다.
초기화
List < 자료형 > listName = new List < 자료형 >( );
사용법
Add( Value ) : 뒤에다가 자료 추가 Push_back 이라고 봐도 무방
Insert( Index , Value ) : 자료를 Index 위치에 끼워넣는다.
Remove( Value ) 해당 값을 삭제
RemoveAt ( Index ) Index 위치에 값을 삭제
Contains( Value ) 해당 값을 가지고 있다면 true
Clear( ) 안에 요소 다 삭제
Count 안에 요소 갯수 반환
Dictionary
키와 Value 쌍으로 관리하는 자료형 ( map 을 생각해보자 )
중복 Key 값은 허용되지 않는다 !
초기화
Dictionary < key_type , value_type > dicName = new Dictionary < key_type ,value_type > ( ) ;
사용법
Add( Key, Value ) 추가인데 만약 같은 key 값에 대해 Add를 또 실행할경우 덮어 쓰게 된다.
Remove( Key ) Key에 해당하는 값을 삭제
ContainsKey( Key ) Key 있다면 반환
ContainsValue( Value ) 있으면 True
Count 요소 갯수 ( 키 값이 string 이라면 사용 불가능한다 그리고 0에서부터 순차적으로 key값을 사용했을때 성립한다. )
Clear( ) 위와 동일
숙제 : Boxing Unboxing 조사 해오기 !!