나의 개발자 기록/본 캠프 개발 일지

2024년 6월 21일 금요일 개발일지 / 옵저버 패턴에 대해서

Modlist 2024. 6. 21. 21:08

2024년 6월 21일 금요일


What I did today

 

 

오늘도 스탠다드 반 시간이 끝나고 나서 팀원분들과 회의를 진행했습니다. 어제 마저 작업했던 거를 Dev에 합쳤고, 팀원 한 분이 대표로 MainScene에 적용해 주셨습니다. 다행히 다들 각자의 씬에서 작업해서 그런지 충돌이 많이 안 일어났고, 무사히 적용을 마쳤습니다. 그다음에는 팀원 분들과 다양한 이야기를 하면서 시간을 보냈고, 점심을 먹었습니다.

 

 

점심을 먹은 후에는 다들 각자 할 작업을 하셨는데, 막상 저는 할게 없었습니다. 그러다가 다른 팀원 한 분이 제가 작업했던 Hp Bar의 위치를 조정해 달라고 하셔서 바로 작업을 했고, 뭐 할 게 없나 하다가 약간 스타크래프트의 맵 이동처럼 카메라 이동이 있으면 좋겠다 싶어서 줌인/줌아웃도 가능한 카메라 스크립트를 추가했습니다.

 

String을 사용해야 하는 경우 데이터를 따로 빼놔서 오타 나는 경우를 최소화!

 

오후 4시 이후에는 튜터님의 핵심 정리 및 종합 복습 특강 등등 여러가지 각종 팁에 대한 강의를 해주셨습니다. 그중에서 유니티를 영화에 빗대어 설명해 주시는 부분이나 Prefab Variant를 이용해서 원본을 보유한 채로 약간의 변형을 적용한 Prefab의 자식 객체로 사용할 수 있다는 점이나 Manager들의 또 다른 사용 방법 등등 이해하기 쉽고 도움이 많이 되었던 강의였습니다. 강의가 끝나고 저녁을 먹은 뒤, 다들 마무리 작업을 한 뒤 TIL 쓰면서 오늘 하루를 마무리했습니다.


옵저버 패턴에 대해서

 

옵저버 패턴 (Observer Pattern) 이란?

 

옵저버 패턴(Observer Pattern)은 객체 지향 프로그래밍에서 행동 패턴 중 하나로, 한 객체의 상태 변화가 발생했을 때 그 객체와 연관된 다른 객체들에게 자동으로 통보되고, 상태를 갱신할 수 있게 하는 패턴이다. 이 패턴은 주로 이벤트 처리 시스템에서 사용된다.


옵저버 패턴의 주요 구성 요소

 

1. 주제 (Subject) : 상태를 가지고 있으며, 상태가 변할 때 옵저버들에게 알림을 보낸다. 옵저버를 등록하고, 제거할 수 있는 메서드를 제공한다.

 

2. 옵저버 (Observer) : 주제로부터 상태 변화에 대한 알림을 받는 객체이다. 주제의 상태가 변했을 때 호출될 메서드를 정의한다.


유니티에서의 활용

using System;
using UnityEngine;
using UnityEngine.UI;

public class PlayerHealth : MonoBehaviour
{
    public static event Action<int> OnHealthChanged; // 이벤트 선언
    private int health;

    public int Health
    {
        get => health;
        set
        {
            health = value;
            OnHealthChanged?.Invoke(health); // 체력이 변경될 때 이벤트 호출
        }
    }

    private void Start()
    {
        health = 100; // 초기 체력 설정
    }

    // 체력을 감소시키는 메서드
    public void TakeDamage(int damage)
    {
        Health -= damage;
    }
}

public class HealthUI : MonoBehaviour
{
    public Text healthText;

    private void OnEnable()
    {
        PlayerHealth.OnHealthChanged += UpdateHealthUI; // 이벤트에 메서드 등록
    }

    private void OnDisable()
    {
        PlayerHealth.OnHealthChanged -= UpdateHealthUI; // 이벤트에서 메서드 해제
    }

    private void UpdateHealthUI(int currentHealth)
    {
        healthText.text = "Health: " + currentHealth;
    }
}

 

유니티에서 옵저버 패턴은 주로 이벤트 시스템과 게임 오브젝트 간의 통신을 관리하는 데 사용된다. 예를 들어, 플레이어의 건강 상태가 변할 때 이를 UI에 업데이트하거나, 특정 이벤트가 발생했을 때 여러 오브젝트에 알리는 데 유용하다.


옵저버 패턴의 장점

 

느슨한 결합 : 주제와 옵저버가 느슨하게 결합되어 있어, 서로의 존재를 모른 채로도 서로 상호작용할 수 있다.

확장성: 새로운 옵저버를 쉽게 추가할 수 있다.

재사용성: 주제와 옵저버를 독립적으로 재사용할 수 있다.


옵저버 패턴의 단점

 

복잡성 증가 : 옵저버와 주제 간의 관계가 복잡해질 수 있다.

성능 저하 : 많은 옵저버가 등록되어 있을 경우, 알림을 보내는 데 시간이 많이 소요될 수 있다.