iOS프로그래밍기초(Smile Han)/문법 정리

[Swift] 문법 정리 - 연산자, 제어문

wse46 2024. 9. 21. 18:50
https://youtu.be/R8OWOgCNt4M?si=bldau6gYEZ3seGj2

위 영상을 보고 정리한 글입니다. (11:41 ~ 16:22)
 
 
# 연산자
연산자의 종류는 매우 다양한데, 그 중 교수님께서 중요하다고 짚어주신 부분을 위주로 살펴보자.
 
1. 산술 연산자
 
2. 복합 할당 연산자
 
3. 증가 연산자와 감소 연산자

  • 단항 연산자
  • x의 값을 1 증감
    x = x + 1 // x 변수의 값을 1 증가시킴
    x = x - 1 // x 변수의 값을 1 감소시킴
    x++ // x += 1
    x-- // x -= 1
    x++, x--는 Swift 3에서 없어진 문법임.

4. 비교 연산자
 
5. 불리언 논리 연산
 
6. 범위 연산자

  • 닫힌 범위 연산자 (closed range operator)
    x...y // x에서 시작하여 y로 끝나는 범위에 포함된 숫자
    5...8 // 5, 6, 7, 8
  • 반 열린 범위 연산 (half-open range operator)
    x..<y // x에서 시작하여 y가 포함되지 않는 모든 숫자
    5..<8 // 5, 6, 7
  • One-Sided Ranges
    let names = ["A", "B", "C", "D"]
    for name in names[2...] { //[...2], [..<2]
    	print(name)
    } // C
    // D

7. 삼항 연산자 ?:
 
8. Nil-Coalescing Operator (Nil 합병 연산자)

  • 옵셔널 변수 ?? nil일 때 할당되는 값
  • 옵셔널 변수의 값이 nil이 아니면 옵셔널이 풀린 값으로 할당됨
  • 옵셔널 변수의 값이 nil이면 ?? 다음 값으로 할당됨
let defaultColor = "black"
var userDefinedColor : String? // 초기값이 nil

var myColor = userDefinedColor ?? defaultColor
// userDefinedColor가 nil이 아니면 옵셔널이 풀려서 myColor에 할당
// nil이므로 defaultColor인 black으로 할당됨

print(myColor) // black
userDefinedColor = "red"
myColor = userDefinedColor ?? defaultColor
// nil이 아니므로 userDefinedColor의 옵셔널이 풀린 원래 값인 red가 할당됨

print(myColor) // red
// 주의 : optional(red)가 아님

 
9. 비트 NOT 연산자
10. 비트 AND 연산자
11. 비트 OR 연산자
12. 비트 XOR 연산자
13. 비트 왼쪽 시프트 연산자
14. 비트 오른쪽 시프트 연산자
15. 복합 비트 연산자
 


 
# 제어문
 
for 문
1. 조건-증가(condition-increment) for문

  • Swift 3에서 없어진 문법
  • for 초기화; 조건식; 증감식 {
    // 실행될 구문
    }
for var i = 0; i < 10; i += 1 { // for i in 0..<10 로 수정해야 함
print("Value of i ia \(i)")
}

 
2. for-in 반복문

  • 컬렉션 또는 숫자 범위 내에 있는 목록들을 반복
  • for 상수명 in 컬렉션 또는 범위 {
    // 실행될 코드
    }
  • '상수명'은 반복문이 돌면서 컬렉션 또는 범위에서 가져온 항목을 담게 될 상수
    일반적으로 반복문의 몸체에 있는 코드는 반복문을 통해 가져온 현재 항목의 참조체로 상수명 사용
  • '컬렉션 또는 범위'는 반복문이 반복되면서 현재의 항목을 참조
    문자열 값들의 배열이거나 범위 연산, 또는 문자들로 구성된 문자열일 수 있음
for index in 1...5 {
	print("Value of index is \(index)")
}
  • index하는 이름의 상수에 현재 항목이 할당되면서 시작
  • for 반복문이 숫자 1부터 시작하여 5로 끝난다는 것을 가리키는 닫힌 범위 연산자를 선언하고 있음
  • _로 참조체(i) 생략 가능
for _ in 1...5 {
	print("안녕")
}

for i in 1...5 {
	print("\(i) 안녕")
}

 

  • 배열의 항목 접근
let names = ["Anna", "Alex", "Brian", "Jack"]
for name in names {
	print(name)
}
// Anna
// Alex
// Brian
// Jack

 

  • dictionary의 항목 접근
let numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]
// dictionary는 key:value 형식의 배열
for (animalName, legCount) in numberOfLegs {
	print("\(animalName)s have\(legCount) legs")
}
// spiders have 8 legs
// ants have 5 legs
// cats have 4 legs

 
 
 
while 반복문

  • for 반복문 : 몇 번 정도 반복해야 할지를 이미 아는 경우
  • while 반복문 : 어떠한 조건이 되기 전에 몇 번 정도 반복해야 할지를 알 수는 없지만 그 조건을 반복해야 하는 경우
  • 기본적으로 while 반복문은 지정된 조건을 만족할 때까지 작업을 반복
  • while 조건식 {
    // Swift 코드가 위치
    }
  • '조건식'은 참(true) 또는 거짓(false)을 반환하게 되는 표현식
  • 주석 부분은 조건식이 참인 동안에 실행될 코드
  • myCount 변수가 100보다 크지 않을 때까지 반복, 100이 되는 시점에서 반복문 종료
