궁금한 내용을 검색해보세요!
이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
서근 개발노트
티스토리에 팔로잉
SWIFT/Grammar

Swift : 기초문법 [배열(Array)]

서근
QUOTE THE DAY

-
Written by SeogunSEOGUN

반응형

본 게시글은 yagom님의 Swift 프로그래밍 3판을 참고하여 작성되었습니다.

 

배열

배열(array)은 단일 값으로 저장되는 값의 모음입니다. 배열을 사용하면 많은 값을 단일 컬렉션으로 그룹화 한 다음 컬렉션에서의 위치별로 해당 값에 액세스 할 수 있습니다. Swift는 유형 추론을 사용하여 다음과 같이 배열에 어떤 유형의 데이터가 있는지 파악합니다.

 

배열 타입을 선언해줄 방법은 다양합니다. let 키워드를 사용해 상수로 선언하면 변경할 수 없는 배열이 되고, var키워드를 사용해 변수로 선언해주면 변경 가능한 배열이 됩니다. 실제로 배열을 사용할 때는 Array라는 키워드와 타입 이름의 조합으로 사용합니다. 또, 대괄호로 값을 묶어 Array 타입임을 표현할 수도 있습니다. 빈 배열은 이니셜라이저 또는 리터럴 문법을 통해 생성해줄 수 있는데 isEmpty 프로퍼티로 비어있는 배열인지 아닌지 확인할 수 있습니다. 그리고 그 배열에 몇 개의 요소가 존재하는지 확인하려면 count 프로퍼티를 사용하면 되겠죠?!

var evenNumbers = [2, 4, 6, 8]
var songs = ["다이너마이트", "피땀눈물", "life goes on"]

배열의 각 항목은 쉼표로 구분됩니다.

 

배열에서 항목을 읽을 때 문제가 있습니다.

Swift는 0부터 계산을 시작합니다. 즉, 첫 번째 항목은 0, 두 번째 항목은 1, 세 번째 항목은 2 입니다.

var evenNumbers = [2, 4, 6, 8]
var songs = ["다이너마이트", "피땀눈물", "life goes on"]
songs[0] //다이너마이트
songs[1] //피땀눈물
songs[2] //life goes on

위 코드에서 세 개의 String을 사용하여 배열을 만들었습니다. swift는 이 코드가 String 배열임을 이미 알고 있습니다. 만약 코드가 어떤 유형의 배열인지 확인하고 싶다면 특수 명령어를 사용할 수 있습니다.

var songs = ["다이너마이트", "피땀눈물", "life goes on"]
type(of: songs)
// Array<String>.Type

하지만 우리는 songs에 따로 유형을 정해주지 않았기에 swift는 예측을 할 뿐이죠. 아래와 같은 코드면 어떨까요?

var songs = ["다이너마이트", "피땀눈물", "life goes on", 3]
type(of: songs)
// error

이번에는 오류가 표시됩니다. Swift가 혼합 배열을 처리할 수 없다는 뜻이 아닙니다. 위 유형은 Any 입니다. 

이럴 때는 반드시 데이터 유형을 지정해줘야 합니다.

var songs: [Any] = ["다이너마이트", "피땀눈물", "life goes on", 3]
type(of: songs)
//Array<Any>.Type

 

예시

예를 들어 하울, 소피아, 포뇨, 소스케는 이름이지만 배열을 통해 Ghibli라는 단일 값으로 그룹화할 수 있습니다. 코드에서 다음과 같이 작성합니다. 마지막 줄은 [배열]을 만듭니다. 대괄호로 시작하고 끝납니다. 배열의 각 항목은 쉼표로 구분됩니다.

let 하울 = "마법사 하울"
let 소피아 = "할머니 소피아"
let 포뇨 = "물고기 포뇨"
let 소스케 = "소스케"

let Ghibli = [하울, 소피아, 포뇨, 소스케]
//print : 마법사 하울, 할머니 소피아, 물고기 포뇨, 소스케

대괄호 안에 숫자를 써서 배열에서 값을 읽을 수 있습니다. 배열 위치는 0부터 카운트되므로 "물고기 포뇨"를 읽으려면 다음과 같이 작성해야 합니다.

Ghibli[0]  //print = 마법사 하울
Ghibli[1]  //print = 할머니 소피아
Ghibli[2]  //print = 물고기 포뇨
Ghibli[3]  //print = 소스케

주의 : 존재하지 않는 항목을 읽으면 Swift가 충돌합니다. 예를 들어, 읽는 Ghibli[9]를 작성하면 런타임 오류가 생깁니다.

TIP
 
 

참고 : 만약 어노테이션 타입을 사용하는 경우, 배열은 대괄호로 작성해야 합니다. : [String],[Int],[Double],[Bool]

배열 생성

배열을 만들고 나중에 채우려는 경우에는 몇 가지 방법이 있고, 아래와 같이 작성할 수 있습니다.

var songs = [String]()
var songs: [String] = []

위 두 가지 코드는 동일한 사용방법입니다. Swift에 문제의 배열을 생성하고 songs() 유형 추론을사용하여 할당되도록 지정합니다.

var names: [String] = ["서근", "포뇨", "소피아", "하울", "유바바"]

// var name: Array<String> = ["서근", "포뇨", "소피아", "하울", "유바바"] // 위 선언과 동일한 방법

var emptyArray: [Any] = [Any]() // Any데이터를 요소로 갖는 빈 배열을 생성
//var emptyArray: [Any] = Array<Any>()   // 위 선언과 동일한 방법
//var emptyArray: [Any] = [] // 배열의 타입을 정확히 명시했다면 [] 만으로도 빈 배열 생성 가능

