[Swift 문법] 5 . 반복문

JJOOEE__·2024년 6월 17일
0

Swift 문법

목록 보기
11/13
post-thumbnail

🍎 5. 반복문

Swift에서 루프를 작성하는 다양한 방법이 있지만 기본 메커니즘은 동일합니다. 조건이 거짓으로 평가 될 때까지 일부 코드를 반복적으로 실행합니다.

🍏 1. for

  • Swift에서 가장 일반적인 루프 for루프
    배열과 범위를 반복하고 루프가 돌아갈 때마다 하나의 항목을 꺼내 상수에 할당합니다. 예를 들어 아래코드는 숫자 범위입니다.
let count = 1...10

for number in count {
  print("숫자는 \(number) 입니다")
}
  • 배열로도 for 구문 작성 가능
let albums = ["다이너마이트", "디오니소스", "불타오르네"]

for album in albums {
    print("\(album)은 BTS의 노래입니다.")
}
//다이너마이트은 BTS의 노래입니다.
//디오니소스은 BTS의 노래입니다.
//불타오르네은 BTS의 노래입니다.

for 루프가 제공하는 상수를 사용하지 않는 경우 swift가 불필요한 값을 생성하지 않도록 _을 사용해야함

for _in 1...5 {
	print("play")
    }

◻️ 조건문을 넣어서 for문 작성

  • 조건문을 넣어 코드를 작성이 가능
var numbers = [1, 2, 3, 4, 5, 6]
for number in numbers {
	if numbers % 2 = 0 {
	    print(number)
    }
  }    // 2, 4, 6

◻️ 배열 루프

var songs = {"Know Me Too Well", "Medicne", "Start Over Again"}