var myCount = 0
while myCount < 100 {
	myCount+=1 // myCount가 100이 될 때까지 myCount의 값에 1을 더함
}
print(myCount) // 루프가 종료된 후 myCount의 최종 값(100)을 출력

 
 
repeat ... while 반복문

  • swift 1.x의 do ... while 반복문을 대신하는 반복문
  • repeat ... while 반복문의 몸체는 적어도 한 번은 실행
  • repeat {
    //
    while 조건식
var i = 10
repeat {
    i = i - 1
    print(i)
} while (i > 0)
// 2
// 1
// 0

 
 
반복문에서 빠져나오기 : break 문

  • 반복문을 생성했다면 반복문이 완료되는 조건에 다다르기 전에 반복문을 빠져나오는 어떤 조건을 만들 수도 있음
    특히 무한 루프를 생성할 경우
  • 현재의 반복문에서 빠져나와서 반복문 바로 다음에 있는 코드를 실행
  • j의 값이 100을 넘을 때까지 계속 수행할 것이며, 100을 넘으면 반복문이 종료되고 반복문 밑에 있는 코드를 실행
var j = 10
for i in 1..<100 { // i는 1부터 99까지의 범위를 설정. 이 범위 내에서 루프 반복
    j += j // 매 반복마다 j의 값을 두 배로 증가시킴
    if j > 100 { // j의 값이 100을 초과하는 경우 
        break // break 문이 실행되어 루프 종료
    }
    print("j = \(j)") // 루프 종료 전에 j의 현재 값 출력
}
// j = 20
// j = 40
// j = 80

 

  • 사실상 위의 코드에서 i의 값이 필요하지 않으므로, i를 생략하고 _를 사용할 수 있음.
    이는 i가 사용되지 않음을 명시적으로 나타낼 수 있음
    for _ in 1..<100 {
  • 위의 코드에서 break 문을 변형하여 실행하면 어떻게 될까?
    var j = 10
    for i in 1..<100 {
    	j += j
        if j > 100 break
        print("j = \(j)")
    }
  • 위 코드를 실행하면 에러가 발생한다.
    main.swift:4:16: error: expected '{' after 'if' condition
  • 에러의 원인은 break 문을 { } 로 감싸지 않았기 때문이다.
  • break 문은 조건이 참일 때 루프를 종료하라는 지시이므로, 반드시 { }로 감싸야 한다.

 
continue 문

  • continue 문은 반복문에서 continue 문 이후의 모든 코드를 건너뛰고 반복문 상단 시작 위치로 돌아감
var i = 1
while i < 20 {
	i += 1
    if (i % 2) != 0 {
    	continue
    }
    print("i = \(i)")
}
  • 변수 i의 값이 짝수일 때만 print 함수 호출
  • continue 문은 i의 값을 2로 나눈 나머지가 있으면 print 함수가 호출하는 코드를 건너뜀 (출력 X)
  • continue 문이 실행되면 while 반복문의 상단으로 이동하고 반복문 다시 실행

 

if 문 사용하기
 

  • if 불리언 표현식 {
    // 불리언 표현식이 참일 경우 수행될 스위프트 코드
    }
  • Swift에서는 if 문 다음의 실행 코드가 한 줄이라도 괄호({})를 필수적으로 사용해야 함
  • 기본적으로 '불리언 표현식'이 참(true)으로 판단되면 괄호로 감싸인 코드 실행
  • '불리언 표현식'이 거짓(false)이면 괄호로 감싸인 코드는 건너뜀
var x = 10
if x > 9 {
	print("x is greater than 9!")
}
// 주의 error: expected '{' after 'if' condition

 
 
guard 문 (조건식이 거짓이면 실행)

  • guard 문은 Swift 2 에 도입된 구문
  • 표현식이 거짓(false)로 판단될 경우에 수행될 else 절을 반드시 포함해야 함
    elsel 절에 속한 코드는 현재의 코드 흐름을 빠져 나갈 수 있는 구문 (return, break, continue, throw 구문)을 반드시 포함해야 함
    또는 다른 함수를 else 코드 블록 안에서 호출할 수도 있음
  • guard <불리언 표현식> else {
    // 표현식이 거짓일 경우에 실행될 코드
    <코드 블록을 빠져 나갈 구문>
    }
    // 표현식이 참일 경우에 실행되는 코드
  • 기본적으로 특정 조건에 맞지 않을 경우에 현재의 함수나 반복문에서 빠져 나갈 수 있도록 하는 '조기 출구(early exit)' 전략 제공
  • if 문 vs guard 문
// if 문
var index: Int?
index = 3
var treeArray = ["Oak", "Pine", "Yew", "Birch"]
if let myvalue = index { // 옵셔널 변수 값을 상수 myvalue에 대입
	print(treeArray[myvalue])
} else {
	print("index does not contain a value") // 여기에서 index 못 씀
}
// guard 문
func multiplybyten(value: Int?) {
	guard let number = value, number < 10 else { // 조건식이 참일 때 실행
    	print("수가 10보다 크다")
        return
    }
    print(number*10) // 조건식이 참일 떄 실행, 주의 : number 여기서도 사용 가능
}
multiplyByTen(value: 3) // 30
  • guard 문은 값을 언래핑(unwrap)하기 위해서 옵셔널 바인딩을 이요하며, 그 값이 10보다 작은지 검사
    - 변수를 언래핑 할 수 없거나 그 값이 10보다 크면, else 절이 실행되어 에러 메시지가 출력되며, 이 함수에서 빠져 나가도록 return 문이 실행
    - 10 보다 작은 값이면, guard 문 아래에 있는 코드가 실행되어 그 값에 10이 곱해진 값이 출력됨
  • 언래핑된 number 변수를 guard 문 밖에 있는 코드가 사용할 수 있음
  • if 문을 이용해 언래핑된 변수는 if 문 밖에 있는 코드가 사용 불가

 
switch 문

switch 표현식
{
    case match1:
	구문
    case match2:
    	구문
    case match3, match4:
    	구문
    default:
    	구문
}

 
'표현식'은 값 또는 값을 반환하는 표현식을 나타낸다.
각각의 가능한 경우마다 case 문 필요하며 해당하는 일치 값(match)을 다음에 쓴다.
각각의 case 문은 표현식을 처리한 결과와 동일한 데이터 타입이어야 한다.
case 문 다음에는 해당 case 문과 일치했을 때 실행되는 Swift 구문을 쓴다.
마지막 default 문은 표현식과 일치하는 case 문이 없을 경우를 위한 것이다.
 

var value = 4
switch (value)
{
case 0:
	print("zero")
case 1:
	print("one")
case 2:
	print("two")
case 3:
	print("three")
case 4:
	print("four")
case 5:
	print("five")
default
	print("integer out of range")
}

 
 
case 문 결합하기
 
위의 예제에서 각각의 case 문은 각자의 실행할 구문을 가진다.
때때로 여러 가지 서로 다른 경우에 대해서 동일한 코드를 실행해야 할 경우가 있다.
이런 경우, 실행될 공통 코드로 그룹 case 문을 만들 수 있다.
 
위의 예제를 수정하여 값이 0, 1, 또는 2일 경우에 동일한 코드가 실행되도록 할 수 있다.

var value = 1
switch (value)
{
case 0, 1, 2:
	print("zero, one or two")
case 3:
	print("three")
case 4:
	print("four")
case 5:
	print("five")
default:
	print("Integer out of range")
}

 
switch 문에서의 매칭 범위
 
switch 문에 있는 case 문은 매칭 범위를 구현하도록 할 수도 있음
예를 들어, 다음의 switch 문은 세 개의 숫자 범위로 온도 값을 검사하고 있음

var temperature = 83
switch (temperature)
{
case 0...49: // 0~49
	print("Cold")
case 50...79:
	print("Warm")
case 80...110:
	print("Hot")
default:
	print("Temperature out of range")
}

 
where 문 사용하기
 
where 문은 switch case에 부가적인 조건을 추가하기 위하여 사용될 수 있음
값이 속하는 범위 뿐만 아니라 그 숫자가 홀수인지 짝수인지도 검사함

var temperature = 54
switch (temperature)
{
case 0...49 where temperature % 2 == 0:
	print("Cold and even")
case 50...79 where temperature % 2 == 0:
	print("Warm and even")
case 80...110 where temperature % 2 == 0:
	print("Hot and even")
default:
	print("Temperature out of range or odd")
}

 
 
fallthrough
다른 언어들과는 다르게 Swift 언어는 일치하는 case 문을 만나면 자동으로 빠져나오기 때문에
case 문 다음에 break 문을 포함할 필요가 없다.
 
case 별로 빠져나가지 않고 아래로 계속 내려가게 하려면 fallthrough 문을 사용한다.

var temperature = 10
switch (temperature)
{
case 0...49 where temperature % 2 == 0:
	print("Cold and even")
    fallthrough
case 50...79 where temperature % 2 == 0:
	print("Warm and even")
    fallthrough
case 80...110 where temperature % 2 == 0:
	print("Hot and even")
    fallthrough
default:
	print("Temperature out of range or odd")
}

 
Swift switch 구문에서는 보통 break 문이 사용되지 않지만, default case에서 해야 할 작업이 없을 경우에는 break 문이 유용하다.

...
default:
break
}

 
 
 
다음 글에서는 함수와 메서드(method), 클로저(closer)에 대해 다뤄보겠다.