dev._.note

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

Dev/SWIFT

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

Laena 2023. 10. 25. 17:29

배열의 선언 및 초기화

배열은 가지는 요소의 타입에 따라 자동으로 타입 추론.

선언과 동시에 초기화 할 때는 요소에 값이 들어있다면 자동으로 타입 추론이 이루어지기 때문에 타입을 명시하지않아도됨.

var numbers = [1, 2, 3, 4, 5]
var strings = ["A", "B", "C"]

 

빈 배열을 선언할 때는 타입을 명시.

var double: [Double] = []
var string = [String]()
var float: Array<Float> = Array()

타입을 명시 않았을 경우 에러발생.

var arr = [] // error발생 [!] Empty collection literal requires an explicit type

 

Int 타입 배열을 사용하면 연속된 숫자 배열을 아래와 같이 선언가능.

var arr = Array<Int>(1...5) // [1, 2, 3, 4, 5]

 

Any타입을 사용하면 여러 자료형 요소를 사용할 수 있다. (Int, String.. 하단예시)

let arr: [Any] = [1, 2, "가", "a"]

특정 값만 반복해서 초기화

Array(repeating:count:)을 사용하면 특정 값만 반복적으로 생성.

var countNumbers = Array(repeating: 0, count: 5) 
print(countNumbers) // [0, 0, 0, 0, 0]

var countStrings = [String](repeating: "", count: 5) 
print(countStrings) // ["", "", "", "", ""]

 

repeating에 들어가는 값이 클래스의 인스턴스일 경우 반복되는 모든 요소가 동일한 인스턴스를 참조하게 되어 요소 하나의 속성만 변경해도 모든 값이 변경됨.

소문자로 시작하는 self는 모든 인스턴스들이 암시적으로 생성하는 프로퍼티. 자바의 this와 같이 자신을 가르키는 용도.

class Animal: AnimalClass {
    var name: String // 클래스의 인스턴트
    
    init(name: String) {
        self.name = name // 소문자로 시작하는 self는 모든 인스턴스들이 암시적으로 생성하는 프로퍼티
    }
    
    var description: String {
        return "Animal(\(self.name))"
    }
}

 

모든 값이 변경되는 경우.

var animals = Array(repeating: animals(name: "사자"), count: 3)
print(animals)  // [animals("사자"), animals("사자"), animals("사자")]

animals[0].name = "기린" // 사자 > 기린
print(animals)  // [animals("이순신"), animals("이순신"), animals("이순신")]

 

배열 출력

var arr = ["사자", "a", "티라노사우르스"]

print(arr) // ["사자", "a", "티라노사우르스"]

 

요소의 위치 값으로 접근

요소의 위치(인덱스) 값, 인덱스 범위를 사용해서 값에 접근.

var animal = ["사자", "개", "고양이"]

print(animal[0]) // ["사자"]
print(animal[1..<2]) // ["개", "고양이"]

빈 배열의 경우 참조할 인덱스가 없으므로 에러발생.

var EmptyDoubles: [Double] = []
print(emptyDoubles[0]) // [!] Triggers runtime error: Index out of range

요소 값 변경

var로 선언된 경우에만 다른 값을 넣을 수 있음.

var arr = ["A","B","C"]
arr[0] = "개"
arr[2] = "고양이"

print(arr) // ["개", "Banana", "고양이"]

 

let으로 선언된 경우는 변경할 수 없음.

let arr = [1, 2, 3]
arr[2] = 1 // 에러발생 [!] Cannot assign through subscript: 'intArray' is a 'let' constant

요소 값 추가

insert(_:at:)을 사용하면 특정 위치에 값을 삽입 할 수 있음. insert(값, at : 인덱스)

insert메소르를 사용하면 배열의 크기가 1 증가하고 값이 삽입된 위치 뒤로 1칸씩 밀리게됨.

var arr = [1, 2, 3]
arr.insert(100, at: 0)

print(arr) // [100, 1, 2, 3]

 

insert(contentsOf:at:)을 사용하면 특정 위치 여러 요소를 한꺼번에 삽입할 수 있음.

var arr = [1, 2, 3]
arr.insert(contentsOf: [200, 54, 0], at: 1)
print(arr) // [1, 200, 54, 0, 2, 3]

 

append(_:)을 사용하면 배열의 맨 뒤에 값을 추가할 수 있음.

var arr = [1, 2, 3]
arr.append(4)

print(arr) // [1, 2, 3, 4]

 

append(contentsOf:)를 사용하면 배열 맨 뒤에 여러 요소들을 한꺼번에 삽입할 수 있음. += 연산자를 대신 사용가능.

var arr1 = [1, 2, 3]
var arr2 = [4, 5, 6]

// contentsOf 사용
arr1.append(contentsOf: arr2)
print(arr1) // [1, 2, 3, 4, 5, 6]

// +=연산자 사용
arr1 += [7, 8, 9, 10]
print(arr1) // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

 


요소 값 제거

remove(at:)을 사용하면 값을 제거할 수 있음. remove(at:인덱스)

var arr = [1, 2, 3]
arr.remove(at: 1)

print(arr) // [1, 3]

 

removeFirst()을 사용하면 첫번째 값을 제거할 수 있음.

var arr = [1, 2, 3]
arr.removeFirst()

print(arr) // [2, 3]

 

removeLast()을 사용하면 마지막 값을 제거할 수 있음.

var arr = [1, 2, 3]
arr.removeLast()  // arr.remove(at: arr.count - 1)와 같은 표현

print(arr) // [1, 2]

 

removeFirst()와 removeLast()에 인자 값으로 점프할 인덱스 값(Int)을 넣으면 배열의 맨 앞 또는 맨 뒤에서부터 몇 칸 띄운 값을 지우겠다는 의미.

