반복문

동일한 코드를 연속적으로 반복하는 구문이다. 크게 for문과 while문이 있다.


반복문 - for

for문은 초기값, 조건, 증감 이라는 3가지 요소로 반복한다. 반복적인 데이터나 시퀀스를 다룰 때 많이 사용 한다.

for 임시상수 in 범위 {

   실행구문

}

for i in 10...20{   //for 반복시킬상수 in 범위
    print(i)
}

print("--------------------")

let r1 = 20...30	//범위를 상수에 담아서 사용할 수 있다.
for i in r1{
    print(i)
}

범위연산자를 통해 for - in 문을 사용하면 증감은 +1로 지정된다.

증감과 범위를 따로 지정하고 싶다면 범위연산자 대신 stride()를 사용하면 된다. 

for 임시상수 in stride(from:초기값, through(혹은 to): 조건, by:증감){

   실행구문

}

throughto의 차이점은 through는 조건값 포함, to는 조건값 미포함이다. 

for i in stride(from: 50, to: 20, by: -3){		//50부터 20까지 3씩 감소 20미포함
    print(i)
}

print("--------------------")

for i in stride(from: 50, through: 20, by: -3){		//50부터 20까지 3씩 감소 20포함
    print(i)		    //i = 12 -> i는 내부 상수이다. 값 변경 불가. + 외부에서 호출 불가
}


for - in 문 이용하여 결과 구하기

중요한 점은 for문의 임시상수 i는 for문 밖에서 호출할 수 없다는 점이다. 따라서 for문에서 이루어지는 계산을 밖으로 가져오고 싶다면 for문 밖에서 선언된 변수를 사용하여 대입해야 한다는 점이다.

var tot = 0

for i in 1...100{
    tot += i
    print(i,":",tot)
}
print("1부터 100까지의 합계 : \(tot)")

//1부터 100까지 짝수들의 합 구하기
var sum = 0
for i in 1...100{
    if i%2 == 0{
        sum += i
    }
}
print("1부터 100까지의 짝수 합계: \(sum)")

print("--------------------")

sum = 0
for i in stride(from: 0, through: 100, by: 2){	//0부터 100까지 2씩 증가. 100포함
    sum += i
}
print("1부터 100까지의 짝수 합계: \(sum)")

이렇게 여러가지 방법으로 같은 결과를 출력할 수 있다.


중첩 for문 - 구구단

for문은 중첩해서 사용이 가능하다. 이렇게 중첩된 반복문의 대표적인 예시가 구구단이다.

print("구구단(1)---------------------------")
for i in 2...9{
    print("\(i)단")
    
    for k in 1...9{
        print("\(i) * \(k) = \(i*k)")
    }
    
    print("\n")
}

임시상수 k가 있는 for문의 입장에서는 i가 외부에서 선언된 상수이다. 즉 k가 있는 for문에서는 임시상수 i를 호출할 수 있다는 얘기이다. 이 점을 이용하여 구구단을 작성할 수 있다.

print("구구단(2)---------------------------")
for i in 2...9{
    print("\(i)단", terminator: "\t\t")				//1단 2단 3단 ....
}

print()

for k in 1...9{
    for i in 2...9{
        print("\(i)*\(k)=\(i*k)", terminator: "\t")		//2*1=2  3*1=3  4*1=4...
    }
    print()
}

구구단을 세로로 출력하는 코드이다. 간단하게 i와 k의 위치를 바꾸어 주면 출력이 가능하다. 콘솔은 좌에서 우로 출력한다는 점을 잘 생각하고 코드를 작성하자.


중첩 for문 - 별 그리기

for문의 다음으로 대표적인 예시가 별을 이용하여 도형그리기이다.

print("별그리기(1)---------------------------")
for line in 0...4{			//별을 몇줄을 그을지.
    for star in 0...line{		//별을 몇개를 그릴지.
        print("*",terminator:"")
    }
    print("")
}

line이 증가함에 따라 한줄에 *을 그리는 횟수가 증가하여 삼각형이 그려진다.

print("별그리기(2)---------------------------")
for line in 0...4 {			//별을 몇줄을 그릴지
    for star in line...4{		//별을 몇개를 그릴지
        print("*",terminator:"")
    }
    print("")
}

for line in stride(from: 4, through: 0, by: -1){		//4부터 0까지 1씩 감소. 0포함
    for star in stride(from: line, through: 0, by: -1){		//별을 몇개를 그릴지
        print("*",terminator:"")
    }
    print("")
}

이번에는 하나는 범위연산자, 하나는 stride()를 이용하여 역삼각형을 그렸다.

두 코드 마찬가지로 line이 증가 혹은 감소 함에 따라 *을 그리는 횟수가 점점 감소하는 코드이다.

print("별그리기(3)---------------------------")
for line in 0...4 {			//별을 몇줄을 그릴지
    for star in line...4{		//별을 그리기 전에 공백을 몇개를 그릴지
        print(" ",terminator:"")
    }
    for star in 0...line{		//별을 몇개를 그릴지
        print("*",terminator:"")
    }
    print()
}

for line in 0...4{			//별을 몇줄을 그릴지
    for star in stride(from: 4-line, through: 0, by: -1){
    //별을 그리기 전에 공백을 몇개를 그릴지
        print(" ",terminator: "")
    }
    for star in 0...line{		//별을 몇개를 그릴지
        print("*",terminator:"")
    }
    print("")
}

앞에 나온 코드를 합치면서 *대신 공백을 출력하면 처음에 그린 삼각형의 반전된 모습을 그릴 수 있다. 

'iOS > TJ' 카테고리의 다른 글

day07_array  (0) 2021.06.02
day06_control flow_loop  (0) 2021.05.27
day04_control flow_conditional  (0) 2021.05.22
day03_operator, casting  (0) 2021.05.18
day02_var  (0) 2021.05.18

+ Recent posts