Axe's Life

Swift - Array ) 배열의 기초 본문

Swift Book

Swift - Array ) 배열의 기초

devAxe 2020. 1. 20. 20:57

스위프트는 튜플 외에도 많은 수의 데이터를 묶어서 저장하고 관리할 수 있는 컬렉션 타입을 제공합니다.

 

컬렉션 타입에는 '배열', '딕셔너리', '세트'가 있습니다. 

 

  • Array (배열) - 멤버가 순서를 가진 리스트 형태의 컬렉션 타입
  • Dictionary (딕셔너리) - 키(Key)와 값(Values)의 쌍으로 이루어진 컬렉션 타입
  • Set (세트) - 순서가 없고, 멤버가 유일한 것을 보장하는 컬렉션 타입

 

오늘은 컬렉션 타입 중에서 배열에 대해서 알아보겠습니다!

 


배열 생성 (Create Array)

 

● 정식 문법

Tip: 정식 문법보다는 단축 문법을 주로 사용합니다.

 

먼저 정식 문법의 모습과 어떻게 생성하는지를 봅시다.

// 생성 방법: (let 또는 var) 배열 이름: Array<배열의 타입>

let arr1: Array<Int> // 상수형 정수 배열
var arr2: Array<String> // 변수형 문자열 배열

실제로 코드를 짤 때는 정식 문법을 자주 쓰지 않습니다. (좀 귀찮거든요...)

 

● 단축 문법

Tip: 'Array<배열의 타입>'에서 '[배열의 타입]'으로 바뀐 거라고 생각하면 쉽습니다.

 

단축 문법은 정식 문법보다 훨씬 간단합니다.

// 생성 방법: (let 또는 var) 배열 이름: [배열의 타입]

let arr1: [Int] // 상수형 정수 배열
var arr2: [String] // 변수형 문자열 배열

대괄호 사이에 배열의 타입을 명시해주기만 하면 됩니다. (정식 문법에 비해 편합니다)

실제 코드를 짤때, 단축 문법을 주로 사용하여 배열을 생성합니다.

 

◎ 형식 추론 (타입 유추)

※ 배열의 타입을 명시하지 않아도 되지만, 빈 배열을 만들 경우에는 타입을 반드시 명시해야 합니다.

 

형식 추론은 타입을 명시하지 않아도 되기에 제일 편합니다.

 

iOS 앱 개발을 할 때 우리가 항상 실행시키는 Xcode의 컴파일러(Apple LLVM/Clang)가 배열에 들어가는 값이

무엇인지 형식 추론을 하여 알아서 결정해줍니다. (아주 편리하죠?)

// 생성 방법: (let 또는 var) 배열 이름 = [배열의 타입과 일치하는 값]

let arr1 = [1, 2, 3, 4, 5] // 상수형 정수형 배열
var arr2 = ["일", "이", "삼", "사", "오"] // 변수형 문자열 배열

하지만!

주의해야 할 점이 있습니다.

 

1. 빈 배열을 만들 때는 타입을 꼭 명시해야 하기 때문에 사용하면 안 됩니다.

let emptyArr = [] // error!

'배열에 값 넣기'에서 설명할 것이기에, 여기서 자세한 설명은 하지 않겠습니다.

 

 

2. 다른 타입의 값을 한꺼번에 같이 넣으면 안 됩니다.

let arr = [1, "이", 3, "사"] // error!

이런 식으로 대괄호 안에 여러 타입의 값을 같이 넣으면 에러가 발생하게 됩니다.

 

그렇다고 해서 여러 타입의 값을 한 배열 안에 다 넣지 못하는 것만은 또 아닙니다!

마찬가지로 이 내용도 '배열에 값 넣기'에서 자세히 설명하겠습니다. 

 

 

 


 

배열에 값 넣기 (Put Values In Array)

 

● 빈 배열 만들기

※ 반드시 배열의 타입을 명시해야 합니다.

 

빈 배열은 세 가지 형태로 만들 수 있습니다.

//let emptyArray = [] // error: 타입 명시가 돼 있지 않음. (형식 추론 X)

let emptyArray: [Int] = []

// 정식 문법 사용
let emptyArray2 = Array<Int>()

// 단축 문법 사용
let emptyArray3 = [Int]()

빈 배열을 만들 때는 반드시 배열의 타입을 명시해줘야 합니다.

그렇기에, 형식 추론을 사용하여 타입 명시를 생략할 수는 없습니다.

 

+ 형식 추론은 대괄호 사이에 있는 값을 바탕으로 추론을 하기에 값을 넣지 않는다면 에러가 발생하게 됩니다.

 

즉, 형식 추론이 아닌 단축 문법을 사용해야 한다는 것이죠!

 

● 임의의 값 넣기

※  대입 연산자 '='의 뒤에는 대괄호 사이에 배열의 타입과 일치하는 값을 넣어줘야 합니다.

 

임의의 값을 넣는 데에도 여러 형태가 있습니다.

// 정식 문법
let strArray1: Array<String> = ["정식", "문법"]

// 단축 문법
let strArray2: [String] = ["단축", "문법"]

// 형식 추론
let strArray3 = ["형식", "추론"]

// 시퀀스
let nums = Array(1...3) // [1, 2, 3]

// 여러 자료형(타입)
let anyArr: [Any] = [1, 2, "three", "four"] // [1, 2, "three", "four"]

정식 문법과 단축 문법은 명시한 배열의 타입과 일치하는 값을 대괄호 사이에 넣어줍니다.

값을 구분할 때는 ' , '(콤마)를 사용하여 구분해 줍니다.

 

형식 추론은 앞서 보았기에... PASS!

 

