복습
(정리 할 거임..)
✅ 1. player.Move(forward);에서 Move는 왜 대문자? player는 왜 소문자?
💡 규칙
- 클래스명 / 메서드명: 첫 글자 대문자 (PascalCase) → Move(), TakeDamage()
- 변수 / 객체: 첫 글자 소문자 (camelCase) → player, health, score
즉:
영어로 치면
“Player라는 사람을 한 명 만들고 → 그 사람을 player라고 부르고 → player가 Move() 한다”
라고 보면 돼.
✅ 2. follow(Player player)에서 매개변수 이름도 player인데 이건 뭐야?
- Player → 타입(클래스 이름)
- player → 이름(이 함수 안에서 쓸 변수명)
즉:
“Player 타입의 player라는 이름의 객체가 들어온다”
→ 헷갈리면 이름 다르게 해도 돼:
✅ 3. .은 무슨 의미?
player.Move()에서 **. (dot)**은
“~의 것” / "속해 있는 것” 의미야.
즉:
는
“player의 Move() 함수 실행”
= “player가 움직여!”
✅ 4. FSM vs 싱글톤?
| 의미 | 객체의 상태를 나누어 관리 | 프로그램 전체에서 하나만 존재 |
| 예시 | Idle, Run, Jump 상태 전환 | GameManager, UIManager |
| 목적 | 상태별 행동 분리 | 공통 자원/관리자 역할 |
- 둘은 다른 개념이야. FSM은 캐릭터처럼 "변하는 것", 싱글톤은 매니저처럼 "하나로 유지되는 것".
✅ 5. enable이란?
- 어떤 기능을 켜고 끄는 bool 속성이야
"enable"은 "쓸 수 있게 하다"라는 뜻 그대로임!
✅ 6. 옵저버 패턴이 뭐야? EventManager는?
옵저버 패턴은:
“변화를 감지해서 → 자동으로 반응하는 구조”
- event나 delegate 사용
- 여러 객체가 한 이벤트를 “구독(subscribe)”하고, 그 이벤트가 발생하면 “자동 실행”
옵저버 vs EventManager
| 직접 구독/해지 | 중앙에서 이벤트 등록/호출 |
| 분산적 반응 | 구조적으로 관리 |
👉 옵저버 패턴 = 싱글톤 또는 EventManager를 쓰는 방법 중 하나가 될 수 있어.
✅ 7. 싱글톤이 싱글톤과 상호작용하면 안 되는 이유?
- 싱글톤끼리 서로 의존하면 → 순환 참조(Dependency Loop) 발생
- 유지보수 어려워짐 (서로가 서로를 계속 참조해서 수정이 꼬임)
💥 해결법:
- EventManager 또는 인터페이스 + 의존성 주입(DI) 사용
✅ 8. 싱글톤 예시
✅ 9. 옵저버 패턴을 "넘어가야" 하는 시기?
- 이벤트가 너무 많고 복잡해졌을 때
- 의존관계가 정리되지 않을 때
→ 이때는 StateMachine, EventBus, ScriptableObject 이벤트로 넘어감
✅ 10. delegate, <>, UnityAction
💡 delegate = 함수 저장소
💡 UnityAction
- delegate를 쉽게 쓰게 도와주는 Unity 전용 래퍼
- UnityAction, UnityEvent, Action, Func 등 다양
✅ 11. Update()를 지양하는 이유?
- 매 프레임마다 실행됨 → 성능 저하 유발
- 불필요한 Update()는 쓰지 말고 → 이벤트 기반으로 변경 권장
✅ 12. Composite 패턴이란?
- 객체를 트리 구조로 관리 (부모-자식 개념)
- 예: 메뉴 UI, 적 그룹
- 전체 or 부분을 같은 방식으로 처리
예:
UIController가 Button이나 Panel들을 자식으로 갖고 → 전체를 한 번에 켜거나 끄는 구조
✅ 13. 디자인 패턴?
코드를 효율적으로 짜는 공식같은 설계 템플릿
대표 3가지:
| 생성 | 싱글톤, 팩토리 |
| 구조 | 컴포지트, 데코레이터 |
| 행동 | 옵저버, 상태(State), 전략(Strategy) |
✅ 14. public, void, string 등 정리
| public | 외부 접근 가능 | 다른 스크립트에서도 접근 가능 |
| void | 반환값 없음 | 결과를 되돌려주지 않음 |
| string | 문자열 타입 | "Nabi" 같은 텍스트 저장용 |
✅ 15. : 는 상속
→ UIController는 MonoBehaviour를 상속받는다
(= Unity의 기능들을 쓸 수 있게 됨)
✅ 16. [SerializeField]란?
- private인데 인스펙터에 표시하고 싶을 때
✅ 17. Init()은 뭐야?
초기화(Initialize) 함수. 보통 시작할 때 값 세팅할 때 씀.
✅ 18. ( <> ), delegate, event
⬜ <float>, <int> 등은 제네릭(Generic)
- 어떤 타입이 들어올지 미정일 때 쓰는 틀 (템플릿)
✅ 19. OnTakeDamage?.Invoke(10); 의 의미
✔️ 의미
- ?는 널 검사: 구독한 애가 없으면 아무것도 안 함
- Invoke(10)은 이벤트 발생: “나 데미지 입었어!” 라고 알림
즉:
"누가 나를 구독하고 있다면, 10만큼 데미지를 입었다고 알려줘!"
✅ 20. event는 함수 안에서만 발생?
- 정의는 클래스 안에서 (event Action OnSomething)
- 호출(Invoke)은 클래스 안에서만 가능
- 하지만 외부 클래스는 구독만 가능 (+=)
✅ 21. public이 접근 제한자?
네! 정확해요.
| public | 어디서나 접근 가능 |
| private | 해당 클래스 안에서만 |
| protected | 상속받은 클래스까지 가능 |
→ void만 쓴다고 해서 private이 되는 건 아님. 명시 안 하면 기본은 private.
✅ 22. Shift + Enter는 Rider에서 무슨 기능?
- 줄바꿈만 하고 자동 줄 완성 안 됨
- 반대로 Enter만 누르면 자동완성/세미콜론 등 붙음
✅ 23. void TakeDamage(float damage) 에서 float은 실수?
정확해!
- float = 실수 타입 (예: 1.0f, 2.5f)
- int = 정수 타입
✅ 24. 콜백과 UnityAction
- 콜백 = "이거 끝나면 저거 실행해줘"
- OnMove += () => Debug.Log("움직임!");
→ 람다식으로 짧고 간단하게 함수 지정 가능
✅ 25. 람다식이 편한 이유 + 단점
- 편함: 함수 만들지 않고 코드 안에 직접 작성 가능
- 단점: 람다식으로 등록한 함수는 빼거나 제거(−=) 불가
→ +=만 되고 -= 안 됨 → 메모리 누수 가능성
그래서 InputSystem처럼 자동으로 연결된 이벤트엔 람다식 남발 X
✅ 26. delegate = 함수 저장소?
그렇지!
함수를 변수처럼 저장하고, 실행하고, 전달할 수 있게 해주는 게 delegate
✅ 27. 왼쪽 = 오른쪽 뜻?
→ “왼쪽에 오른쪽 값을 넣는다”
"오른쪽 계산 먼저 → 왼쪽에 넣기" 순서야
✅ 28. PlayerController는 외형 컨트롤러?
보통 입력 + 애니메이션 + 움직임을 조작하는 클래스 이름이야
✅ 29. OnMove?.Invoke(); 이건 뭐야?
- 델리게이트나 이벤트가 비어 있지 않다면 실행해줘!
- 즉, "구독자한테 알려줘!" 라는 의미
✅ 30. 델리게이트 초딩도 이해 가능하게
🎓 비유:
델리게이트 = 호출 가능한 친구 목록
✅ 31. 델리게이트 종류
| Action | 반환값 없음 | Action jump = Jump; |
| Action<T> | 매개변수 1개 | Action<float> damage |
| Func<T> | 반환값 있음 | Func<int> GetScore |
| Predicate<T> | true/false 반환 | Predicate<int> isEven |
✅ 32. Func<bool> que;는 지양하라고?
→ Func<bool>은 결과를 되돌리는 함수라서, 상태 흐름이 복잡해질 수 있음
→ 초보자 땐 Action으로 한쪽방향 소통만 먼저 익히는 게 좋아
✅ 33. Coroutine 초딩도 설명
“잠깐 기다렸다가 다시 실행할 수 있는 함수”
- 여러 단계 작업(걷기 → 멈춤 → 다시 시작)을 시간 간격 두고 처리할 수 있어.
✅ 34. UnityAction 사용법
→ UI 버튼, 이동 이벤트 등에 쓰기 좋음
✅ 35. 딕셔너리(Dictionary) 초딩도 알기 쉽게
"사전처럼 key = value 한 쌍으로 저장하는 구조"
| "Potion" | 3 |
| "Bomb" | 1 |
🎓 비유:
"‘Potion’이라는 이름표가 붙은 서랍에 3개 들어있음!"
✅ 36. out과 ref 초딩도 설명
| ref | 값을 받고 넘김 (기존 값을 수정) |
| out | 값을 넘김만 (초기화 안 해도 됨) |
🔧 컴포넌트 가져올 때 자주 써:
→ "Rigidbody 컴포넌트가 있다면, rb에 넣어줘"
✅ 37. Coroutine은 비동기처럼 보이지만 사실은 동기 방식
- Coroutine은 Unity가 시간차를 둬서 처리해주는 거지, 스레드를 나누는 진짜 비동기(Await, Task)가 아님
→ 일시정지 + 순차 실행 구조, 진짜 병렬 처리 아님
✅ 38. Vector3 v = new Vector3(3, 0, 4); 의 뜻?
- v는 3D 좌표 (x=3, y=0, z=4)를 의미하는 벡터야.
- 즉, 공간상에서 "오른쪽으로 3, 위로 0, 앞으로 4" 만큼 떨어진 위치
✅ 39. abstract class 초딩도 알기 쉽게
"공통된 설계도만 있고, 실제 내용은 자식이 직접 만들어야 함"
🎓 비유:
Animal은 "동물은 소리를 낼 수 있다"까지만 정의하고,
Cat은 "고양이는 ‘야옹’을 낸다"라고 구체화함
✅ 40. 알고리즘 구조? 로직?
| 로직 | 문제를 해결하는 행동 흐름 (ex. “1초마다 체력 감소”) |
| 알고리즘 | 문제 해결을 위한 정해진 절차/공식 (ex. 정렬, 길찾기) |
✅ 41. 구조 짜는 연습 어떻게?
- 자연어로 먼저 말해봐
- “플레이어가 점프하고, 땅에 닿으면 다시 점프 가능”
- 동사 중심으로 메서드 만들기
-
csharp복사편집void Jump(); void OnLanding();
- 상태 나누기 (Idle, Jumping, Falling)
→ 연습 주제:
- 상자 열기 시스템
- 퀘스트 트리거
- NPC 대화 구조
✅ 42. 델리게이트 = 콜백?
✔️ 거의 같은 의미로 써.
- 델리게이트 = 함수 저장소
- 콜백 = "필요할 때 돌려부르는 함수"
✅ 43. 인터페이스를 충돌 처리에 쓰는 이유?
- IDamageable을 구현한 애만 타격 받게 할 수 있음
이름만 맞는 게 아니라, **"그걸 쓸 수 있는 자격이 있는지"**를 체크 가능
✅ 44. UIManager를 싱글톤으로 쓰는 경우?
플레이어가 씬 이동을 해도 UI는 항상 하나만 존재해야 하니까
- 예: 인벤토리, 체력 UI, 맵 표시
- DontDestroyOnLoad()로 살아남게 해놓고 → 어떤 씬에서든 UIManager.Instance.OpenInventory() 호출 가능
✅ 45. OnlyUP 같은 게임에서 델리게이트가 애매한 이유?
- 대부분 UI가 동적으로 활성화되는 게 없음
- 이벤트보다는 단순한 조건문 처리 (if(거리 < 10) 등)이 많음
그러나:
- 최대 높이, 남은 HP 같은 건 델리게이트로 UI 갱신에 쓸 수 있어
✅ 46. Unity 단축키: F 키
- 씬 뷰에서 오브젝트 선택 후 F 누르면 → 자동 포커싱
“카메라야, 내가 지금 선택한 거에 맞춰서 가줘!”
✅ 47. AddListener(() => ...)와 버튼
- 익명 함수로 동작 넣기 편함
- 동적 UI 생성 시 필수
하지만:
- 정적 UI라면 인스펙터에 함수 드래그해서 넣는 게 더 편함
✅ 48. "가까워지면 if / 멀어지면 비활성화?"는?
- 거리 계산해서 SetActive(true) / SetActive(false) 처리하는 패턴
버튼 2개를 쓰는 이유는 "UI 표시/숨김"을 명확하게 나누고 싶어서
✅ 49. "알고리즘은 검색 딸깍, 에셋 딸깍이면 되지만 구조는 안된다"란?
- 알고리즘은 “답이 정해진 문제 해결 공식”
- 구조는 “전체 시스템을 어떻게 설계할지” → 답이 없어
→ 코드 구조 설계는 연습과 패턴 학습이 중요
✅ 50. RayCast와 맵 정보?
Raycast는 “눈앞의 한 줄기”일 뿐 → 전체 맵 구조를 모름
그래서 미로 탐색처럼 "전체 길을 찾아야" 하는 곳에는 부족함
✅ 51. A* (에이스타) 알고리즘 초딩도 알기 쉽게
"가장 빠르고, 가장 짧은 길을 찾아주는 똑똑한 길찾기 알고리즘"
- 시작점에서 한 칸씩 이동해보기
- 도착점까지의 예상 거리를 기준으로 최적 경로 선택
- 뱅뱅 도는 대신, 직선 + 목적지 방향 위주로 움직임
✅ 보너스: A* 적용 방법 (Unity)
- Grid 만들기
- 각 셀에 f = g + h 계산
- OpenList와 ClosedList로 관리
- 다음에 이동할 칸 = f가 가장 작은 칸
에셋도 있어: A* Pathfinding Project (Aron)