학원

11일차 - 2024-08-16

하타라시 2024. 8. 16. 18:31

 

 

F9키로 해당 라인에 중단점이 생깁니다.

그리고 F5키를 눌러서 디버깅 모드에 진입하고, 유니티 내에서 실행하면 됩니다.

추가로 한번 더 F9키를 누르면 중단점이 사라집니다.

 

 

상수는 const와 readonly가 있습니다.

이 둘 다 상수라는 점에서 비슷하지만 약간의 차이가 있습니다.

가장 큰 차이점은 readonly는 런타임 상수라는 점입니다.

생성자에서 1회에 한해 초기화가 가능합니다.

const는 컴파일 시점에 값이 정해집니다.

https://holjjack.tistory.com/95

 

 

기본적으로 암시적 형변환과 명시적 형변환이 있는데 , 명시적으로 써주는게 야근하는 시간을 줄일지도 모른다고 이해하였습니다. 무섭습니다....

https://killu.tistory.com/24

이것이 암시적 형변환이고,

 

이것이 명시적 형변환입니다.

좋은 습관을 들이면 좋기때문에 되도록 명시를 하는 쪽으로 하려고 합니다.

 

 

 

object는 기본적인 클래스의 최상위 부모입니다.

익숙한 클래스를 따라가면 결국 object가 나올 것입니다.

https://rpgmakerxp.tistory.com/51

 

아래는 Object입니다.

MonoBehaviour의 부모를 추적한 결과 Object에 도달하였습니다.

 

GameObject와 Transform을 추적해도 동일한 결론입니다.

추가로 object와 Object와 비슷하므로 조심해야할 것 같습니다.

추후 자료를 찾아서 링크를 거는 것이 목표입니다.

 

 

public private protected에 관한 내용입니다.

public은 어떤 클래스에서도 해당 변수를 접근 가능하게합니다.

private는 해당 변수가 선언된 클래스 내부에서만 사용 가능합니다.

protected는 해당 변수가 선언된 클래스와 그 클래스를 상속받는 또 다른 클래스에서만 사용 가능합니다.

 

직접적으로 상속받은 Player2는 testValue에 엑세스 할 수 있지만,

간접적으로 사용하는 Player3의 경우는 testValue의 보호수준 때문에 접근 할 수 없습니다.

https://geukggom.tistory.com/83

 

 

우선 상속에 관한 내용입니다.

Charater2를 상속받은 Player1 ~ Player3까지 있습니다.

차이점은 Player1의 경우에는 base 즉 부모의 Test를 사용하게 됩니다.

나머지 Player2 오버라이드를 해서 사용하였고,

Player3는 오버라이드는 안했지만 진행하였습니다.

 

Player3는 override를 하지않았으므로, Charater2의 Test를 불러오게 됩니다.

 

 

타 클래스에서 해당 정보를 실행하였습니다.

Charater2에 Player1 ~ Player3를 넣었으므로 업 캐스팅입니다.

 

만약 반대로 넣게되면 다운 캐스팅이라고 불립니다.

 

 

이를 어거지로 형변환해서 넣는경우, 당연하게도 예외가 발생됩니다.

 

하지만 약간 바꿔서 업 캐스팅 먼저하고 다운캐스팅을 하게되면 결과가 달라집니다.

이는 상속에 관한 것이 원인입니다.

https://kkj4818.tistory.com/4

 

우선 순서만 보자면 Player1을 Charater2라는 부모에 넣었습니다.

가능한 이유는 Player1은 Charater2를 가지고 있기 때문입니다.

 

즉 Player1을 Charater2에 넣는 과정에도 Charater2의 정보가 남아있는 것입니다.

대략적인 이유는 이러하고 상세한 이유는 추후 조사를 좀 더 해보겠습니다.

 

해당 메소드에 쓰인 virtual은 가상화라는 친구입니다.

자식 클래스에서 메소드를 재정의 할 수 있도록 도와줍니다.

https://learn.microsoft.com/ko-kr/dotnet/csharp/language-reference/keywords/virtual

 

Player1의 경우는 base를 활용해서 부모의 Test를 그대로 실행하였습니다.

그 외에는 override된것이 원활하게 실행됩니다.

 

 

 

is는 리턴 값이 bool로 나오게 됩니다.

우선 순서대로 Player1이 Charater2가 해당되는가 ? True

Player2가Player1에 해당되는가 ? False

Player3가 Player3에 해당되는가 ? True

라는 결과가 나옵니다.

 

 

as는 해당 클래스 혹은 null를 리턴하게 됩니다.

Player2와 Player1을 비교했던 부분은 일치하지않으므로 null을 리턴하고 그 외에는 올바르게 리턴되었습니다.

 

 

 

 

부모에서 만약 abstract가 들어가면 무조건 재정의를 해줘야합니다.

재정의 하자마자 에러가 사라진 모습입니다.

 

 

제네릭 클래스는 보통 <T>를 넣어서 구현하게 됩니다.

어떠한 타입이 들어와도 활용가능하게 됩니다.

https://www.csharpstudy.com/CSharp/CSharp-generics.aspx

 

 

스택이 잘 작동하다가 예외가 발생하게 됩니다.

 

 

직접 구현한 Stack은 배열로 구상하였는데, IndexOutOfRangeException 해당 예외가 발생합니다.

 

Pop에 Debug.Assert(조건, 출력); 이것이 있습니다.

이것은 코드검증을 위한 것이며, 조건에 해당하는 경우에 출력되게 됩니다.

릴리즈때는 해당 코드는 무시되므로 성능저하가 되지않으면서 작동가능합니다.

굉장히 중요한 친구로 이해했습니다.

https://velog.io/@sour_gexko/%EC%96%B4%EC%84%9C%ED%8A%B8assert

 

 

 

감사합니다.