About Swift – “프로그래밍 언어에서의 제어문, boolean연산자, 삼항 연산자”
About Swift – “프로그래밍 언어에서의 제어문, boolean연산자, 삼항 연산자”
제어문이란?
필자는 고등학교를 갓 졸업하고 물류센터 아르바이트를 한 적이 있습니다. 스무 살 짜리가 구할 수 있었던 가장 빠른 아르바이트였습니다. 업무 자체는 단순하고 쉬웠으니까요. 제가 했던 업무는 물건들을 식별하고 나누어 적재하는 것이었습니다. 그것을 몇 시간이고 반복해야 했고, 대가는 최저시급보다 약간 높았던 것으로 기억합니다.
물류센터 아르바이트를 하는 로봇을 프로그래밍한다고 생각해 봅시다. 분명히, 일의 8할 이상은 반복입니다. 물건을 레일에서 옮겨서 -> 어딘가에 적재하는 것입니다. 그런데, 단순히 ‘물건을 옮겨서 적재한다’ 를 반복하라고 한다면 일에 큰 지장이 생길 것입니다. 어떤 물건을, 어떤 곳에, 어떻게 적재해야 할지를 정해주지 않았기 때문입니다. 우리는 로봇이 어떤 물건을, 어떤 곳에, 어떻게 적재해야 할지를 알려주어야 합니다. 이처럼 프로그램이 어떻게 흘러가는지를 제어하기 위해 사용하는 문장을 제어문이라고 합니다. 로봇에게 송장번호에 “9”가 들어있다면 “1”에 적재하고, 송장번호에 “0”이 들어있다면 “2”에 적재하는 것을 알려주는 것입니다.
Swift언어의 제어문 – for-in 반복문
for문에 대하여 알아보기 전에, Swift에서의 범위 연산자에 대하여 정리를 하겠습니다.
-
x...y
는 닫힌 범위 연산자 입니다. x에서 시작하여 y로 끝나는 범위에 포함된 숫자를 말합니다. (x 이상, y 이하) -
x..<y
는 반 열린 범위 연산자 입니다. x에서 시작하여, y가 포함되지 않는 모든 숫자를 말하는 것입니다. (x 이상, y 미만)
본론으로, for-in 반복문은 컬렉션 또는 숫자 범위 내에 있는 목록을 반복합니다. 사용법은 다음과 같습니다.
for 상수명 in 컬렉션 또는 범위 {
실행될 코드
}
예컨대,
for x in 1...5 {
print(x)
}
- x에 1, 2, 3, 4, 5 를 대입합니다.
- x를 출력하는 것을 반복합니다. 라는 흐름이 됩니다.
for x in 1...5 {
print("Hi")
}
- x에 1을 대입합니다.
- "Hi"를 출력합니다.
- x에 2를 대입합니다.
- "Hi"를 출력합니다.
라는 흐름이 되겠습니다. 그런데, 위의 예제를 실행해 보면 컴파일러에서 불평을 늘어놓습니다.
warning: immutable value ‘x’ was never used; consider replacing with ‘_’ or removing it
x가 한 번도 쓰이지 않았다는 것입니다. x를 지워 버리거나, _로 대체하는 것을 추천한다고 하네요. Swift에서는 _로 참조체(위의 예제에서, x)를 생략할 수 있습니다.
for _ in 1...5 {
print("Hi")
}
컴파일러가 얌전해진 것을 볼 수 있을 것입니다.
for문은 배열의 항목에도 접근할 수 있습니다.
배열은 간단하게 순번을 가지는, 같은 데이터 타입을 저장할 수 있는 자료형입니다. 아래의 경우, String 타입을 한 데 모아놓은 animals라는 배열이 되겠네요. 배열은 순번을 가진다고 했는데, 컴퓨터는 0부터 시작하기 때문에 Tiger가 0, Monkey가 1, … Horse가 4의 순번이 됩니다.
let animals = ["Tiger" , "Monkey", "Lion", "AngelFish", "Horse"]
for animal in animals {
print(animal)
}
- animal에 "Tiger"를 대입합니다.
- 대입된 animal인 Tiger를 출력합니다….
라는 흐름입니다.
let animals = ["Tiger" , "Monkey", "Lion", "AngelFish", "Horse"]
for animal in animals[..<2] {
print(animal)
}
의 예제와 같이, 범위 제한 연산자를 사용할 수도 있습니다…<2 이므로, 처음부터 2 미만까지의 범위를 나타냅니다.그러면, 0, 1에 해당하는 Tiger, Monkey이 출력되겠죠.범위 제한 연산자에서, 시작이나 끝 부분의 숫자가 생략되어 있으면 맨 처음 혹은 맨 끝을 나타냅니다. 예를 들어 2…는 ‘2부터 끝까지’의 범위를 나타냅니다.
let animals = ["Tiger" , "Monkey", "Lion", "AngelFish", "Horse"]
for animal in animals[2...] {
print(animal)
}
순번 2에 해당하는 Lion부터 마지막의 Horse까지가 출력될 것입니다.
let animals = ["Tiger" , "Monkey", "Lion", "AngelFish", "Horse"]
for animal in animals[...3] {
print(animal)
}
처음에 해당하는 Tiger부터, 순번 3에 해당하는 AngelFish가 출력되겠죠.
for문은 Dictionary의 항목에도 접근할 수 있습니다.Dictionary는 고유 key와 대응하는 value를 연결하여 데이터를 저장하는 자료형입니다. key:value 형식의 배열이라고 생각하면 되겠습니다.
let Sets = ["Back":50, "Legs":20, "Chest":30]
for (partName, numOfSets) in Sets {
print("일주일에 \(partName)를 \(numOfSets) 세트 수행합니다.")
}
Swift언어의 제어문 – while 반복문
- for 반복문은 몇 번 정도 반복해야 할지를 이미 아는 경우에 적합합니다.
- 어떠한 조건이 되기 전까지 몇 번이나 반복해야 할 지를 알기 어렵지만, 그 조건을 만족할 때까지는 반복해야 하는 경우 while 반복문을 사용합니다. 사용법은 다음과 같습니다.
while 조건식 {
반복해야 할 코드
}
예를 들면,
var cars = 0
while cars < 5000 {
cars = cars + 1
}
print(cars)
- cars라는 변수를 선언했습니다.
- cars라는 변수의 크기가 5000 미만이 될 때까지, cars에 cars+1의 값을 대입합니다.
- cars<5000이 아니게 되는 순간, cars 변수의 값을 출력합니다.
- cars의 값이 1부터 시작해서 … 4999가 되고, 5000이 되는 순간 조건식인 cars<5000 이 거짓이 되기 때문에 반복문은 종료됩니다.
Swift언어의 제어문 -repeat while 반복문
repeat {
// 반복할 문장
} while 조건식
예를 들면,
var i = 10
repeat {
i = i-1
print(i)
} while (i > 0)
의 경우가 될 수 있겠습니다.while의 조건문에서, i가 0보다 크다면, i 에 i – 1의 값을 대입하고, i를 출력합니다.
var i = 10
while i>0 {
i = i - 1
print(i)
}
while문만을 사용한 위의 예제에서도 같은 값이 출력될 겁니다. i가 0보다 큰 동안, i = i – 1 을 수행하고, i를 출력하는 것이기 때문입니다.
그런데, 다음의 경우는 어떨까요?
var i = 10
repeat {
i = i-1
print(i)
} while (i < 0)
위의 예제의 경우에는 무언가 이상합니다. while의 조건문을 보면, i가 0보다 작은 동안 반복해야 하는데, 애초에 첫 번째 문장에 i에 10을 대입해 놓았기 때문입니다. while문의 조건 자체가 맞지를 않습니다.
그런데, 컴파일러에서 이를 실행해 본다면 정상적으로 동작합니다. 왜냐하면, repeat-while 문은 ‘반복할 문장’을 적어도 한 번은 수행하는 특징이 있기 때문입니다. i에 10을 대입하였고, 적어도 한 번 수행하므로 i = i - 1
와 print(i)
를 적어도 한 번 수행한 후 while의 조건(i<0)에 맞지 않으므로 반복문이 종료되는 것이지요.
Swift언어의 제어문 – break문
- 반복문이 완료되는 조건 전에, 반복문을 빠져나오는 어떤 조건을 만들 수도 있습니다.
- 반복문에서 빠져나오기 위하여, break문을 사용합니다.
- 현재의 반복문에서 빠져나와서 반복문 바로 다음에 있는 코드를 실행합니다.
for i in 1..<10 {
if i>5 {
break // 과제 : 오류 수정입니다.
}
print(i)
}
위의 코드에서, i에 1부터 9까지가 대입되고, 그러는 동안 i의 값을 출력하도록 되어 있습니다. 그러나 만약 i가 5보다 큰 경우, break문을 사용하여 빠져나오도록 한 것입니다. 아래에 서술할 내용이지만, Swift에서는 if문 다음의 실행 코드가 한 줄이라도 중괄호를 필수적으로 사용해야 하기 때문에 {break} 를 사용했습니다.
Swift언어의 제어문 – continue문
continue문은 반복문에서, continue문 이후의 모든 코드를 건너뛰고 반복문의 상단 시작 위치로 돌아갑니다.
for i in 1...10 {
if i % 2 == 0 {
continue
}
print(i)
}
for을 보면 i에 1부터 10까지를 대입해야 합니다. 그리고, 만약 i 나누기 2의 나머지 값이 0이면, print(i) 를 수행하지 않고 반복문의 상단 시작 위치로 돌아갑니다.
- i에 1을 대입합니다.
- i 나누기 2의 나머지 값을 체크합니다. 1 나누기 2의 나머지는 1입니다.
- print(i)를 수행합니다.
- i에 2를 대입합니다.
- i 나누기 2의 나머지 값을 체크합니다. 2 나누기 2의 나머지는 0입니다.
- print(i)를 수행하지 않고, 반복문의 맨 처음으로 돌아갑니다.
- i에 3을 대입합니다.
의 흐름이 될 것입니다. i 나누기 2의 나머지가 0인 경우에는 i를 출력하지 않으므로 (2로 나누어떨어지는 숫자는 출력하지 않으므로), 홀수만 출력될 것입니다.
Swift언어의 제어문 – if문
if 불리언 표현식 {
참일 경우 실행될 코드
}
- 기본적으로 불리언 표현식이 참으로 판단되면 괄호로 감싸인 코드를 실행합니다.
- 불리언 표현식이 거짓이면, 괄호로 감싸인 코드는 건너뜁니다.
var mypsw = "tmdnlvmxm"
if mypsw == "tmdnlvmxm" {
print("로그인되었습니다.")
}
mypsw의 값이 “tmdnlvmxm”이면, “로그인되었습니다.”를 출력하는 예제입니다. mypsw의 값이 “tmdnlvmxm”가 아닌 다른 값이라면 “로그인되었습니다.” 는 출력되지 않겠죠.
Swift언어의 boolean 연산자와 삼항 연산자
if문에 관한 다른 예제들을 살펴보기 전, boolean 연산자와 삼항 연산자에 대하여 짚고 넘어가겠습니다.
- 불리언 연산자에는 NOT(!), AND(&&), OR(||), XOR(^) 이 존재합니다.
- NOT연산자는 불리언 값 또는 표현식의 결과를 현재와 반대로 바꾸는 역할을 합니다.
- AND연산자는 두 개의 불리언 값이 모두 참일 경우, true가 되는 연산자입니다.
if 1>0 && 2>1 {
print("Hi")
}
의 경우, 1은 0보다 크고(참) 2는 1보다 크므로(참) "Hi"가 출력됩니다.
- OR연산자는 두 개의 불리언 값 중 적어도 하나가 참이면 참이 되는 연산자입니다.
if 1>0 || 2<1 {
print("Hi")
}
의 경우, 1은 0보다 크고(참) 2는 1보다 작다(거짓) 인데도 "Hi"가 출력됩니다. 둘 중 하나만 참이어도 참으로 결정되기 때문입니다.
- XOR연산자의 경우, 두 값을 이진수로 바꾼 후, 각 자릿수를 비교하여 같으면 0, 다르면 1을 계산하는 비트 연산자입니다. 예를 들면, 5를 이진수로 바꾸면 101이고 4를 이진수로 바꾸면 100 입니다.
let a = 0b101 // 5 (101)
let b = 0b100 // 4 (100)
let result = a ^ b // 1 (001)
print(result)
각각을 이진수로 바꾼 후에, 자리마다 같으면 0, 다르면 1을 반환했습니다. 결과는 1이 나올 것입니다.
삼항 연산자란, 비교 연산을 빠르게 하기 위해 지원하는 연산자입니다.
[조건] ? [참 표현식] : [거짓 표현식]
에서, [조건]
부분을 계산하여 참 혹은 거짓을 확인하여 참이면 참 표현식
을, 거짓이면 거짓 표현식
부분을 수행합니다.
Swift언어의 제어문 – if-else문
let a = 5
if a == 2 {
print("a는 2입니다.")
} else {
print("a는 2가 아닙니다.")
}
위의 예제는 if문의 표현식이 거짓으로 평가될 경우에도 수행될 코드를 지정해 줍니다.
다중 if – else 구문을 사용할 수도 있습니다.
var gender = "man"
if (gender == "Male" || gender == "man"){ //gender가 Male이거나 man이면..
print("당신은 남성이군요!\n")
}else if (gender == "Female" || gender == "woman"){ //gender가 Female이거나 woman이면..
print("당신은 여성이군요!\n")
}else {
print("당신은 .. 무엇입니까??\n")
}
처럼, 여러 가지 조건을 바탕으로 결정해야 할 때는 if-else 구문울 활용하였습니다.
Swift언어의 제어문 – switch-case문
- switch문은 특정한 값을 받아, 프로그래머가 지정한 case 조건에 충족한 코드가 실행되는 제어문입니다.
- 각 상태는 case라는 키워드를 사용하여 나타낼 수 있습니다.
- case 상태 끝에, ‘:’ 을 붙여 case를 종료합니다.
- 하나의 case문이 실행되면, switch문이 종료됩니다.
- switch문은 모든 경우를 처리해야 합니다. default 키워드를 사용합니다.
- default 키워드 없이도 모든 경우가 커버되었다면 그것은 없어도 됩니다.
let weight = 67.0
let height = 167.0
let bmi = weight / (height * height * 0.0001)
var body = ""
switch bmi { // bmi가 다음의 경우일 때..
case ..<18.5 :
body = "저체중"
case 18.5..<25 :
body = "정상"
case 25..<30 :
body = "1단계 비만"
case 30..<40 :
body = "2단계 비만"
case 40... :
body = "3단계 비만"
default:
print("다시 입력해주세요")
}
print("BMI : \(bmi)\n판정 : \(body)")
//BMI : 24.023808670084982
//판정 : 정상
switch문의 모든 결과를 처리하기 위해서 , default 문을 사용했습니다.
let a : Int = 0
switch a {
case ..<0 :
print("a는 음의 정수입니다.")
case 0 :
print("a는 0입니다.")
case 1... :
print("a는 양의 정수입니다.")
case _ :
print("무슨 경우지..")
}
//a는 0입니다.
위의 예제처럼, ‘_’로 default라는 키워드를 대신할 수 있습니다.제가 이해한 Swift에서의 제어문 정리입니다.