for song in songs {
	print("가장 좋아하는 노래는 "\(song)입니다")
}
var people = ["players", "haters", "heart-breakers", "fakers"]
var action = ["play", "hate", "break", "fake"]

for i in 0...3 {
	print("\(people[i])gonna\(actions[i]))")
}

for i in 0..<people.count {
	print("\(people[i])gonna\(actions[i]))"
}

◻️ 밑줄(_)을 사용하는 이유는?

let names = ["철수", "영희", "민지", "민수", "주희"]

for name in names {
	print("\(name)는 과자를 가지고 있습니다!") 
}

//철수는 과자를 가지고 있습니다!
//영희는 과자를 가지고 있습니다!
//민지는 과자를 가지고 있습니다!
//민수는 과자를 가지고 있습니다!
//주희는 과자를 가지고 있습니다!
  • 루프가 돌아갈 때마다 swift에서는 이름 배열에서 한 항목을 가져와 name상수에 입력한 다음 루프 본문을 실행 = print()
    • 값 (name)이 실제로 필요하지 않은 경우도 있음
    • 이 경우에는 이곳에 _을 추가해서 사용
      • swift는 실제로 변수가 필요하지 않음을 인식하고 임시상수 생성x

◻️ for -in

  • 컬렉션에 저장된 요소 수 만큼 반복, 저장된 요소가 루프 상수에 하나씩 들어감

ⓛ Array

let nums: [Int] = [1, 2, 3, 4]

for num in nums {
	print(num)			//1 2 3 4
}
  • nums의 요소 갯수만큼 반복문이 반복
    • 1번째 반복 num이란 루프 상수에 nums[0]의 값이 들어감
      ...
      n번째 반복 num이란 루프 상수에 nums[n-1]의 값이 들어감
  • 배열의 모든 요소에 num이란 루프 상수로 접근이 가능함
  • 배열메서드 사용하여 여러가지 배열의 요소도 알 수 있음!

② Dictionary

let dict:[String : String] = ["A" : "Apple", "B", "Banana", "C" : "Cherry"]

for (key, value) in dict {
	print("(\(key) : \(value))")
}

for element in dict {
	print("\(element.key) : \(element.value))")
}
  • Key - Value로 저장되어있고 정렬이 되지 않음
  • print 결과 값은 찍을 때마다 달라질 것
    (배열 아니라 넣은 순서대로 정렬되지 않기 때문)
  • 순회하며 받는 루프 상수가 튜플(key, value) 타입
    • 첫 번째 방법과 같이 튜플 상수를 각각 선언 하거나
      (보통 첫 번째 방법 사용)
    • 두 번째 방법과 같이 한번에 받아서 점문법을 이용해서도 접근 가능

key 또는 value만 반복하고 싶다면

for key in dict.keys {
	print(key)				//  C B A
 }
 
for value in dict.value.sorted() {
	print(value)			//	Apple Banana Cherry
}

③ Set

let nums: set<Int> = [1, 2, 3, 4]

for num in nums {
	print(num)		// 3 2 4 1
}
  • set은 array와 비슷 하지만, 정렬되지 않고 중복요소를 저장하지 않는 것 뿐
  • for - in 문은 그냥 배열하고 동일하게 사용
  • Dictionary와 동일하게, print 결과 값은 찍을 때마다 달라질 것

◻️ forEach 메서드

  • 반복 실행하려는 코드를 파라미터로 받고, 저장된 요소는 클로저 상수로 전달됨
  • forEach : Collection의 요소 갯수만큼 반복해주는 함수
    • 클로저(코드 블록)를 파라미터로 받는 고차 함수
    • 컬렉션의 각 요소를 반복하고, 각 요소에 지정된 클로저를 적용

ⓛ Array

let nums : [Int] = [1, 2, 3, 4]

nums.forEach {
	print($0)
}				// 1 2 3 4
  • print 함수를 찍는 클로저를 nums 요소의 갯수(4)만큼 반복
nums.enumerated().forEach {
	print("(index: \($0) num: \($1))")
}

nums.indices.forEach {
	print("(index: \($0) num: \(num[$0]))")
}
  • for - in과 마찬가지로 enumerated메서드나 indices를 이용 가능

let dict: [String : String] = ["A" : "Apple", "B" : "Banana", "C" : "Cherry"]

dict.forEach {
print("(($0.key) : ($0.value))") // (B : Banana) (C : Cherry) (A : Apple)
}

dict.forEach { (key, value) in
print("((key) : (value))") // (C : Cherry) (A : Apple) (B : Banana)
}

dict.keys.forEach {
print($0) // B C A
}

dict.values.sorted().forEach {
print($0) // Apple Banana Cherry
}
② Dictionary

let dict:[String : String] = ["A" : "Apple", "B", "Banana", "C" : "Cherry"]

dict.forEach {
	print("(\($0.key): \($0.value))")} // (B : Banana) (C : Cherry) (A : Apple)
    
 dict.forEach { (key, value) in
    print("(\(key) : \(value))")        // (C : Cherry) (A : Apple) (B : Banana) 
}
 
dict.keys.forEach {
    print($0)       // B C A
}
 
dict.values.sorted().forEach {
    print($0)       // Apple Banana Cherry
}
   

③ Set

let nums: set<Int> = [1, 2, 3, 4]

nums.forEach {
	print($0)
}

◻️ for - in과 forEach의 차이점

🌈 3-1. continue & break

  • for - in문은 우리가 직접 구현하는 "반복문"
  • forEach 라는 함수의 파라미터로 "클로저"
  • continue, break는 반복문 안에서만 사용이 가능 하기 때문에 for - in 에선 사용 가능하지만, forEach에서는 불가능함
for num in nums {
	break
    continue
}

nums.forEach {
	break		//"ERROR"
    continue	//"ERROR"
}

🌈 3-2. return 문의 영향

  • for - in의 경우 반복문을 돌다가 return을 만나면 함수 자체가 종료
func printForIn() {
    let nums = [1, 2, 3]
    
    for num in nums {
        print(num)
        return
    }
}
  • forEach는 내가 전달한 클로저를 요소 갯수 만큼이나 실행
    • 반복 횟수에 영향을 주지 않는다는 것
func printForEach() {
    let nums = [1, 2, 3]
    
    nums.forEach {
        print($0)
        return
    }
}

🍏 2. While

◻️ 언제 While 문을 사용하고 언제 For문을 사용하나요?

  • For루프는 일반적으로 유한 시퀀스와 함께 사용
  • While루프는 어떠한 상태가 false가 될 때까지 반복

◻️ While문으로 무한 루프 후, 빠져나오기

  • iPhone의 모든 앱은 무한 루프를 사용하고 종료하기로 선택할 때까지 이벤트를 계속
  • 무한 루프를 만들려면 true 조건으로사용 합니다. true는항상 true이므로 While루프가 영원히 반복됩니다.

🍏 3. Reapeat

  • Repeat문을 사용한다면 처음에 텍스트를 출력 후, while문을 실행
let numbers = [1, 2, 3, 4, 5]
var random: [Int]

repeat {
    random = numbers.shuffled()
} while random == numbers
//랜덤값 무자기 출력
//3, 2, 4, 5, 1

🍏 4. break & continue

  • Continue = " 현재 이 루프의 실행이 끝났습니다. 다음 항목으로 이동하겠습니다. "
  • Break = " 현재 이 루프를 다 끝냈으니 완전히 빠져나가겠습니다(종료하겠습니다). "

◻️ break

let scores = [1, 8, 4, 3, 0, 5, 2]
var count = 0

//for문으로 scores배열을 하나씩 쓰고 카운트를 + 1 한다.
for score in scores {
   //만약 score가 0이면 break된다.
    if score == 0 {
        break
    }

    count += 1
}

print("You had \(count) scores before you got 0.")
//You had 3 scores before you got 0
  • 잘못된 예시
for name in ["John", "Paul", "George"] {
	break
	print("Welcome, \(name)!")
}			//배열을 프린트 하기도 전에 break된다.

🌈 중접된 루프에서 Break

  • 한번에 둘 이상의 루프를 동시에 break 할 수 있다.
  • 루프 레이블은 myLoop : 로 시작한다.
  • 한 루프를 다른 루프 안에 포함시킬 수 있습니다.
  • 필요할 때마다 레이블이 지정된 루프에서 벗어날 수 있습니다.
  • break를 단독으로사용하면 현재 루프만 종료됩니다.
  • 루프 내부의 루프를 중첩 루프라고합니다.
outerLoop: for i in 1...10 {
    for j in 1...10 {
        let product = i * j
        print ("\(i) * \(j) is \(product)")

        //만약 product가 50이면 루프에서 빠져나온다.
        if product == 50 {
            print("구구단 그만!")
            break outerLoop
        }
    }
}
/* ... 5 * 6 is 30
5 * 7 is 35
5 * 8 is 40
5 * 9 is 45
5 * 10 is 50
구구단 그만! */

◻️ continue

  • 조건인 항목을 건너뛰고 다음 항목으로 계속하려면 continue키워드를 사용
for i in 1...10 {
    if i % 2 == 1 { //이 조건은 홀수인 1,3,5,7,9 이지만
        continue //continue를 사용하여 위에 조건을 건너뜀
    }
    print(i)
}
//2,4,6,8,10
profile
개발이 어려운 나를 위한... 개발노트

0개의 댓글