10일차 요약
자료형
- 데이터 표현 최소 단위: bit
- 8bit = 1byte
- 같은 정수형이라 하더라도 몇 bit를 사용하느냐에 따라 표현 범위가 달라진다.
- U가 붙는 자료형은 unsigned로 음수를 표현하지 못한다.
배열
- 같은 타입의 요소를 연속된 메모리 공간에 저장하는 자료구조이다.
- 편의 함수
- Max(): 최댓값 반환
- Average(): 평균을 반환
- Contains(var element): element 포함 여부 반환
- 다차원 배열
- 다차원 배열을 선언하는 방식 2가지
- [,]: 정사각 형태의 다차원 배열
- [][]: 가변 배열(각 행의 길이가 달라질 수 있음)
- 다차원 배열을 선언하는 방식 2가지
자료형
컴퓨터는 0, 1로 데이터를 표현한다.
이를 표현하는 최소단위를 bit라고 하며 8bit를 1byte라고 한다.
각 자료형은 다음과 같은 표현 범위를 갖는다.
Int32 intValue = 0; // -21~21억까지 표현 가능
UInt32 uintValue = 0; // 0~42억까지 표현 가능
Int64 longValue = 0; // -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
UInt54 ulongValue = 0; // 0~18,446,744,073,709,551,615
float floatValue = 0.0f; //3.4E +/- 38(7자리 숫자)
배열
동일한 데이터 타입의 요소들을 연속된 메모리 공간에 저장하는 자료구조이다.
배열의 장점
- 빠른 요소 접근: 인덱스를 통한 O(1) 시간 복잡도
- 메모리 효율성: 연속된 메모리 할당으로 캐시 효율 높음
- 간단한 구현: 기본적인 프로그래밍 구조로 쉽게 사용 가능
- 다차원 데이터 표현: 행렬, 이미지 등의 데이터 표현에 적합
배열의 단점
- 고정된 크기: 동적 크기 조절 불가
- 삽입과 삭제의 비효율성: 요소 이동 필요 (O(n) 시간 복잡도)
- 메모리 낭비 가능성: 선언된 크기만큼 항상 메모리 차지
- 연관 데이터 저장의 어려움: 다른 자료구조에 비해 복잡한 데이터 구조 표현이 어려움
using UnityEngine;
using System.Linq;
public class ArrayExamples : MonoBehaviour
{
// 플레이어 점수를 저장하는 배열
private int[] playerScores = new int[5];
// 아이템 이름을 저장하는 배열
private string[] itemNames = { "검", "방패", "포션", "활", "마법서" };
// 적 프리팹을 저장하는 배열
public GameObject[] enemyPrefabs;
// 맵의 타일 타입을 저장하는 2D 배열
private int[,] mapTiles = new int[10, 10];
}
편의 함수
- Max(): 배열의 요소 중 최댓값 반환
- Average(): 배열의 평균 반환(숫자형 타입만 지원)
- Contains(var element): element 포함 여부를 반환
- 속도가 느림: O(N)
다차원 배열
배열은 여러 차원으로 관리가 가능하다.
다음과 같은 배열은 이차원 배열이라고 한다.
이를 C#에서는 다음과 같이 선언한다.
private int[,] A = new int[10, 10];
private int[][] B = new int[10][];
A의 경우는 가로, 세로가 동일한 크기를 갖는다.
즉, 위와 같은 형태이다.
B의 경우에는 가로, 세로가 동일한 크기를 갖는 것을 보장하지 않는다.
0번째 행에는 2개의 열, 1번째 행에는 5개의 열이 존재할 수 있다.
이러한, B를 가변 배열이라고 한다.
배열 예제
배열을 통해 객체를 게임 상에 배치하는 방법을 알아보자.
이차원 배열 mapTiles에 랜덤한 값을 채운 뒤 특정 기준을 넘어가면 Cube를 생성하는 방식으로 진행해 보자.
우선, 랜덤한 값을 채우는 작업을 수행한다.
// 간단한 맵 생성 (0: 빈 공간, 1: 벽)
for (int y = 0; y < mapTiles.GetLength(0); y++)
{
for (int x = 0; x < mapTiles.GetLength(1); x++)
{
mapTiles[y, x] = Random.value > 0.8f ? 1 : 0;
}
}
그리고 mapTiles[y, x]가 1이라면 Cube를 생성한다.
for (int y = 0; y < mapTiles.GetLength(0); y++)
{
for (int x = 0; x < mapTiles.GetLength(1); x++)
{
CubeTiles[y,x] = mapTiles[y, x] == 1 ? Instantiate(Cube) : null;
}
}
Instantiate란 Class를 통해 객체를 생성하는 함수이다.
이렇게 진행되면 모든 Cube가 한 위치(0,0,0)에 겹쳐져 있을 것이다.
따라서, 각 위치에 맞게 조정하도록 변경해 보자.
for (int y = 0; y < mapTiles.GetLength(0); y++)
{
for (int x = 0; x < mapTiles.GetLength(1); x++)
{
CubeTiles[y, x] = Instantiate(Cube, new Vector3(x - 5, y - 5, 0), Quaternion.identity);
if (mapTiles[y, x] == 0)
{
var renderer = CubeTiles[y, x].GetComponent<Renderer>();
if (renderer != null)
{
renderer.sharedMaterial = TranparentMat;
}
}
}
}
각 위치에 -5를 적용한 이유는 가운데 블록을 (0,0,0)에 위치시키기 위함이다.
mapTiles[y, x]가 0이라면 반투명한 Material을 적용시킨 화면은 다음과 같다.