이미지 참조 : 김지웅 튜터님의 자료
요새 드는 생각인데..
코드를 보거나 작성하다보면 분할 하는 것도 쉽지 않고 하다 못해 인스펙터창에 띄울 화면 구성을 생각하는 것도 쉽지 않습니다. 이번에 배우고 있는 내용 중에 특히나 눈여겨보던 부분이 Interface였지만, 그마저도 쓰기 힘들었고 델리게이트를 통해 인터렉트 그니까 상호작용 가능한 아이템의 정보를 받아와서 인벤토리에 넣는 것까지 좋았으나, 그 구조가 좀 복잡하다고 생각되었습니다. 물론 많은 이벤트를 한 번에 여러곳에서 받아온다면 그것이 맞을 수도 있겠다는 생각은 있었으나, 조금 불편한 구조라고 생각했습니다.
그래서...
생각하던 것이 이전 강의에서 알려주셨던 중재자 패턴이라고 있었기에 그것을 활용해보았습니다. 알려주신대로의 중재자 패턴을 쓴 것 같지도 않았고 불편한 부분은 계속 신경쓰였지만, 일단 작업을 이어나갔고 그에 맞게 코드를 변형해볼 수도 있었습니다.
하지만 더 좋은 방법이?
오늘 레벨업 특강으로 객체지향 프로그래밍이란 무엇인지, 5가지 원칙은 정확히 어떤 내용인지 좀 상세히 알려주시면서 머리에서 좀 더 구조에 대해 적립이 되는 느낌이었습니다. 특히나 중재자 패턴의 경우, 제가 너무 잘못 쓰고 있던 거 같고 단순히 클래스 내부에 static 정적 메서드를 하나 추가하는 것으로 좀 더 직관적이고 쉬운 구조를 구현할 수 있을 거 같았습니다.
결론 오늘의 학습 포인트
상속
중복되는 변수들을 하나의 클래스에서 만들고 같은 변수들을 활용해야하는 클래스들에게도 쓸 수 있게 만드는 방식입니다. 위와 같이 상속을 쓰지 않고 if문으로 코드를 추가 시, 내용을 하나에 다 넣으려니 보기 안 좋은 코드가 되지만, abstract 즉 추상클래스를 활용하면 Player라는 클래스를 상속받은 Warrior, Archor, Mage는 각 클래스에서 Attack을 가지고 있어서 호출할 때는 Player에 Warrior, Archor, Mage 등을 대입하여 Attack을 사용하게 되면 override된 값으로 출력되기에 쓰기에 편리하고 Attack을 각 구조에서 수정하기에 코드를 좀 더 가독성이 좋은 방식으로 수정이 가능합니다.
Console.WriteLine(new string('=', 50));
foreach (IAttackable attackable in _attackableList)
{
if(attackable is Monster monster)
monster.PrintStatus();
}
Console.WriteLine(new string('=', 50));
({쓰고 있는 클래스} is {쓰고 싶은 클래스} {바꾼 클래스 인스턴스 이름} )
먼저 is 라고 쓰이는 것으로 특정 클래스에서 찾고자 하는 클래스로 반환하고 그를 활용하는 방법입니다.
이전에도 TryGetComponent라고 유니티에서 지원하는 기능도 알고 있었던 거 같지만, 구조만 잘 짠다면 훨씬 보기도 쓰기도 쉬워보였고, 특히 자식클래스가 부모클래스 리스트에 추가되었을 때, 어떤식으로 활용해야되는지 이해되지 않았지만, 이를 통해 쓸 수 있다는 것을 알 수 있었습니다. 위 내용에서는 IAttackable에는 PrintStatus라는 메서드가 없어서 Monster 컴포넌트가 있다면, 출력할 수 있도록 해주는 구문입니다.
Interface
사실 인터페이스를 선언해도 내용에서 다시금 쓰게 되니까 왜 쓰는가 싶었는데 위에 있는 내용과 연계하게 되면 그냥 같은 부류를 구분하기 위한 일종의 코드에 태그를 단다고 생각하면 이해하기 편한 거 같습니다. 그럼에도 잘 안 쓰고 있었지만, 이 예제에서 필요하면 Interface 4개를 다 달면된다. 는 말에 메서드 하나하나를 2번은 쓸거 같다 싶으면 그냥 다 분리해버려도 좋지 않을까 싶습니다. 물론 interface를 여기저기 달아놓으면 헷갈릴 수 있으니 그걸 모아놓을 클래스도 하나 만들어놓으면 편할 거 같습니다.
IS 응용
여기서도 Monster는 Slime을 받았지만, Monster로 지정되어 있기 때문에 몬스터 외에 클래스는 사용할 수 없을 겁니다. 그러나 위에서 언급했던 is를 사용해서 Slime, Dragon을 추출한다면 사용할 수 있을 거 같습니다.
정적 메서드 Static
정적 메서드라는게 그냥 보시는 바와 같이 어떤 클래스 안에서도 생성이 가능하고, 그 메서드를 활용할 때도 인스턴스 monster1, monster2 와 같이 할당하고 쓰는 것이 아니라 Monster.PrintTotalMonsterCount처럼 어디서든 불러올 수 있습니다. 이러면 관계를 지을 때 있어서 보다 편하게 쓸 수 있겠다는 생각이 드네요.
정적 클래스 Static
정적 클래스 안에는 정적으로만 선언이 가능하기 때문에 값을 바꾸기 어려워서 대부분 유틸에서만 사용하게 된다고 합니다.
'유니티 스파르타 캠프 7주차' 카테고리의 다른 글
250523 코드구조 어떻게 짜야할까? (0) | 2025.05.23 |
---|---|
250522 유니티로 쉽게 데이터 관리하는 방법 (0) | 2025.05.22 |
250520 3D 회전 Quaternion 문제 해결 (0) | 2025.05.20 |
250519 Awake, Start, Enable, Disable 등 구동 정리 (2) | 2025.05.19 |