You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Swift에서는 값을 저장하기 위한 세 가지 Primary(기본) Collection type을 제공한다. 이번 장에서는 Primary Collection type(Dictionary, Array, Set) 중 Array를 알아보겠다!
Array란?
여러 데이터를 한번에 묶어서 처리할 때 편리한 데이터 유형
순서가 있는 컬렉션
Array 생성하기
1. 배열 생성 정식 문법
(let or var) 배열 이름: Array<배열의 타입>
letarr1:Array<Int>// 상수형 정수 배열vararr1:Array<String>// 변수형 문자열 배열
2. 배열 생성 단축 문법
단축 문법은 정식 문법보다 훨씬 간단하며 대괄호 사이에 배열의 타입을 명시해주기만 하면 된다.
letarr1:[Int]// 상수형 정수 배열vararr2:[String]// 변수형 문자열 배열
3. 타입 유추 (형식 추론)
아래와 같이 선언과 동시에 값을 할당해주면 Xcode의 컴파일러(Apple LLVM/Clang)가 배열에 들어가는 값이 무엇인지 확인하고 타입을 유추하여 배열의 타입을 결정해줍니다.
letarr1=[1,2,3,4,5]// 상수형 정수 배열vararr2=["one","two"]// 변수형 문자열 배열
선언과 동시에 값을 할당한다면 타입을 생략해도 된다. 하지만 빈 배열을 만들 경우에는 반드시 타입을 명시해야한다.
letemptyArr=[]// error!
4. 빈 배열 생성
빈 배열은 컴파일러가 타입을 유추할 수 없으므로 타입을 꼭 명시해야합니다.
letemptyArray:[Int]=[]// 정식 문법 사용letemptyArray2=Array<Int>()// 단축 문법 사용letemptyArray3=[Int]()
5. Array 생성과 값 할당
대입 연산자(=)의 뒤에는 대괄호 사이의 배열의 타입과 일치하는 값을 넣어줘야 합니다.
// 정식 문법letstrArray1:Array<String>=["정식","문법","돈까스 정식"]// 단축 문법letstrArray2:[String]=["단축","문법","단추","구녕.."]// 형식 추론letstrArray3=["형식","추론"]// 시퀀스letnums=Array(1...3)/// [1, 2, 3]// 여러 자료형(타입)letanyArr:[Any]=[1,2,"three","four"]
letnums=[1,2,3]letemptyArray:[Int]=[]// .count == 배열에 들어있는 값의 개수 검사
nums.count // 3
emptyArray.count // 0
2. Array 요소 유무 검사하기
letnums=[1,2,3]letemptyArray:[Int]=[]// .isEmpty == 배열에 값이 있는지 없는지 판단
nums.isEmpty // false
emptyArray.isEmpty // true
Array 요소에 접근하기
1. 서브 스크립트로 Array 요소에 접근하기
letfruits:Array<String>=["Apple","Banana","Melon"]fruits[0]// "Apple"fruits[1]// "Banana" fruits[2]// "Melon"//fruits[3] // error: 인덱스는 0부터 시작하기에 3은 없음 (인덱스를 벗어남)// 범위 연산자를 사용하여 특정 범위를 추출fruits[0...1]// ["Apple", "Banana"]// 첫 번째 요소 접근fruits[fruits.startIndex]// "Apple"// 마지막 요소 접근// endIndex는 마지막 인덱스의 다음 인덱스임// fruits[fruits.endIndex] // error: 인덱스를 벗어남// index(before:) 메서드를 사용하여 'endIndex'의 이전 인덱스를 가리키는 것fruits[fruits.index(before:fruits.endIndex)]// "Melon"
varnumbers=[1,2,3,4,5,6]
numbers.removeSubrange(1..<4)// 인덱스 1,2,3 범위의 값을 제거한다.print(numbers)// [1,5,6]
dropFirst, dropLast를 사용하여 특정 요소 제거하기
removeFirst와 다른 점으로는 기존 배열은 그대로 두고 값을 제거한 새로운 배열을 반환한다는 점이다.
dropFirst(_:)
letnumbers=[1,2,3,4,5]print(numbers.dropFirst(2))// [3, 4, 5] : 앞에서부터 2개 제거한 새로운 배열 반환print(numbers.dropFirst(10))// [] : 앞에서부터 10개 제거한 새로운 배열 반환print(numbers)// [1, 2, 3, 4, 5] : 기존 배열은 그대로
dropLast(_:)
letnumbers=[1,2,3,4,5]print(numbers.dropLast(2))// [1, 2, 3] : 뒤에서부터 2개 제거한 새로운 배열 반환print(numbers.dropLast(10))// [] : 뒤에서부터 10개 제거한 새로운 배열 반환print(numbers)// [1, 2, 3, 4, 5] : 기존 배열은 그대로
Array에서 원하는 값의 인덱스 찾기
1. firstIndex(of:), lastIndex(of:)를 사용하여 원하는 값의 인덱스 찾기
of 인자 값으로 원하는 값을 적어준다.
해당하는 값이 없을 때는 nil을 반환한다.
Optional Int 형태를 반환한다.
1-1. firstIndex(of:)
배열에 찾고자 하는 값이 여러개있을 경우, 가장 앞에 있는 값의 인덱스를 반환한다.
varnumbers=[1,2,3,4,4,3,2,1]print(numbers.firstIndex(of:3))// Optional(2)print(numbers.firstIndex(of:5))// 5의 값에 해당하는 index가 없기때문에 nil을 반환한다.
반환값이 Optional이기 때문에 언랩핑하여 사용하면 된다.
varfruits=["apple","banana","carrot"]
if let i = fruits.firstIndex(of:"Banana"){fruits[i]="beetroot"}print(fruits)// ["apple", "beetroot", "carrot"]
1-2. lastIndex(of:)
배열에 찾고자 하는 값이 여러개있을 경우, 가장 마지막에 있는 값의 인덱스를 반환한다.
varnumbers=[1,2,3,4,4,3,2,1]print(numbers.lastIndex(of:3))// Optional(5)print(numbers.lastIndex(of:5))// 5의 값에 해당하는 index가 없기때문에 nil을 반환한다.
Array에서 특정 값이 포함되어있는지 검사하기
1. firstIndex(of:)로 특정 요소가 있는지 검사하기
nil이 아닌지 검사하여 값이 포함되어있는지 검사한다.
letnumbers=[1,2,3]print(numbers.firstIndex(of:2))// Optional(2) -> 값이 있다.print(numbers.firstIndex(of:4))// nil -> 값이 없음