TIL)2023-12-28 개인 과제 계속 집중

2023. 12. 28. 20:40내외 교육들/TIL

오늘 배운것

인터페이스 복습 → 튜터 특강 및 강의 동영상 참조하였음

인터페이스를 통해 클래스들은 공통적으로 동작을 정의하고, 이러한 동작들을 구현하는 클래스들은 해당
인터페이스를 구현(implement)함으로써 공통 규약을 준수할 수 있다. 이러한 개념을 사용하는 이유는
클래스를 쓸 때보다 훨씬 유연성과 확정성 있는 코드를 구현하기 위해서이다.

  • 인터페이스는 클래스가 구현해야 하는 동작을 정의하는 계약서이다. 즉, 인터페이스는 클래스에 어떤 동작을 구현해야 하는지 알려준다. 이를 통해 클래스 간에 일련된 동작을 보장할 수 있다.
  • 인터페이스는 C#에서 다형성을 구현하는 중요한 개념이다. 다형성이란, 동일한 메서드를 가지고 있지만 다른 방식으로 동작하는 여러 개의 객체를 사용할 수 있는 것을 말한다.
  • 인터페이스는 클래스의 형태를 갖지 않고, 동작에 대한 규약을 정의한다. 클래스는 이러한 인터페이스를
    구현 함으로써 인터페이스에 정의된 동작을 보장한다.
  • 인터페이스를 사용하면 코드의 재사용성과 유연성을 높일 수 있다. 인터페이스를 구현한 클래스들은 동일한
    동작을 제공 하므로, 클라이언트 코드는 구현체의 내부 구현에 대해 알 필요가 없다. 이를 통해 코드의
    결합도를 낮출 수 있으며, 유지 보수성을 향상시킬 수 있습니다.
  • 인터페이스를 구현하려면 인터페이스에 정의된 모든 동작을 구현해야 합니다. 이를 통해 클래스는
    인터페이스에 명시된 동작을 보장하게 되며, 다형성을 구현할 수 있다.
  • 인터페이스는 다중 상속을 흉내내는 기능을 제공하여 여러 개의 인터페이스를 동시에 구현할 수 있다. 이를
    통해 클래스는 다양한 동작을 갖는 객체를 생성할 수 있고, 코드의 재사용성과 유연성을 극대화 할 수 있다.
  • C#에서 인터페이스를 잘 활용하면 유연하고 확장 가능한 코드를 작성할 수 있다. 인터페이스는 객체 지향
    프로그래밍에서 중요한 역할을 하며, 다형성을 통해 코드의 유연성을 높일 수 있다.
비교 클래스(Class) 인터페이스(Interface)
정의 데이터와 메서드의 집합으로 구성된 타입 동작에 대한 규약을 정의하는 계약서
다중 상속 단일 상속만 가능 다중 인터페이스 구현 가능
생성자 생성자를 가질 수 있음 생성자를 가질 수 없음
필드 인스턴스 필드와 정적 필드 지정 가능 인터페이스는 필드를 가질 수 없음
메서드 일반 메서드, 가상 메서드, 추상 메서드 가능 모든 메서드는 추상 메서드로 선언되어야함
속성 속성 지정 가능 속성 지정 가능

따라서, 인터페이스의 주요 특징으로 보자면 이렇게 볼 수 있다.

  1. 추상화 : 인터페이스는 추상적인 개념으로, 실제로 구현된 메서드가 없고, 메서드의 시그니처만을 가진다.
    따라서 인터페이스는 인스턴스화 될 수 없으며, 구현체가 필요하다.
  2. 메서드 시그니처 : 인터페이스는 구현 클래스가 반드시 구현해야 하는 메서드들의 시그니처를 정의한다.
    메서드의 이름, 매개변수, 반환 타입이 포함된다.
  3. 다중 상속 가능 : 클래스는 하나의 클래스만 상속받을 수 있지만, 여러 인터페이스를 동시에 구현할 수 있다.
    이를 통해 다중 상속을 흉내내는 것이 가능하다.
  4. 강제적 구현 : 클래스가 인터페이스를 구현하면, 인터페이스에서 정의한 모든 메서드를 반드시 구현해야 한다.
    이로 인해 클래스는 인터페이스에 정의된 동작을 강제로 구현하게 된다.
  5. 인터페이스 간 확장 : 인터페이스는 다른 인터페이스를 확장(extends) 할 수 있다. 이를 통해 더 큰 범위의 공통 동작을 정의할 수 있다.

유니티 - Invoke()

게임 기능 구현에서 특정 함수를 일정 시간 이후에 실행시켜야 할 필요가 생기는데(예: 오브젝트 무한 생성 시에 딜레이를 주고 싶을때 등), 이럴 때 사용하는 것이 Invoke()이다. 인보크는 함수의 이름과, 시간을 인자로 받아서 그 함수를 받은 인자 만큼의 시간 이후에 실행된다.

형식

Invoke("함수명"(string), 지연시간(float));
//여기서 함수명을 잘 입력해야 한다.

//예시
Invoke("tryInvoke", 5.0f);

void tryInvoke()
{
        Debug.log("Invoke 실행!");
}

여기서 유니티 인보크를 매개변수로 전달하는 생각을 할 수 있는데, 결론적으론 할 수 없다.
인보크는 단순히 함수의 이름만 전달할 수 있으며 매개변수 전달은 안된다.

만약 함수의 지연 실행 + 매개변수 전달이 필요한다면 Coroutine을 사용해야 한다. Invoke는 단순한 지연 실행에
있어서는 Coroutine보다 간편하지만, 성능면에서는 떨어진다.

InvokeRePeating()

위의 Invoke() 메서드는 단 한번만 실행되므로, 반복 실행이 필요하다면 InvokeRepeating() 을 통해서 지정한 주기로 반복 실행할 수 있다.

// InvokeRepeating(함수명, 지연 시간, 반복 간격)
InvokeRepeating("tryInvoke", 1.0f, 1.0f);

void tryInvoke()
{
    Debug.log("Invoke 실행! {Time.Time}"); 
    // debug 로그를 통해 실행 후 시간을 알려줌
}

Cancelnvoke()

반복하는 기능이지만 반복을 취소할 때도 있는데, CancelInvoke() 를 통해 Invoke()의 실행을 멈출 수 있다.

// CancelInvoke(함수명);
InvokeRepeating("tryInvoke", 1.0f, 1.0f);
Invoke("stopInvoke", 5);

void tryInvoke()
{
    Debug.log("Invoke 실행! {Time.Time}"); 
    // debug 로그를 통해 실행 후 시간을 알려줌
}

void stopInvoke()
{
    CancelInvoke("tryInvoke");    
    // 때론 메서드를 이런 방식으로 사용 할 수 있다.
}

📌 주의할 점은 오브젝트 안에 Invoke()를 실행 후 오브젝트를 비활성화 하더라도 Invoke()는 계속 실행된다. 그러니 오브젝트를 반드시 파괴하거나, 따로 CancelInvoke()를 사용해야 한다.

하루 마무리 및 내일 할 것

내일이 개인 과제 마무리다. 최고 기본 기능을 완성함과 동시에 내가 배운 것들을 어떻게든 선택 기능에 연관지어서 게임을 만드는 게 좋을 듯하다. 그리고 전처리문에 대해 새로 알게 되었고 사용해보았다. 일단 내일 TIL 및 블로그 작성 때 배워야 겠다.