List와 LinkedList의 정확한 의미Board, Pos, Direction, 루프)| 구조 | 언제 쓰나 | 강점 | 주의점 |
|---|---|---|---|
| 배열 | 크기가 완전히 고정 | 단순/빠른 인덱스 접근 | 크기 변경 불가 |
동적 배열(vector) | 일반적인 기본 선택 | 임의 접근 O(1), 사용 편의성 | 중간 삽입/삭제 O(N) |
| 연결 리스트 | 노드 위치를 이미 잡고 중간 삭제가 많음 | 위치 알고 있을 때 삽입/삭제 O(1) | 임의 접근 O(N), 캐시 비우호 |
실전 감각:
vector부터 시작하고, 병목이 명확할 때만 리스트를 검토합니다.List vs LinkedList 혼동 정리List<T>는 연결 리스트가 아니라 동적 배열입니다.LinkedList<T>가 진짜 연결 리스트입니다.int32, uint64 같은 별칭으로 가독성과 플랫폼 일관성 확보enum class를 사용해 이름 충돌과 암시적 정수 변환 실수를 줄임TileType::WALL, TileType::EMPTY 등으로 의미를 명확히 표현(y, x) 좌표 구조체operator+, ==, != 등 기본 연산 제공Pos front[4] = { {-1, 0}, {0, -1}, {1, 0}, {0, 1} };
for (int32 y = 0; y < _size; ++y) {
for (int32 x = 0; x < _size; ++x) {
if (x % 2 == 0 || y % 2 == 0) {
_tile[y][x] = TileType::WALL;
} else {
_tile[y][x] = TileType::EMPTY;
if (y == _size - 2) {
_tile[y][x + 1] = TileType::EMPTY;
} else if (x == _size - 2) {
_tile[y + 1][x] = TileType::EMPTY;
} else {
if (rand() % 2 == 0) _tile[y][x + 1] = TileType::EMPTY;
else _tile[y + 1][x] = TileType::EMPTY;
}
}
}
}
특징:
규칙(반복):
bool CanGo(Pos pos)
{
return _board->GetTileType(pos) == TileType::EMPTY;
}
중요 전제:
기본 루프:
while (true) {
uint64 deltaTick = GetDeltaTime();
_player->Update(deltaTick);
_board->Render();
}
이동 업데이트에서 중요한 점:
sumTick이 MOVE_TICK보다 커졌을 때 0으로 만들면 잔여 시간이 사라질 수 있습니다.sumTick -= MOVE_TICK 방식이 안정적입니다.void Player::Update(uint64 deltaTick)
{
if (_pathIndex >= _path.size())
return;
_sumTick += deltaTick;
while (_sumTick >= MOVE_TICK && _pathIndex < _path.size()) {
_sumTick -= MOVE_TICK; // 잔여 시간 보존
_pos = _path[_pathIndex++];
}
}
vector 대신 리스트를 써야 할 근거는 무엇인가?