본문 바로가기

전체 글

(43)
04. 역할, 책임, 협력 중요한 것은 개별 객체가 아니라 객체들 사이에 이뤄지는 협력이다. 어떤 협력에 참여하는지가 객체에 필요한 행동을 결정하고, 필요한 행동이 객체의 상태를 결정한다. 개별적인 객체의 행동이나 상태가 아니라 객체들 간의 협력에 집중하라. 책임의 분류 책임 - 객체에 의해 정의되는, 응집도 있는 행위의 집합 - 객체가 알아야 하는 정보와 객체가 수행할 수 있는 행위에 대해 개략적으로 서술한 문장 - knowing(객체가 무엇을 알고있는가), doing(무엇을 할 수 있는가) 책임 = 객체의 외부에 제공해 줄 수 있는 정보 + 외부에 제공해 줄 수 있는 서비스 -> 책임은 객체의 공용 인터페이스(public interface)를 구성한다. -> 캡슐화 책임과 메세지 객체는 다른 객체로부터 요청이 전송되었을 경우만..
03. 타입과 추상화 더보기 추상화 - 어떤 양상, 세부 사항, 구조를 좀 더 명확하게 이해하기 위해 특정 절차나 물체를 의도적으로 생략하거나 감춤으로써 복잡도를 극복하는 방법 1. 구체적인 사물들 간의 공통점은 취하고 차이점은 버리는 일반화를 통해 단순하게 만드는 것 2. 중요한 부분을 강조하기 위해 불필요한 세부 사항을 제거함으로써 단순하게 만드는 것 모든 경우에 추상화의 목적은 복잡성을 이해하기 쉬운 수준으로 단순화 하는 것! 객체 : 명확한 경계를 가지고 서로 구별할 수 있는 구체적인 사람이나 사물 개념(concept) : 객체들을 묶기 위한 그릇 - 우리가 인식하고 있는 다양한 사물이나 객체에 적용할 수 있는 아이디어나 관념 - 공통점을 기반으로 객체를 분류할 수 있는 일종의 체 개념을 이용하면 객체를 여러 그룹으로..
객체지향의 사실과 오해 02.이상한나라의 객체 - 인지능력 안에서 개수를 셀 수 있고, 다른 사물과 구분할 수 있으며, 생성 시점을 알 수 있고, 독립적인 하나의 단위로 인식할 수 있는 모든 사물은 객체다. - 객체의 다양한 특성을 효과적으로 설명하기 위해서는 객체를 상태(state), 행동(behavior), 식별자(identity)를 지닌 실체로 보는 것이 가장 효과적이다. 더보기 객체란 식별 가능한 개체 또는 사물이다. 객체는 자동차처럼 만질 수 있는 구체적인 사물일 수도 있고, 시간처럼 추상적인 개념일 수도 있다. 객체는 구별가능한 식별자, 특징적인 행동, 변경 가능한 상태를 가진다. 소프트웨어 안에서 객체는 저장된 상태와 실행 가능한 코드를 통해 구현된다. 상태와 프로퍼티 상태 : 과거의 모든 행동 이력을 설명하지 않고도 행동의 결과를 쉽게..
01. 협력하는 객체들의 공동체 객체지향의 세 가지 개념 역할, 책임, 협력 요청과 응답으로 구성된 협력 역할과 책임 역할 : 특정한 사람이 협력 안에서 차지하는 책임이나 의무 사람들이 협력을 위해 특정한 역할을 맡고 역할에 적합한 책임을 수행한다 1. 여러 사람이 동일한 역할을 수행할 수 있다. 2. 역할은 대체가능성을 의미한다. 3. 책임을 수행하는 방법은 자율적으로 선택할 수 있다. - 다형성 : 동일한 요청에 대해 서로 다른 방식으로 응답할 수 있는 능력 4. 한 사람이 동시에 여러 역할을 수행할 수 있다. 사람 = 객체 에이전트의 요청 = 메세지 에이전트가 요청을 처리하는 방법 = 메서드 1. 여러 객체가 동일한 역할을 수행할 수 있다. 2. 역할은 대체가능성을 의미한다. 3. 책임을 수행하는 방법은 자율적으로 선택할 수 있다..
데디에서 스폰 할 때 특정 클라에만 설정..? Spectactor Pawn을 데디에서 접속한 클라이언트 수 만큼 스폰했다. (스폰된 객체가 리플리케이트 된 이후에 NM_Client에서 불릴 )Spectactor Pawn 클래스의 BeginPlay에서 Initialize를 해주었고, 그걸 PlayerState에 등록을 해주었는데 리플리케이트 순서가 클라들간에 보장이 되지 않아서, 간헐적으로 Spectator Pawn의 인풋이 클라간에 거꾸로 들어가는 경우가 있었다. 1. SpawnActor할 때 Owner를 PlayerController로 설정해줘서 해결했다. 2. 혹은 Replicate 컨디션을 COND_OwnerOnly로 설정해도 된다.
Widget이 NativeTick() 돌지 않을 때 void UUserWidget::NativeConstruct() { Construct(); UpdateCanTick(); } void UUserWidget::UpdateCanTick() { TSharedPtr SafeGCWidget = MyGCWidget.Pin(); UWorld* World = GetWorld(); if(SafeGCWidget.IsValid() && World) { // Default to never tick, only recompute for auto bool bCanTick = false; if (TickFrequency == EWidgetTickFrequency::Auto) { // Note: WidgetBPClass can be NULL in a cooked build, if t..
Jam's Tip APlayerController* UUserWidget::GetOwningPlayer() const { return PlayerContext.IsValid() ? PlayerContext.GetPlayerController() : nullptr; } template TPlayerState* GetOwningPlayerState(bool bChecked = false) const { if (auto Controller = GetOwningPlayer()) { return !bChecked ? Cast(Controller->PlayerState) : CastChecked(Controller->PlayerState, ECastCheckedType::NullAllowed); } return nullptr; } ..
클린코드 02장 의미있는 이름 2. 의미있는 이름 의도를 분명히 밝혀라 나쁜 코드의 예시 public List getThem(){ List list1 = new ArrayList(); for(int[] x : theList) if(x[0] == 4) list1.add(x); return list1; } - 코드 맥락이 코드 자체에 명시적으로 드러나지 않음 1. the List에 무엇이 들었는지 2. theList[0] 값이 어째서 중요한지? 3. 값 4는 어떤 의미인지? 4. 함수가 반환하는 list1을 어떻게 사용하는지 정보제공을 충분히 고려한 코드의 예시 public List getFlaggedCells(){ List flaggedCells = new ArrayList(); for(int[] cell : gameBoard) if(..