코루틴 wait - 생명주기 함수는 돌아감
면접 준비 (1)
- 객체와 클래스
- 객체는 메모리에 할당되어 실제로 동작할 수 있는 개체입니다. 클래스는 이런 객체를 만들기 위한 설계도입니다. 클래스를 기반으로 객체가 생성됩니다.
- 생성자
- 객체가 생성될 때 자동으로 호출되는 메서드입니다. 주로 필드를 초기화흐는 데 사용됩니다.
- 접근 제한자와 차이점
- 클래스와 멤버에 접근할 수 있는 범위를 지정하는 키워드입니다.
- public은 어디서든 접근 가능하고, private은 클래스 내부에서만 접근 가능
- protected는 상속받은 클래스에서 접근 가능, internal은 같은 프로젝트 안에서만 접근할 수 있음
- static
- 클래스의 인스턴스가 아니라 클래스 자체에 속하기 때문에 객체를 만들지 않아도 사용할 수 있고, 모든 객체가 공유하는 값이 필요할 때 주로 사용한다.
- SOLID 원칙
- 객체지향 설계에서 지켜야할 다섯 가지 원칙.
- 단일 책임, 개방-폐쇄, 리스코프 치환, 인터페이스 분리, 의존성 역전 원칙
- 단일 책임 원칙: 클래스는 하나의 책임만 가져야하고, 변경 사유도 하나뿐이어야 한다.
- 개방-폐쇄 원칙: 기능 확장은 열려있고, 코드 수정을 닫혀있어야 한다.
- 리스코프 치환 워닉: 자식 클래스는 언제나 부모 클래스 대신 사용될 수 있어야 한다.
- 인터페이스 분리 원칙: 클라이언트는 자신이 사용하지 않는 메서드에 의존하지 않아야 한다. 너무 많은 기능을 강제로 묶어 놓지 않게
- 의존 역전 원칙: 상위 모듈이 하위 모듈에 의존하는 것이 아니라, 둘 다 추상화에 의존해야 한다.
- 다형성과 장점
- 하나의 인터페이스나 부모 클래스로 여러 가지 구현체를 다룰 수 있는 성질. 코드를 유연하고 확장 가능하게 만들 수 있다.
- override / overload
- override는 상속받은 메서드 재정의
- overload는 같은 이름의 메서드를 매개변수 형태에 따라 여러 개 정의
- 유니티 생명주기
- 사용자가 호출하지 않아도 호출되는 함수들의 호출 주기
awake -> Onenable -> start -> update -> lateUpdate -> ondisable -> ondestroy
awake는 객체가 처음 생성될 때 실행, start는 한 프레임 이후에 계속 실행
update는 매 프레임마다 호출, lateupdate는 모든 update가 끝난 후에 호출
- MonoBehaviour
- 유니티 생명주기의 함수들이 주요 메서드, 오브젝트의 생명주기를 따라 행동을 정의할 수 있게 한다.
- awake는 다른 컴포넌트와의 연결 같은 초기화에 적합, start는 다른 오브젝트가 모두 준비된 이후 실행되기 떄문에 오브젝트 간 상호작용이 필요할 때 적합
- update, fixedupdate, lateupdate
- update는 매 프레임 호출
- fixedUpdate는 일정한 시간 간격으로 호출, 주로 물리 연산 관련 로직에 사용
- lateUpdate는 update가 끝난 후 실행, 카메라 처리
- Time.deltaTime
- 한 프레임이 걸린 시간, 프레임 간의 간격. 프레임 수와 상관없이 일정한 속도로 움직이거나 애니메이션을 재생할 수 있다.
- 코루틴 동작원리
- 시간 지연이나 조건에 따른 비동기 처리를 순차적으로 작성할 수 있게 도와주는 기능
- 3초후에 효관 실행 등
- Invoke와 코루틴 차이점
- Invoke는 단순히 일정 시간 후에 한 번만 메서드 실행
- 코루틴은 일시정지하거나 반복적으로 처리할 수 있어 더 복잡한 제어 가능
- LinkedList
- 각 노드가 다음 노드를 가리키는 방식으로 구성된 자료구조. 삽입과 삭제가 빠르다.
- 중간에 요소를 자주 추가하거나 삭제해야하는 상황에 유리
- 인덱스를 통한 접근이 느려, 랜덤 접근이 많거나 전체를 자주 탐색해야하는 경우에 불리
- Stack
- 선입후출 구조
- 함수 호출 추적, 되돌리기 등 같은 후입선출이 필요한 경우 적합, 반대로 데이터가 FIFO인 경우엔 부적합
- Queue
- 선입선출.
- 순차적으로 처리해야하는 이벤트나 작업 큐에 적합. 대기열, 작업 처리 순서 등에 사용
- 중간 요소를 접근하거나 삭제해야할 경우에는 비효율적
- 러닝게임에서 장애물을 동적생성하고 제거하는 과정에서 생성된 장애물을 디버깅하기 위해 큐를 사용했던 적이 있다.