범위 연산자를 사용하여 정수 값의 범위를 일일이 입력하지 않고도 편하게 넣을 수 있습니다.

한 배열 안에 여러 타입의 값을 넣고 싶다면 'Any'를 사용하시면 됩니다!

 

● 크기가 정해진 배열

 

크기가 정해진 배열을 만들 수 있습니다.

// (repeating: 배열의 타입과 일치하는 값(1개), count: 값을 반복할 횟수)

let zeroArray1 = [Int](repeating: 0, count: 10) // [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

let zeroArray2 = Array(repeating: 0, count: 10) // [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

// zeroArray1과 zeroArray2는 완전히 동일합니다.

범위 연산자와의 차이점이라고 하면 범위 연산자는 특정 범위 내에서 1씩 증가한 값이 배열에 넣어지지만,

Array(repeating:count:) 메서드는 반복할 값 1개(repeating)가 지정된 횟수(count) 만큼 배열에 넣어집니다.

 

 


 

배열의 가변성 (Array Variability)

 

배열에도 변수형 배열과 상수형 배열이 있습니다. (이미 아실 거기에... Skip!)

// 변수형 배열 (배열 생성 후 배열요소 변경가능)
var someArr1 = [1, 2, 3, 4, 5]
someArr1[0] = 0

// 상수형 배열 (배열 생성 후 배열요쇼 변경 불가능)
let someArr2 = [1, 2, 3, 4, 5]
//someArr2[0] = 0 // error: 상수형 배열로 생성했기에 변경 불가능!

 

 


 

배열 검사 (Inspecting an Array)

 

 

배열에 들어있는 값의 개수를 알고 싶다면 이 속성들을 사용하시면 편리합니다.

let nums = [1, 2, 3]
let emptyArray: [Int] = []

// .count == 배열에 들어있는 값의 개수 검사
nums.count // 3
nums.count == 0 // false

// .isEmpty == 배열에 값이 없는지를 판단
nums.isEmpty // false
emptyArray.isEmpty // true

 

 


 

배열 요소 접근 (Accessing Elements)

※ 스위프트의 배열의 인덱스는 0부터 시작합니다. (0, 1, 2, 3, ...)

 

let fruits = ["Apple", "Banana", "Melon"]

문자열 배열인 fruits배열이 있습니다.

이 배열에서 "Apple"은 인덱스가 어떻게 될까요?

스위프트는 c언어와 마찬가지로 '0 based index'입니다.

그래서 "Apple"의 인덱스는 0입니다! ("Melon"은 2)

 

● 서브 스크립트

 

서브 스크립트를 설명하기에 앞서, 배열의 요소에 접근하는 방법을 알아보겠습니다.

 

배열 내부의 값을 얻기 위해서는 이와 같은 문법을 사용합니다.

// 배열의 이름[얻고자하는 요소의 인덱스]

fruits[0] // "Apple"
fruits[1] // "Banana" 
fruits[2] // "Melon"
//fruits[3] // error: 인덱스는 0부터 시작하기에 3은 없음 (인덱스를 벗어남)

 

자 그럼,

서브 스크립트란?

배열 내부의 값을 얻기 위해선 'fruits[0]'와 같은 문법을 사용합니다.

대괄호 사이에 인덱스를 입력함으로써 값을 얻을 수 있죠.

 

이렇게 내가 원하는 값을 쉽게 찾기 위해서 정의하는 문법을 서브 스크립트라고 합니다.

'fruits[0]'이런 방식은 배열의 서브 스크립트를 사용한 것입니다.

 

그럼, 배열의 서브 스크립트를 사용하여 요소에 접근하는 방법을 보겠습니다.

// 범위 연산자를 사용하여 특정 범위를 추출
fruits[0...1] // ["Apple", "Banana"]

// 첫 번째 요소 접근
fruits[fruits.startIndex] // "Apple"

// 마지막 요소 접근
// endIndex는 배열의 마지막 인덱스가 아님
//fruits[fruits.endIndex] // error: 인덱스를 벗어남
fruits[fruits.index(before: fruits.endIndex)] // "Melon"

'startIndex'가 첫 인덱스라고 해서 'endIndex'가 마지막 인덱스는 아닙니다.

'endIndex'는 마지막 인덱스의 다음 인덱스입니다.

그렇기에 index(before:) 메서드를 사용하여 'endIndex'의 이전 인덱스를 가리키는 것이죠.

 

 

● 속성

Tip: 배열의 시작과 마지막 인덱스에 접근할 때는 속성을 사용할 수 있습니다.

 

fruits.first // "Apple"
fruits.last // "Melon"

// 배열이 비어있다면 nil을 반환
emptyArray.first // nil
emptyArray.last // nil

// 배열의 서브스크립트를 사용하면 nil을 반환하지 않고 error가 발생합니다.
//emptyArray[0] // error: 배열에 값이 없음

 

서브 스크립트 문법은 배열이 비어있을 때 접근하면 에러가 나기에 불안전합니다.

하지만, 속성을 사용하면 에러가 아닌 'nil'을 반환하기에 비교적 안전합니다.

 


부족한 설명 봐주셔서 감사합니다!

여러모로 부족한 부분이 많기에 혹시라도 잘못된 정보가 있다면 댓글로 알려주시면 감사하겠습니다!

 

<Axe's GitHub - Swift Book> Array

 

Swift Book - Array <- 정리된 자료를 보고 싶다면, 클릭!

 

devMinseok/Swift_Book

Swift문법이 정리된 저장소입니다. Contribute to devMinseok/Swift_Book development by creating an account on GitHub.

github.com

 

'Swift Book' 카테고리의 다른 글

Swift - Closure ) 클로저 문법  (0) 2020.01.16
Let's Swift Book!  (2) 2020.01.16
Comments