[ios_Swift] Array

이시영·2023년 8월 9일

배열(Array)에 대해 알아보자

배열은 하나 이상의 데이터들을 연속해서 저장하는 collection으로 배열에는 추가되는 값(value)들이 순차적으로 저장된다.
또한 배열은 타입을 명시해줘야하는데 명시된 하나의 타입값들만 저장할 수 있으며 이 외의 타입값들은 저장할 수 없다.
타입에는 제한이 있으나 저장되는 값들은 동일한 값이더라도 상관없이 저장할 수 있고 각자 독립적인 값으로 취급된다.
index는 배열속 요소들의 순서를 의미하는데 '0'으로 시작하여 순차적으로 올라간다. 즉 배열의 첫 번째 순서에 저장된 값의 index는 0이고 두번째에 저장된 값의 index는 1이 된다.


Array Literal

배역은 중괄호([]) 를 이용하여 나타내며 저장가능한 요소(element)의 수는 문법적으론 제한이 없다.

[element, element, element....]

중괄호 안에 타입이 있다면 배열타입이라 하며 중괄호 안에 값이 있다면 배열 리터럴(array literal)이라고 한다.

let a = [Int]

let b = [1, 2, 3, 4]

배열은 다차원 배열로도 만들 수 있는데 2차원 배열의 예를 들면

let a = [[2, 3, 4, 5], [3, 4, 2, 1]]

위와 같이 만들 수 있으며 배열 속 중괄호의 갯수로 몇 차원 배열인지 유추할 수 있다.


Array Type

배열타입은 아래와 같이 표현할 수 있는데 위쪽이 정식 문법 아랫쪽이 단축문법이다. 둘의 의미는 동일하다.

Array<Type>
//정식문법
[Type]
//단축문법

예를들면 각 방식은 아래와 같이 선언될 수 있다.

let a : Array<Int>
// 정식문법
let a : [Int]
// 단축문법

Array Basics

배열에서 빈배열은 아래와 같이 선언될 수 있는데 모두 같은 의미를 가진 코드들이다.

let a : [Int] = []

let a = Array<Int>()

let a = [Int]()

만약 배열을 만들고 초기값으로 채우고 싶다면 아래의 예시처럼 코드를 짤 수 도 있다.
let a = [Int](repeating: 0, count: 10)

배열에 저장된 요소의 갯수는 카운트 속성으로 확인할 수 있다.

a.count

배열이 비어있는지 확인할 수 도 있는데 방법은 아래와 같다.
a.count == 0

a.isEmpty


Accessing Elements

그럼 배열의 요소에 접근하기 위해선 어떻게 해야할까?
다양한 방법들이 있는데 하나씩 알아가보자

첫번째 방법으로는 중괄호와 인덱스를 이용한 방법이다.
배열이 저장된 요소에 접근하기 위해 중괄호와 인덱스만 써주면 되며 범위도 전달하여 리턴받을 수 있다.

let num = [22, 33, 53, 77]

num[0]
//22

num[3]
// 77

num[0...2]
// 22, 33, 53

정수 인덱스 대신 속성으로 제공하는 인덱스를 사용하는 접근할 수도 있다. 이는 코드가 복잡해졌을때 보다 안전하게 인덱스에 접근할 수 있도록 도와준다.
let num = [22, 33, 53, 77]

num[num.startIndex]
// 첫번째 인덱스를 호출하는 코드

num[num.index(befor: num.endIndex)]
// 마지막 인텍스를 호출하는 코드

위의 예시에 마지막 코드를 보면 위의 첫번째 인덱스를 호출하는 코드와 모습이 다른데 그 이유는 startIndex는 첫번째 인덱스를 호출하지만 'endIndex'는 마지막 인덱스 그 다음을 호출하는 코드이다. 즉 마지막 인덱스 다음인 빈 공간을 호출하기 때문에 그대로 쓰면 오류가 발생하고 때문에 위의 코드처럼 한칸 앞당겨 써야한다.

이 첫 번째와 마지막 인덱스를 위 예시보다 쉽게 호출하는 속성들도 있다.

let num = [22, 33, 53, 77]

num.first
// 첫번째 인덱스를 호출하는 코드

num.last
// 마지막 인텍스를 호출하는 코드

위 예시의 경우 옵셔널 속성을 가지고있다. 때문에 배열이 비어있더라도 오류가 나지않고 nil을 리턴해준다.

배열에 접금할때 범위를 지정해서 접근할 수도 있는데

let list = ["a", "b", "c", "d", "e"]

list[1...3]
// "b", "c", "d"

list[2...]
// "b", "c", "d", "e"

liet.prefix(3)
// "a", "b", "c"

prefix의 경우 선언된 숫자값의 갯수 만큼 배열을 리턴해준다. 또한 prefix의 경우 배열의 최대 갯수 보다 높은 수를 입력하더라도 오류가 발생하지 않는다.

let list = ["a", "b", "c", "d", "e"]

liet.prefix(20)
// "a", "b", "c", "d", "e"

prefix를 이용하는 방법이 더 있는데

let list = ["a", "b", "c", "d", "e"]

list.prefix(upTo : 2)
// "a", "b"

list.prefix(through : 2)
// "a", "b", "c"

위의 코드들은 prefix를 이용하여 인덱스에 접근하는 방식으로 upTo는 값의 하나 적은 수의 인덱스에 접근하는 코드로 위의 예시에선 인덱스'1' 까지 접근하여 인덱스 '0', '1' 을 리턴하고 through는 해당 값의 인덱스 까지 접근함으로 예시에선 인덱스 '0', '1', '2' 까지 리턴해준다.

조건을 지정하는 방법도 있는데 prefix while 을 사용하면 된다.

let list = ["a", "b", "c", "d", "e"]

let f = list.prefix{$0 != "c"}
f
// "a", "b"

위의 코드는 배열 속의 "c" 이전까지의 인덱스들을 추출해주는 코드로 "a", "b" 가 출력된다.


prefix가 요소들을 앞쪽 부터 순서대로 추출해준다면 요소들을 뒤쪽부터 추출해주는 코드도 있는데 suffix이다.
let list = ["a", "b", "c", "d", "e"]

list.suffix(3)
// "c", "d", "e"

위 예시에서 suffix는 배열의 마지막 요소 부터 역순으로 3개의 요소들을 순서대로 추출해주고있다.

suffix를 이용하여 인덱스에 접근하려면 아래와 같이 사용해주면된다.

let list = ["a", "b", "c", "d", "e"]

list.suffix(from: 2)
// "c", "d", "e"

위 예시에서 from에 들어간 값 '2'는 인덱스 값을 나타낸다. 위 코드는 인덱스 2부터 끝까지 모든 요소들을 리턴하는 코드이다.

1개의 댓글

comment-user-thumbnail
2023년 8월 13일

👍👍👍

답글 달기