Swift(기초 문법)- 반복문

JSLee·2022년 1월 13일
0

프로그래밍 안에는 Reference Type , Value Type 이 나뉘게 됩니다.
Reference는 참조이고 각 객체를 참조(주소값)으로 가르킵니다.
Value는 값을 가지고 있는 객체이고요.
좀더 자세히 스텍,힙,메모리 에 접근하여 설명하기엔 길어지고 복잡해지니 이정도로만!알고있긔

그럼 반복문 시작하기 전 collection에 대해 설명 짧게 하자면!
프로그래밍 안에 데이터를 모아둔것이라고 생각하면 되는데요
그 collection 안에는 여러 종류가 있습니다. 각 종류는 데이터를 보관하는 방식들이 조금씩 다릅니다.

⭐️ Collection

Array

  • 배열이라고 하고 타입이 같은 데이터들을 index를 지정하여 보관합니다.

Dictionary

  • key 와 Value를 가지고 있습니다.

Set

  • set은 배열과 같이 대괄호로 생성합니다. 그래서 Swift의 타입추론으로 데이터를 생성할수 없습니다.
    또한 제너릭으로 타입 지정할수 Any를 할수 없지만 NSSet클래스를 이용하여 여러 타입을 지정할수 있습니다.

Tuple

  • tuple 은 타입추론이 가능합니다.배열과 달리 대괄호 가 아닌 소괄호로 데이터를 묶습니다.
    튜플은 배열과 같이 index를 지정하지만 index로 접근하게되면 데이터를 호출하는데 불편이 있습니다.그래서 딕셔너리와 비슷한 key value 형식으로 이름을 붙혀줄수 있습니다.

콜렉션은 가볍게 이정도만 설명하고 나중에 다시 한번 제대로 설명 하겠습니다.

그럼 반복문에 대해서 살펴보겠습니다. 제일 접근하기 쉬운 배열Array로 설명하겠습니다.

for 문

var intArray = [1,2,3,4,5,6,7,8,9,10]

변수 정수타입 배열이 있습니다.

그럼 반복문 종류인 for문을 이용하여 데이터에 접근해보면

var intArray = [1,2,3,4,5,6,7,8,9,10]
for value in intArray {
    print(value)
}

이렇게 접근할수 있습니다 .
for문을 간단하게 풀어보자면

