반복문 제어 - break

반복문이 무한루프에 빠지지 않게 하기 위해 반복문을 제어하는 명령어가 있는데, breakcontinue이다.

for i in 10...15{
    print("break \(i) 시작-----")
    if(i==13){  //13이면 for문 탈출.
        break   //반복문 탈출 -> 13끝이 출력되지 않고 반복문 종료.
    }
    print("break \(i) 끝-----")
    
}
print("break 종료-----")

"break 13 끝"이 출력되지 않은 채 반복문이 종료되었다. 이와 같이 break는 반복문을 종료하는 데에 사용된다.


반복문 제어 - continue

continue 명령문은 반복문의 실행구문을 수행하지않고 다음 반복문으로 넘어가는데에 사용된다.

for i in 10...15{
    print("break \(i) 시작-----")
    if(i==13){
        continue   //다음 반복순서로 넘김 -> 13끝이 출력되지 않고 14로 넘어간다.
    }
    print("break \(i) 끝-----")
    
}
print("break 종료-----")

break 명령문과 달리, "break 13 끝"의 출력을 건너뛰고 나머지 반복문을 수행하였다.


반복문 - while

조건을 만족하는 동안 실행구문을 반복한다. 

while 조건 {

   실행구문

}

var i = 10			//초기값

while i < 20 {			//i가 20미만이면 반복수행
    print("while 실행 \(i)")
    i += 1			//i 1증가
}

주의 해야 할 점은 while문을 사용할 때 에는 조건을 false로 만들어줄 구문이 없다면 무한루프에 빠지게 된다는 점이다. 

var i = 0
while true {
    print("break start \(i)")
    
    if i == 5 {
        break   //i가 5가 되면 종료
    }
    
    print("break finish \(i)")
    i += 1      //i 증가
}

예시와 같이 종료 시점을 정해주는 것을 잊지 말자


readLine()

사용자의 입력을 받는 함수이다. 옵셔널 형태의 String을 반환한다.

print("입력:",terminator: "")

var text = readLine()
print(text)


while문과 readLine()을 통해 간단한 프로그램을 작성해보자. 사용자의 입력을 받고 그 중 짝수만 선택하여 합계와 평균을 구해본다.

var sum = 0			//합계를 저장할 변수 선언
var cnt = 0			//평균 계산을 위한 변수 선언 
var avg = 0			//평균 값을 저장할 변수 선언 

while true {			//반복문 수행
    print("입력:",terminator: "")
    let input = readLine()!     //사용자의 입력을 input변수에 담는다. 옵셔널 형태로 반환하기에 느낌표를 붙여준다.
    
    if input == "x"{    	//사용자의 입력이 x라면 반복문 종료.
        break
    }
    
    let num = Int(input)!	//사용자의 입력을 정수형태로 num에 대입
    if num % 2 == 0{		//넘어온 사용자의 입력이 짝수인지 확인
        cnt += 1		//평균을 구하기 위해 갯수 파악
        sum += num		//사용자의 입력 합산
        avg = sum/cnt		//평균 계산
    }
    print("number:\(num), total:\(sum), avg:\(avg)")
    
}
print("----------종료되었습니다. 합계:\(sum), 평균:\(avg)----------8")

사용자가 무엇을 입력했는지 보여주기 위해 변수 num은 계속 출력되지만 짝수일 경우에만 sum, avg에 반영되어 출력된다.

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

day08_multiArray, tuple  (0) 2021.06.03
day07_array  (0) 2021.06.02
day05_control flow_loop  (0) 2021.05.25
day04_control flow_conditional  (0) 2021.05.22
day03_operator, casting  (0) 2021.05.18

반복문

동일한 코드를 연속적으로 반복하는 구문이다. 크게 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