일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Let's SwiftBook
- SwiftBook
- Apple
- 스위프트 배열 생성
- Swift 문법
- Swift5
- 리액티브프로그래밍
- swift 배열
- IOS
- Xcode
- 스위프트 클로저
- Xcode 프로젝트
- Xcode 프로젝트 생성
- 스위프트 문법
- iOS앱 개발
- 클로저 문법
- Xcode 프로젝트 삭제
- iOS 앱 만들기
- ReactiveX란
- Xcode 프로젝트 추가
- MarbleDiagram
- RxSwfit
- 마블다이어그램
- swift
- xcode 플레이그라운드
- 맥북
- xcode 11
- ReactiveX
- 스위프트
- iOS 앱 기초
- Today
- Total
Axe's Life
Swift - Array ) 배열의 기초 본문
스위프트는 튜플 외에도 많은 수의 데이터를 묶어서 저장하고 관리할 수 있는 컬렉션 타입을 제공합니다.
컬렉션 타입에는 '배열', '딕셔너리', '세트'가 있습니다.
- 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 <- 정리된 자료를 보고 싶다면, 클릭!
'Swift Book' 카테고리의 다른 글
Swift - Closure ) 클로저 문법 (0) | 2020.01.16 |
---|---|
Let's Swift Book! (2) | 2020.01.16 |