for 배열에서 가져올값 in 배열 {

이라고 볼수 있습니다.
출력문을 보게 되면

이렇게 값들을 하나하나 가져올수 있습니다.
그렇게 되면 총 for문은 배열의 count 즉 배열의 길이인 10번을 회전하며 1 부터 10 까지의 값을 가져온것입니다.
프로그래밍적으로 보게된다면 배열은 index를 지정하기 때문에
index 0 부터 index 9 까지 가져온것이 되겠지요

또한 for문에는 'where'을 통해서 조건을 제시 할수 있습니다.

var intArray = [1,2,3,4,5,6,7,8,9,10]
for value in intArray where value > 2 {
    print("배열에서 2보다 큰값만 가져오기 \(value)")
}

이렇게 where 과 연산자를 통한 조건을 이용해 원하는 값을 산출할수 있습니다.
방법에는 여러가지들이 있는데요

홀수 , 짝수 구하기

홀수

var intArray = [1,2,3,4,5,6,7,8,9,10]
for value in intArray where value % 2 != 0 {
    print("홀수 가져오기\(value)")
}

짝수

var intArray = [1,2,3,4,5,6,7,8,9,10]
for value in intArray where value % 2 == 0 {
    print("짝수 가져오기\(value)")
}

이밖에도 다양한 방법으로 원하는 값들을 가져올수 있겠지요?

stride

for value in stride(from: 0, to: 4, by: 1) {
    print(value)
}

stride 는 사용자 지정이라고 생각할수 있습니다.
from = 시작 value
to = 끝 value
by = 더해지는 값
이라고 보면 됩니다.

0 부터 4 까지 1씩 더해서 for문을 돌려라

가 될수 있을거 같습니다. ㅎㅎ..... 출력문을 보게 되면

위와 같은 코드를 stride 를 사용하지 않고도 구현 가능합니다.

Range

for value in 0...3 {
    print("\(value)")
}

이런식으로 말이죠 조금더 코드가 짧아진게 보이시죠??
... 으로 range(길이)를 부여하여 for문에 몇번 반복하는지에대해 정의 하는것이지요
range 또한 조건은 가능합니다.

for index in 0..<5 where index % 2 == 0 {
    print("0 부터 5 까지 짝수만 구해라.\(index)")
}

또한 굳이 데이터를 받을 변수를 지정하지 않아도 됩니다. 언더바를 통해서요.

for _ in 0..<5{
    print("for 루프 다섯번 돌리기 ")
}

이렇게 되면 같은 print가 5번 진행되겠지요?

enumerated

var intArray = [1,2,3,4,5,6,7,8,9,10]
for (i,value) in intArray.enumerated(){
    print("index = \(i) value = \(value)")
}

enumerated 는 쉽게 index에 접근할수 있는 것입니다.
이렇게 소괄호 안에 왼쪽은 index 오른쪽은 값 을 받아줄 변수가 있습니다.
출력을 해보면

index 접근이 필요할때 아주 유용한 함수입니다.

중첩 for문

개발을 하다 보면 for문안에 다른 for문이 들어가야할 경우가 종종 존재합니다.
그럴때 사용되는것이 중첩 for문 인데요
말그대로 for문이 중첩되는 것입니다.

for i in 2...9 {
    for j in 1...9{
        print("\(i) X \(j) = \(i * j)");
    }
}

가장 밖에 있는 for문(A)은 구하려는 단수를 계산합니다. (2 ~ 9단)
그렇게 되면 A가 첫 루프가 돌때 안에있는 for문(B) 의 for문이 시작되게 되죠.
그럼 B의 for문은 단수 에 맞는 구구단 값들을 계산합니다.

출력을 보게 되면

잘나오게 됩니다.

여기서 이 구구단을 조금더 고차함수적 접근을 할수 있습니다.
예를 들어 사용할수 있는것은 forEach입니다.
2단을 산출한다고 가정하였을 경우

let second = 2
(1...9).forEach {
    print("\(second) * \($0) = \(second * $0)")
}

또한 for문은 아니지만 map 을 이용하여 구구단을 계산할수도 있습니다.

let second = 2
print((1...9).map { "\(second) * \($0) = \(second * $0 )"}.joined(separator: "\n") )

출력문은 위와 같습니다.
map은 나중에 자세히 설명하겠습니다.

While 문

while 문은 while , repeat while 2가지로 나뉩니다.
두가지를 먼저 살펴보자면
while = while은 반복시작 전 조건이 성립되지 않으면 실행이 되지 않습니다.
repeat while = repeat while은 조건과 관계없이 반복이 시작되지만 1번의 루프가 끝나고 조건에 맞지 않으면 반복은 종료됩니다.

그럼 구현을 통해서 배워보겠습니다

while

var start = 1
let end = 10
while start < end {
    start += 1
    print(start)
}

start가 while을 통해서 루프가 진행될때 마다 1씩 증가합니다.
그러다 end보다 값이 커지게 되면 반복은 종료 됩니다.

var start = 1
let end = 10
repeat {
    start += 1
    print(start)
}while start < end

repeat의 경우도 출력문은 while 과 동일합니다.
하지만 앞에서 설명했듯이 repeat의 첫루프는 조건에 관계가 없습니다.
코드를 조금 바꿔보면

var start = 1
let end = 10
while start > end {
    start += 1
    print(start)
}

이럴경우 while은 실행되지 않습니다. 이유는 start는 end보다 값이 작기 때문이죠
그래서 조건이 성립되지 않아 실행 자체가 진행되지 않습니다.

var start = 1
let end = 10
repeat {
    start += 1
    print(start)
}while start > end

하지만 repeat 의 경우는 2 라는 값이 출력됩니다.
이유는 repeat은 첫 루프의 조건과 관계없이 무조건 루프가 한번은 돌기 때문에
코드블럭 안에있는 start += 1 의 연산만 되고
1 + 1 인 2의 값만 출력 된후 조건이 성립되지 않아 루프가 종료되는 것이기 때문이죠

profile
iOS/Android/FE/BE

0개의 댓글