0304 인턴십

최태선·2022년 3월 4일
0

ICT인턴십

목록 보기
4/19

Property

C#에서 프로퍼티는 get set을 쉽게 설정하고 사용할 수 있도록 해준다.

public int Age
        {
            get
            {
                return age;
            }
            set
            {
                age = value;
            }
        }
        

선언

 student.Age = 13;
            student.Name = "로버트 할리";
            student.Name = "김철수";

            Console.WriteLine("저의 이름은 " + student.Name + "이고, 나이는 " + student.Age + "살 입니다.");

실행

출처 : https://blog.hexabrain.net/153

readonly와 const의 차이

const

컴파일 타입의 상수이다. (컴파일 시 const 변수의 값을 가져온다.)
내장자료형 (정수형, 실수형, Enum, String)에 대해서만 사용 할 수 있다.
변수 선언과 동시에 값을 할당 해야 한다.
메모리 할당 위치는 Stack Memory 이다. 단, static 선언을 하면 Heap Memory에 저장 가능하다.

readonly

런타임 상수이다. (exe 또는 dll을 사용할 때 변수의 값을 가져온다.)
모든 자료형에 사용 할 수 있으며, 생성과 동시에 초기화 할 필요는 없다.
단, 생성자 단계에서 단 1번 할당을 통해 초기화 할 수 있다.
메모리 할당 위치는 Heap Memory이다.

출처: https://holjjack.tistory.com/95

region

#region #endregion을 활용하면 코드를 가독성 있게 작성할 수 있다.
전체 열기/닫기 단축키 : Ctrl + M + L

Defalt , Properties, Constructors, method등 의미에 맞게 긴 부분을 region화 한다.

Serializable

직렬화를 해야 Json을 사용할 수 있기에 클래스 Serializeable을 진행한다.
public으로 선언한 멤버는 이미 serializable 되어있고, private 변수도 serializable 선언하면 unity inspector에서 변경 가능하며 GameObject Prefab을 txt로 열었을때 확인 및 수정 가능하다.

직렬화는 객체의 필드에 저장된 값을 메모리에 저장 가능하도록 바꾸는 것이다.
직렬화할 클래스 위에 [Serializable]이라고 선언하여 사용한다.
메모리에 저장 가능한 형식은 Stream, BinaryFomatter 클래스를 이용해 저장할 수 있다.

만약 직렬화하고싶지 않은 필드가 있다면 [NonSerialized]로 선언하면된다.

[Serializable]
class MyClass
{
    public int MyFiled1;
    public int MyFiled2;

    [NonSerialized]
    public int myField3;  // 이 필드만 직렬화가 안됨

    public int myField4;
}

출처 : https://qzqz.tistory.com/254

Interface

인터페이스로 구현하는 이유는 다형성 때문이다. 클래스는 한개만 상속할 수 있지만, 인터페이스는 여러개 상속 가능하다. 따라서 다른 클래스에서도 사용될 수 있다고 생각될땐 인터페이스를 만들어두자.

인터페이스를 매개변수로 생성하면 그것을 상속하는 모든 클래스의 인스턴스를 받을 수 있다.

UML Dependancy

UML 작성시 메소드에서만 클래스를 매개변수로 받는 경우 이 클래스는 연관으로 표현하지 않고 의존 Dependancy로 표현한다.
이 경우에 클래스는 연관이 없지만 함수가 실행될때만 그 클래스와 연관이 있게 된다.

abstract와 virtual

메소드 선언시 abstract나 virtual을 사용하면 모두 자식클래스에서 해당 메소드를 override를 허용한다는 뜻이다.
둘의 차이는 abstract는 body를 절대 정의할 수 없지만 virtual은 body를 정의해도 된다.

Coroutine

Unity에서 Coroutine을 사용하는 이유는 동적환경에서 비동기적인 움직임을 만들기 위해서이다. Update에서 while문을 돌리는 경우 계속해서 실행되고, 리소스를 잡아먹지만 Coroutine을 활용하면 일정 시간씩 (예제에서는 1초)마다 실행하거나, 프레임을 멈췄다가 실행하는 등으로 활용할 수 있다.

Unity 동적게임

Unity에서 동적게임을 제작하는 경우에는 Unity 화면에서 GameObject를 생성하고 코드를 붙여넣는 방식으로는 제작하기 힘들다. 그래서 Script환경에서 GameObject를 생성한 후 Unity의 prefab을 활용해 GameObject를 생성하고 제어한다.

그에 관련한 코드

public class Tester : MonoBehaviour
{
    [SerializeField]
    int a = 5;
    public int b = 5;

    [SerializeField]
    GameObject prefab;

    private void Awake()
    {
        StartCoroutine("SimulationCoroutine");
    }

    // Start is called before the first frame update
    void Start()
    {
        Debug.Log(a);

        var obj = Instantiate(prefab);
        obj.transform.SetParent(transform);
    }
    int frameCount = 0;
    // Update is called once per frame
    void Update()
    {
        Debug.Log($"FrameCount : {frameCount++}");
    }


    public IEnumerator SimulationCoroutine()
    {
        int turn = 0;
        while(true)
        {
            Debug.LogError($"turn : {turn++}");
            yield return new WaitForSeconds(1.0f);
        }
    }
}

의문점

Serializable은 언제 사용하는가?
boxing UnBoxing?

profile
최태선입니다

0개의 댓글