var arr = [1, 2, 3, 4, 5]
arr.removeFirst(2) // arr.remove(at: 2)와 같은 표현 > 3 삭제
arr.removeLast(1)  // arr.remove(at: numbers.count - 2)와 같은 표현 > 4 삭제

print(arr) // [1, 2 ,5]

 

popLast()을 사용하면 마지막 값(Optional)을 반환하면서 제거.

빈 배열일 경우에도 nil을 반환하고 에러가 발생하지 않음. nill은 null과 같음.

var arr = [1, 2, 3]

print(arr.popLast()) // Optional(3)
print(arr) // [1, 2]

 

removeAll() 사용하면 모든 요소를 제거하여 빈 배열로 만들 수 있음.

var arr = [1, 2, 3]
arr.removeAll()

print(arr) // []

 

removeSubrange(_:) 사용하면 일부 구간을 제거할 수 있음. 제거하고 싶은 인덱스 범위를 입력.

var arr = [1, 2, 3, 4, 5]
arr.removeSubrange(1..<2) // 1부터 2까지 범위 제거
print(arr) // [1, 4, 5]

 

dropFirst(_:)을 사용하면 앞에서 몇개의 값을 제거한 새로운 배열을 반환.

let arr = [1, 2, 3]

print(arr.dropFirst(2))	// [3] 앞에서부터 2개 제거한 새로운 배열 반환
print(arr) // [1, 2, 3] 기존배열은 변경되지 않음

 

dropLast(_:)을 사용하면 뒤에서 몇개의 값을 제거한 새로운 배열을 반환.

let arr = [1, 2, 3]

print(arr.dropLast(1))	// [1, 2] 뒤에서부터 1개 제거한 새로운 배열 반환
print(arr) // [1, 2, 3]

 


요소 값의 인덱스 찾기

firstIndex(of:)을 사용하면 배열에서 원하는 값의 인덱스를 찾을 수 있고 Optional Int 형태를 반환.

찾고자 하는 값이 여러 개일 경우, 가장 앞에 있는 값의 인덱스를 반환. 해당하는 값이 없을 때는, nil을 반환.

var arr = [1, 2, 3]
print(arr.firstIndex(of: 3)) // Optional(2)
print(arr.firstIndex(of: 5)) // nil

 

반환 값이 Optional일 경우 언랩핑(Unwrapping)하여 사용. 인덱스 값을 알아내서 사용가능.

var aninals = ["개", "고양이", "사자"]
	if let a = aninals.firstIndex(of: "사자") { // Optional(2) : let a = 2
		aninals[a] = "호랑이"
	}
    
print(aninals) // ["개", "고양이", "호랑이"]

 

lastIndex(of:)을 사용하면 원하는 값의 마지막 인덱스를 찾을 수 있음.

var arr = [1, 2, 3, 3]
print(arr.lastIndex(of: 3)) // Optional(3)

 


특정 값 포함 판단

firstIndex(of:)을 사용하면 특정 요소가 있는지 판단할 수 있고 반환값이 nil이 아닌지를 검사할 수 있음.

contains()을 사용하면 Bool값으로 단순 포함여부만 반환.

var arr = [1, 2, 3]

print(arr.contains(1)) // true
print(arr.contains(5)) // false

 


배열의 크기

count 속성을 사용하면 배열에 요소가 몇 개 있는지 알수 있음.

var int = [Int]()

print(int.count) // 0

 

배열을 처음에 선언하면, 배열의 크기와 별개로 내용을 보관하기 위한 메모리를 예약하게 됨.

배열의 예약된 메모리 크기는 capacity 속성을 사용해서 알 수 있음.

capacity를 정의하자면 새 스토리지를 할당하지 않고 배열에 포함될 수있는 총 요소 수 라고 할 수 있다.

 

요소를 추가하다가 배열의 capacity를 초과하게 되면 배열은 더 큰 메모리를 할당하여 새 공간에 요소들을 복사한다.

이 때 할당되는 새로운 배열의 용량은 기존 크기의 배수이다.

따라서 요소를 많이 추가하게 될수록, 점점 재할당 발생 빈도가 낮아지게 된다.

var numbers = [1,2,3,4]
print(numbers.count)    // 4
print(numbers.capacity) // 4

numbers.append(5)
print(numbers.count)    // 5
print(numbers.capacity) // 8

 

만약, 배열에 요소가 얼마나 저장될 지 대략 예상할 수 있으면 미리 capacity를 설정하여 재할당을 방지할 수 있다.

capacity를 설정하는 방법은 reserveCapacity(_:)를 사용하면 된다.

numbers.reverseCapacity(10) 
print(numbers.capacity) // 10

빈 배열 여부

count 속성을 사용해서 요소의 개수가 0개인지 판단하는 방법.

var arr = [Int]()

print(arr.count == 0) // true

 

isEmpty 속성을 사용해서 단순히 빈 배열인지 여부만 판단하는 방법.

var arr = [Int]()

print(arr.isEmpty) // true

 

 

Apple 공식문서

https://developer.apple.com/documentation/swift/array

 

Array | Apple Developer Documentation

An ordered, random-access collection.

developer.apple.com

 

'Dev > SWIFT' 카테고리의 다른 글

[Swift] enumerated() 배열의 인덱스 가져오기  (0) 2023.10.26
[Swift] zip 함수  (0) 2023.10.26
[Swift] reverse() 와 reversed()의 차이점  (1) 2023.10.25
[Swift] Int형 정수  (0) 2023.10.25
[Swift] 고차함수(Higher-order Function)  (0) 2023.10.24