❓ values.count를 굳이 상수로 선언하지 않아도 되지만 굳이 선언한 이유는 무엇일까?
let array = [...] let length = array.count for i in 0..<length { ... }for문은 루프를 반복할 때마다 매번 조건식을 평가하는데, 이때 values.count를 상수로 선언하지 않고 바로 사용한다면 루프를 반복할 때마다 배열의 count라는 프로퍼티를 가져오기 위해 반복적으로 배열을 읽어야 합니다. 만약 크기가 큰 배열을 반복적으로 읽어오게 된다면 전체적으로 실행 속도를 떨어트리는 원인이 될 수 있기 때문에 될 수 있으면 한 번만 읽어 별도의 변수나 상수에 크기를 저장하고 사용하는 것을 지향합니다.
❓ 배열을 순회할 때 원소와 인덱스 값이 모두 필요한 경우 배열의 길이로 순회하는 것이 좋을까? 아니면 배열 자체를 순회하면서 index를 가져올 수 있는 메서드를 호출하는 것이 좋을까?
--
배열의 길이로 순회하는 것이 좋다!
배열을 순회하면서 값을 통해 인덱스를 구하는 메서드를 매번 호출하면 두가지 단점이 있습니다.
→ 성능 저하와 복잡한 코드.
인덱스를 구하는 메서드는 배열의 모든 요소를 순회해야 하기 때문에 성능이 저하될 수 있으며, 해당 메서드를 매번 호출해야 하기 때문에 코드가 더 길어지고 복잡해질 수 있습니다.
--
그런데 원소와 인덱스 값이 모두 필요한 경우 사실enumerated()메서드를 통해(offset:, element:)와 같이 Named Tuple 형태로 두 개의 값을 함께 받을 수 있습니다.
index는 결국 어떤 메모리 주소를 의미하는 것과 같습니다. 특정 메모리 주소에 index라는 값이 붙어 해당 메모리를 가리키는 것입니다.
let array = [0, 1, 2]
array.endIndex // 3
❓ 배열의 마지막 인덱스 값을 가져오면 0부터 카운팅했을 때 마지막 인덱스 값보다 +1한 값이 내려온다. 왜 그럴까?
--
배열에서 endIndex란 마지막 요소의 메모리 주소를 가리키고 있는 인덱스 값을 의미하는 것이 아닌, 배열로 저장되는 메모리 공간의 끝의 주소를 의미합니다. 그렇기 때문에 배열의 마지막 요소의 인덱스 값을 가져오려면 endIndex에 -1을 해줘야 합니다.