🔥 중첩 슬라이스

267자
3분

슬라이스는 다양한 타입을 담을 수 있는데요, 심지어 슬라이스 자체도 담을 수 있답니다. 이를 통해 다차원 배열과 유사한 자료구조를 만들 수 있죠.

예를 들어, 틱택토 게임 보드를 만든다고 가정해 볼까요? 3x3 크기의 보드이므로, 문자열 슬라이스를 담고 있는 슬라이스를 만들면 되겠네요.

go
package main
 
import (
    "fmt"
    "strings"
)
 
func main() {
    // 3x3 크기의 틱택토 보드를 만듭니다.
    board := [][]string{
        []string{"_", "_", "_"}, // 첫 번째 행
        []string{"_", "_", "_"}, // 두 번째 행
        []string{"_", "_", "_"}, // 세 번째 행
    }
 
    // 플레이어가 번갈아 가며 수를 둡니다.
    board[0][0] = "X" // 첫 번째 플레이어가 (0, 0)에 수를 둠
    board[2][2] = "O" // 두 번째 플레이어가 (2, 2)에 수를 둠
    board[1][2] = "X" // 첫 번째 플레이어가 (1, 2)에 수를 둠
    board[1][0] = "O" // 두 번째 플레이어가 (1, 0)에 수를 둠
    board[0][2] = "X" // 첫 번째 플레이어가 (0, 2)에 수를 둠
 
    // 보드의 현재 상태를 출력합니다.
    for i := 0; i < len(board); i++ {
        fmt.Printf("%s\n", strings.Join(board[i], " "))
    }
}
 
go
package main
 
import (
    "fmt"
    "strings"
)
 
func main() {
    // 3x3 크기의 틱택토 보드를 만듭니다.
    board := [][]string{
        []string{"_", "_", "_"}, // 첫 번째 행
        []string{"_", "_", "_"}, // 두 번째 행
        []string{"_", "_", "_"}, // 세 번째 행
    }
 
    // 플레이어가 번갈아 가며 수를 둡니다.
    board[0][0] = "X" // 첫 번째 플레이어가 (0, 0)에 수를 둠
    board[2][2] = "O" // 두 번째 플레이어가 (2, 2)에 수를 둠
    board[1][2] = "X" // 첫 번째 플레이어가 (1, 2)에 수를 둠
    board[1][0] = "O" // 두 번째 플레이어가 (1, 0)에 수를 둠
    board[0][2] = "X" // 첫 번째 플레이어가 (0, 2)에 수를 둠
 
    // 보드의 현재 상태를 출력합니다.
    for i := 0; i < len(board); i++ {
        fmt.Printf("%s\n", strings.Join(board[i], " "))
    }
}
 

위 코드를 단계별로 자세히 설명해 드리겠습니다.

  1. board 변수를 선언하고, 3x3 크기의 문자열 슬라이스를 담고 있는 슬라이스로 초기화합니다. 초기에는 모든 칸이 빈 칸("_")으로 설정되어 있네요.
  2. 플레이어들이 번갈아 가며 보드에 수를 둡니다. board[행][열] 형식으로 접근하여 해당 칸의 값을 "X" 또는 "O"로 변경하는 거죠.
  3. 보드의 현재 상태를 출력하기 위해 for 루프를 사용합니다. 루프 변수 i는 0부터 len(board)-1까지 반복되면서, 각 행을 나타내는 board[i] 슬라이스를 strings.Join() 함수로 공백(" ")을 구분자로 하여 하나의 문자열로 합칩니다. 그리고 fmt.Printf()로 해당 문자열을 출력하죠.

위와 같이 슬라이스를 담고 있는 슬라이스를 활용하면, 다차원 배열과 유사한 자료구조를 간편하게 다룰 수 있답니다. 게임 보드뿐만 아니라 다양한 상황에서 유용하게 쓰일 수 있을 거예요.

YouTube 영상

채널 보기
함수 타입과 Hom-Set 이해하기 | 프로그래머를 위한 카테고리 이론
NestJS 역할 기반 접근 권한 부여 - Guard, Reflector | NestJS 가이드
인터셉터와 RxJS로 캐시 시스템 구축하기 | NestJS 가이드
함수 객체의 보편적 구성 | 프로그래머를 위한 카테고리 이론
API 응답 지연과 복잡한 에러, NestJS 인터셉터로 관리하는 방법 | NestJS 가이드
NestJS 가드, 바이딩과 스코프 | NestJS 가이드
NestJS 인터셉터에서 map 연산자로 응답을 변환하는 방법 | NestJS 가이드
미들웨어 vs 가드, 왜 NestJS에서는 가드가 더 똑똑할까? | NestJS 가이드