print(emptyArray.isEmpty)
print(names.count)

배열은 각 요소에 인덱스를 통해 접근 가능하다고 했었죠? 인덱스는 0부터 시작하고 잘못된 인덱스로 접근하려고 하면 인셉션 오류가 발생합니다. 또, 맨 처음과 맨 마지막 요소는 firstlast프로퍼티를 통해 가져올 수 있습니다. firstIndex(of:)메서드를 사용하면 해당 요소의 인덱스를 알아낼 수 도 있죠. 만약 중복된 요소가 있다면 제일 먼저 발견된 요소의 인덱스를 반환합니다. 맨 뒤에 요소를 추가하고 싶으면 append(_:)메서드를 사용합니다.

 

중간에 요소를 삽입하고 싶다면 insert(_:at:)메서드를 사용하면 됩니다. 요소를 삭제하고 싶다면 remove(_:)메서드를 사용하면 되는데, 메서드를 사용하면 해당 요소가 삭제된 후 반환됩니다.

var names: [String] = ["서근", "포뇨", "소피아", "하울", "유바바"]
// var name: Array<String> = ["서근", "포뇨", "소피아", "하울", "유바바"] // 위 선언과 동일한 방법

var emptyArray: [Any] = [] // 배열의 타입을 정확히 명시했다면 [] 만으로도 빈 배열 생성 가능
//var emptyArray: [Any] = [Any]() // Any데이터를 요소로 갖는 빈 배열을 생성
//var emptyArray: [Any] = Array<Any>()   // 위 선언과 동일한 방법

print(emptyArray.isEmpty) // true

print(names.count) // 5

print(names[2]) // 소피아
names[2] = "캘시퍼"
print(names[2]) // 캘시퍼
//print(names[5]) // error: Index out of range

names.append("미진") //마지막에 "미진"이 추가됩니다.
names.append(contentsOf: ["소울", "엘사"])
print(names) // ["서근", "포뇨", "캘시퍼", "하울", "유바바", "미진", "소울", "엘사"]
names.insert("지니", at: 2)// 인덱스 2에 추가됩니다.
names.insert(contentsOf: ["해지", "땅콩"], at: 3) // 인덱스 3에 추가됩니다.
print(names) // ["서근", "포뇨", "지니", "해지", "땅콩", "캘시퍼", "하울", "유바바", "미진", "소울", "엘사"]

print(names.firstIndex(of: "서근")) // 0
print(names.firstIndex(of: "라저")) // nil
print(names.first) // 서근
print(names.last) // 엘사

names.removeFirst() // 서근 삭제
names.removeLast() // 엘사 삭제
print(names) // ["포뇨", "지니", "해지", "땅콩", "캘시퍼", "하울", "유바바", "미진", "소울"]


let firstItem: String = names.removeFirst()
let lastItem: String = names.removeLast()
let indexZeroItem: String = names.remove(at: 0) //인덱스를 지정해서 삭제 가능

print(firstItem) // 포뇨
print(lastItem) // 소울
print(indexZeroItem) // 지니
print(names[1...4]) // ["땅콩", "캘시퍼", "하울", "유바바"]

배열 연산자

제한된 연산자 집합을 배열에 사용할 수 있습니다. 예를 들어 다음과 같이 +연산자를 사용하여 두 배열을 병합할 수 있습니다.

var songs = ["다이너마이트", "피땀눈물", "life goes on"]
var songs2 = ["savage love", "Dionysus"]
var both = songs + songs2

//["다이너마이트", "피땀눈물", "life goes on", "savage love", "Dionysus"]

다음과 같이 +=를 사용하여 추가하고 할당할 수도 있습니다.

both += ["봄날"]
//["다이너마이트", "피땀눈물", "life goes on", "savage love", "Dionysus", "봄날"]

Swift에 배열이 있는 이유는??

Swift의 String, Int, BooleansDoubles를 사용하면 일시적으로 단일 값을 저장할 수 있지만 많은 값을 저장하려면 [배열]을 사용하는 경우가 많습니다. 다른 유형의 데이터처럼 배열의 상수(let)와 변수(var)를 만들 수 있지만 차이점은 배열이 그 안에 많은 값을 보유한다는 것입니다. 예를 들어 이름, 다음 주의 기온 예측 또는 비디오 게임의 최고 점수 등을 저장하려면 단일 값이 아닌 배열이 필요합니다.

 

Swift의 배열은 원하는 만큼 크거나 작을 수 있습니다. 가변적이면 자유롭게 추가하여 시간이 지남에 따라 데이터를 구축하거나 원하는 경우 항목을 제거하거나 재정렬할 수도 있습니다.

 

0부터 카운트하는 숫자를 사용하여 배열에서 값을 읽습니다. 다시 한번 말하지만, Swift의 배열은 0부터 카운트를 합니다. 잘못된 인덱스를 사용하여 배열을 읽으려고 하면 Swift가 자동으로 프로그램을 충돌시킵니다. 

 

예시

var cities: [String] = ["London", "Paris", "New York"]
var readings: [Bool] = [false, false, true, false]

 

Array TEST : 문제를 풀려면 이곳을 클릭해주세요.

 

 

읽어주셔서 감사합니다🤟

 

 


잘못된 내용이 있으면 언제든 피드백 부탁드립니다.


서근


위처럼 이미지 와 함께 댓글을 작성할 수 있습니다.