일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- ios #boxoffice #영화진흥위원회 #swift #앱 #app #대학생
- 컴공 #Swift #대학생 #iOS #앱개발 #앱디자인
- iOS #Swift #컴공 #대학생
- java #android #xml #sqlite
- iOS #Swift #컴공 #공대생
- iOS #Swift
- iOS #대학생 #Swift
- ios #swift #개발자 #apple
- 컴공 #Swift #대학생 #iOS #앱개발
- iOS #Swift #대학생 #개발 #코딩
- node.js #npm #jest #test #웹테스트
- 컴공 #Swift #대학생 #iOS
- 컴공 #자바스크립트 #스터디 #JS #대학생
- web #socket #polling #소켓 #폴링 #네트워크 #웹
- Today
- Total
평범한 컴공 대학생의 공부일지
iOS Swift 제어문(Control Flow), 함수 본문
※이 iOS 카테고리의 글 들은 학교 강의와 과제를 기반으로 작성한 것입니다.※
※Window환경에서 작업하기 때문에 Online Compiler를 사용하는 점 참고 부탁드립니다.※
이번 글에서는 제어문(Control Flow)과 함수에 대해서 알아보겠습니다.
- 제어문(Control Flow)
제어문은 크게 반복문, 조건문으로 2가지가 있습니다.
- 반복문(for, While)
1. for
for문에 대해서 알려드리기 전에 짚고 넘어가야할 것이 있습니다. 여러분들이 C언어나 Java등 다른 언어를 사용해 보셨다면 for문 뒤에 꼭 괄호 ( ) 를 사용합니다. 하지만 Swift에서는 사용하면 오류가 나는 경우도 있으므로 사용하지 않는 것을 추천드립니다.
- 조건-증가 for문 (Swift 3에서 삭제)
1) 문법 - 아래와 같이 사용하며 현재는 사용되지 않는 문법입니다. 대신 for-in 반복문을 사용합니다.
for var a = 2; a < 11; a+=1 { // for i in 2..<11 로 수정해야 함
print(a)
} //error: C-style for statement has been removed in Swift 3
//for 초기화; 조건식; 증감식 {
// 실행될 구문
//}
- for in 반복문
1) Swift에서 가장 일반적으로 사용하는 반복문은 for-in 문입니다.
이를 통해 배열, 범위, 문자열, 딕셔너리 등의 요소를 순회할 수 있습니다.
2) 문법
for i in 2..<11 {
print(i)
}
// 2부터 10까지의 숫자를 출력
// 출력 결과 : 2 3 4 5 6 7 8 9 10
3) 주의사항
- for-in 문에서 { } 생략시 오류가 발생합니다.
for index in 1...5
print(index) //error: expected '{' to start the body of for-each loop
위 코드는 { } 생략으로 인해 발생하는 오류이며 꼭 { }를 사용하여야 합니다.
또한 반복 변수(위 코드에선 index)가 실제로 사용되지 않는다면 _로 대체하라는 경고가 발생할 수 있습니다.
아래 코드는 주의사항을 지키고 이름을 10번 출력하는 코드입니다.
for _ in 1..<11 {
print("Taram")
} // 출력 결과 : Taram Taram Taram Taram Taram Taram Taram Taram Taram Taram
4) 배열 항목 접근하기
- Swift에서 배열 항목을 접근하는 방법은 다음과 같습니다.
let names = ["A", "B", "C", "D"]
for name in names[2...3] {
print(name)
}
// 결과 : C D
names라는 배열에 A, B, C, D 값을 넣고 0부터 3까지의 인덱스 번호가 할당 됩니다.
name이라는 반복 변수를 선언-> 배열 names 의 인덱스 범위를 지정하여 해당 범위에 있는 항목들만 선택하여 출력합니다.
2. while 반복문
1) while 반복문은 지정된 조건을 만족할 때까지 작업을 반복합니다. 아래 코드를 먼저 확인해볼까요?
var myCount = 5
while myCount < 1005 {
myCount+=1
}
print(myCount) // 출력 결과 : 1005
위 코드를 확인해보시면 while myCount < 1005라는 조건을 확인할 수 있습니다. myCount가 1005보다 작을 때까지 myCount 값을 +1씩 증가시키는 것이죠. 출력 결과를 확인해보면 1005가 출력되는 것을 확인 할 수 있습니다.
3. repeat ~ while 반복문
1) 구조
- 특정 조건이 충족되지 않을 때까지 코드 블록을 반복적으로 실행하는 구조
- repeat-while 문은 아래와 같이 구성됩니다.
repeat {
// 반복 실행할 코드
} while 조건식
이 구조에서는 먼저 repeat 블록 내의 코드가 한 번 실행된 후, while에 주어진 조건식을 검사합니다. 만약 조건식이 참(true)라면 다시 repeat 블록의 코드를 실행하고, 이 과정을 조건식이 거짓(false)가 될 때까지 계속합니다.
2) 예제
아래는 간단한 repeat-while 사용 예제입니다.
var i = 10
repeat {
i=i-1
print(i) //출력 결과 : 9 8 7 6 5 4 3 2 1 0
} while (i > 0)
위 코드는 변수 i가 초기값으로 주어진 후, 각 반복마다 값이 하나씩 줄어들고 그 값을 출력합니다. 이 과정은 변수 i의 값이 '0'보다 크다는 조건(i > 0) 하에 계속되며, 변수 i가 '0'일 때 종료됩니다.
4. break
- break는 현재 실행 중인 루프를 즉시 종료합니다. 그 후 루프 바로 다음에 오는 코드를 실행합니다.
for i in 1..<10 {
if i > 5 {
break
}
print(i)
}
// 출력 결과 : 1, 2, 3, 4, 5
위 코드에서 for-in 구문은 원래라면 i가 1부터 시작하여 값이 증가하면서 10보다 작은 동안 반복을 수행해야 합니다. 하지만 if i > 5 { break } 조건 때문에 i가 '6'이 되자마자 반복이 종료되고 프로그램은 for-in 구조 다음의 코드로 넘어갑니다.
5. continue
- continue는 현재 반복 주기를 즉시 종료하고 다음 주기로 넘어갑니다.
for i in 1...10 {
if i % 2 != 0 {
continue // 홀수인 경우 건너뛰고 다음으로 넘어감
}
print(i)
}
//출력 결과 : 2 4 6 8 10
위 코드에서 for-in 구문은 원래라면 'i'가 '1'부터 시작하여 값이 증가하면서 '10'까지 도달할 때까지 반복을 수행해야 합니다. 그러나 if i %2 !=0 { continue } 조건 때문에 'i'값이 홀수일 경우 해당 숫자를 출력하지 않고 바로 다음 숫자로 넘어갑니다.
- 조건문(if, if~else, guard, guard~let, witch~case)
1) if 조건문
if 조건문은 if 뒤에 따라오는 조건에 따라 실행할 코드를 정합니다.
주의사항 : 다른 언어들과 다르게 if 문 다음의 실행 코드가 1줄이여도 { } 필수 사용
if문에서의 콤마(,)는 &&(AND)연산자를 의미합니다.
아래는 위 주의사항과 관련된 코드입니다.
var a = 1
var b = 2
var c = 3
var d = 4
if a < b && d > c {
print("yes")
}
if a > b, d > c { //if문에서 콤마는 AND(&&)의 의미 -> a가 b보다 작으므로 2번째 no 출력 X
print("no")
}
2) if ~ else 조건문
if-else 문은 특정 조건에 따라 True와 false를 판단하여 다른 코드 블록을 실행하도록 합니다.
var x = 12904810981
if x % 2 == 0 {
print("짝수입니다")
}
else{
print("홀수입니다")
}
//출력 결과 : 홀수입니다
위 코드는 변수 x가 짝수인지 홀수인지 판별하여 출력하는 예제입니다. x가 짝수(True)라면 if의 코드를 실행하고
홀수(false)라면 else에 있는 코드를 실행합니다.
3) guard 문
- guard라는 특별한 키워드를 사용하여 조건문을 작성할 수 있습니다.
일반적인 if문과는 다르게, 주로 "조건이 충족되지 않을 때" 어떤 작업을 수행하도록 하는 데에 사용됩니다.
예를 들어, 함수나 메소드 내부에서 입력값의 유효성을 검사할 때 guard 문이 자주 사용됩니다.
먼저 구성 방식부터 알려드릴게요.
guard 조건식 else {
// 조건이 충족되지 않았을 때 실행할 코드
}
이와 같이 구성되며 아래 예제에 설명을 주석으로 달아놓았으니 다시 한 번 알아보시길 바랍니다.
여기서 printIfPositive는 함수이며 아래에서 다시 다룰 예정입니다.
// guard문 예제
func printIfPositive(number: Int) {
guard number > 0 else { // number가 0보다 큰 조건을 만족하지 않았을 때(0보다 작을 때)
return // return하여 함수 종료
}
print("The number is \(number)")
}
printIfPositive(number: -3) // -3은 0보다 작기 때문에 아무것도 출력하지 않음
printIfPositive(number: 5) // "The number is 5" 출력
4) guard let 구문
- Swift의 옵셔널 변수를 안전하게 해제하기 위해 'if let' 구문을 사용하는 것 기억나시나요?
'guard let' 구문도 옵셔널 바인딩에 활용될 수 있습니다.
기억이 안나시는 분은 https://uv0lpurmoon.tistory.com/16 여기에서 옵셔널을 다시 한번 확인해보세요.
func unwrapAndPrint(optionalValue: Int?) {
guard let value = optionalValue else { //value가 nil인지 확인 -> nil인 경우 Invalid value! 출력
print("Invalid value!")
return
}
print("The value is \(value)")
}
unwrapAndPrint(optionalValue: nil) // "Invalid value!" 출력
unwrapAndPrint(optionalValue: 10) // "The value is 10" 출력
위 코드에서 'unwrapAndPrint()' 함수는 입력된 옵셔널 값이 nil인지 확인하고, nil이 아닌 경우에만 그 값을 출력합니다. 만약 nil 값이 전달되면 'Invalid value!'라고 출력 후 함수가 종료됩니다.
5) switch - case문
switch-case 구조를 사용하면 여러 조건을 한 번에 확인할 수 있습니다.
- Swift에서는 case문 마지막에 break가 자동으로 삽입되어 있으므로 break를 작성하실 필요가 없습니다.
- 아까 if문에서의 콤마(,)는 &&(AND)연산자를 의미 한다고 했습니다. 하지만 switch문에서는 or(||)를 의미하기 때문에 이 점 꼭 짚고 넘어가셔야합니다.
- switch - case문에서도 where절을 통해 추가적으로 조건을 부여할 수 있습니다.
위 내용들을 아래 예제들을 통해 확인해보죠.
//switch~case문 예제
let weight = 67.5
let height = 179.6
let bmi = weight / (height*height*0.0001) // kg/m*m
var body = ""
switch bmi {
case 40...:
body = "3단계 비만"
case 30..<40:
body = "2단계 비만"
case 25..<30:
body = "1단계 비만"
case 18.5..<25:
body = "정상"
default:
body = "저체중"
}
print("BMI:\(bmi), 판정:\(body)")
//BMI:20.926235484943035, 판정:정상
위 코드는 BMI 계산 결과를 출력해주는 코드입니다.
switch문을 보시면 bmi의 값이 40 이상일 땐 3단계 비만, 30이상 40미만일 땐 2단계 비만 등과 같이 나누어져 계산한 bmi 수치와 그에 따른 case로 이동하고 실행 후 break되어 출력되는 것을 확인할 수 있습니다.
//콤마(,)를 통해 결합하기
var value = 3
var days : Int = 0
switch(value)
{
case 1,3,5,7,8,10,12: // switch-case에서의 ,(콤마)는 or을 의미
print("31 일입니다")
case 4,6,9,11:
print("30 일입니다")
case 2:
print("28 or 29 일입니다")
default:
print("월을 잘못 입력하셨습니다")
}
//출력 결과 : 31 일입니다
위 코드와 같이 case에 콤마(,)를 사용하여 or(||)연산자로 사용할 수 있습니다.
// 섭씨 온도를 입력받아서 해당 온도에 대한 상태를 출력하는 함수입니다.
func printTemperatureStatus(temperature: Int) {
switch temperature {
case let t where t < 0:
// where절을 사용하여 조건을 추가했습니다. 이 경우에는 온도가 0 미만일 때 실행됩니다.
print("It's freezing!")
case let t where t >= 0 && t < 10:
// 여기에서는 온도가 0 이상, 그리고 10 미만일 때 실행됩니다.
print("It's cold.")
case let t where t >= 10 && t < 20:
// 여기에서는 온도가 10 이상, 그리고 20 미만일 때 실행됩니다.
print("It's cool.")
case let t where t >= 20 && t < 30:
// 여기에서는 온도가 20 이상, 그리고 30 미만일 때 실행됩니다.
print("It's warm.")
default:
// 위의 모든 조건이 충족되지 않을 경우에 실행됩니다. 즉, 온도가 '30' 이상일 때입니다.
print("It's hot!")
}
}
// 함수 호출 예제
printTemperatureStatus(temperature: -5) // 출력 결과 : "It's freezing!"
printTemperatureStatus(temperature: 5) // 출력 결과 : "It's cold."
printTemperatureStatus(temperature:15) // 출력 결과 : "It's cool."
printTemperatureStatus(temperature:25) // 출력 결과 : "It's warm."
printTemperatureStatus(temperature:35) // 출력 결과 : "It's hot!"
이와 같이 where 절을 활용하면 보다 복잡한 조건 판단 로직을 효율적으로 단순화할 수 있습니다.
- 함수(Function)
- 함수란 특정 작업을 수행하는 독립적인 코드 블럭입니다.
들어가기 전에 전달인자, 매개변수, 반환 값 이 3가지에 대해서 알아야합니다.
- 전달인자(Arguments) : 함수를 호출할 때 함수에 전달하는 값들을 말합니다.
예를 들어 add(a: 3, b: 5)에서 '3'과 '5'는 전달인자입니다.
- 매개변수(Parameters) : 함수가 호출될 때 받아들이는 변수들을 말합니다.
이 변수들은 함수 내부에서만 사용되며, 각각의 매개변수는 해당하는 전달인자의 값을 저장합니다.
예를 들어 func add(a: Int, b: Int)에서 'a'와 'b'는 매개변수입니다.
내부 매개변수 명과 외부 매개변수 명을 따로 두어 사용할 수 있습니다.
- 반환값(Return Value) : 함수가 수행된 후에 결과로 돌려주는 값입니다.
반환값은 return 키워드 뒤에 오며, 해당 값을 받아서 다른 코드에서 활용할 수 있습니다.
1) 기본적인 함수 정의와 호출
간단한 함수 예제를 통해 알아보죠.
func sayHello() -> Void {
print("Taram의 Tistory입니다.")
}
sayHello() // 함수 호출, 출력 결과 : Taram의 Tistory입니다.
// 구성 형식
func <함수명> (<매개변수 이름>: <매개변수 타입>, <매개변수 이름>: <매개변수 타입>,... ) -> <반환값 타입> {
// 함수 코드
}
위 코드는 전달인자, 매개변수 이름과 타입이 없는 간단한 선언 후 호출 방식 입니다. 바로 들어가보죠.
2) 전달인자, 매개변수, 반환 값이 존재하는 예제
func add(x: Int, y: Int) -> Int { //Int형 끼리 연산하여 반환 값이 Int형으로 나와야하므로 반환 값의 자료형은 Int
return (x+y)
}
print(add(x:1230, y:1203)) //print문으로 감싸지 않을 시 함수를 호출하고 사용하지 않고 있다는 경고문 출력
//출력 결과 : 2433
print(type(of:add)) //반환 값의 자료형, parameter의 자료형 출력
//출력 결과 : (Int, Int) -> Int
위 코드에서 add함수는 두 개의 정수를 입력받아 더한 값을 반환하는 함수입니다.
여기서 매개변수는 x, y이며 원하는 자료형을 적어줍니다. -> Int를 통해 반환 값의 자료형도 적어주었죠.
그럼 전달 인자는 무엇일까요? 함수를 호출할 때 괄호 안에 적혀있습니다. 바로 1230, 1203이죠. x의 전달 인자는 1230, y의 전달 인자는 1203입니다. 여기서 주의할 점은 Double형과 Int형은 연산이 불가능하기 때문에 꼭 타입을 맞춰 주셔야 합니다.
3) #function 리터럴
- #function 리터럴은 현재의 함수 이름을 나타내는 문자열을 반환합니다.
디버깅이나 로깅 등에 사용되며 내.외부 매개변수 명을 사용한 예제를 살펴보겠습니다.
func add(x: Int, y: Int) -> Int {
print(#function) // 현재 함수의 이름을 출력합니다. 여기서는 "add(x:y:)"
return(x+y)
}
print(add(x:10, y:20)) // 함수를 호출하고 결과를 출력합니다. 결과는 30입니다.
print(type(of: add)) // 함수의 타입을 출력합니다. 결과는 "(Int, Int) -> Int"
func add1(dog x: Int, cat y: Int) -> Int { //dog, cat : 외부 매개변수 명, 호출 시 사용
print(#function) // 현재 함수의 이름을 출력합니다. 여기서는 "add1(dog:cat:)"
return(x+y)
}
print(add1(dog:10, cat:20)) // 함수를 호출하고 결과를 출력합니다. 결과는 30입니다.
print(type(of: add1)) // 함수의 타입을 출력합니다. 결과는 "(Int, Int) -> Int"
func add2(_ x: Int, _ y:Int) ->Int{ // 외부 매개변수 명 생략
print(#function) // 현재 함수의 이름을 출력합니다. 여기서는 "add2(_:_:)". 매개변수에 레이블이 없으므로 언더스코어(_)가 표시됩니다.
return (x+y)
}
print(add2(10, 20)) // 함수를 호출하고 결과를 출력합니다. 이 때 매개변수 레이블이 없으므로 직접 값을 입력해야 합니다.
print(type(of:add2))//함수의 타입을 출력합니다.
func add3(_ x:Int , cat y:Int)->Int{ //1번째 외부 매개변수 명 생략, 2번째부터 외부 매개변수 명 사용
print(#function)//현재함수 이름인 "add3(_:cat)"출력
return (x+y)
}
print(add3(10 ,cat :20 ))//함수호출과 그결과인 30출력
//_로 첫번째 매개변수 레이블은 생략되었지만 두번째 매개변수 레이블은 'cat'으로 표시되어 있습니다.
//_표시된 부분은 값만 입력하면 되며 'cat'레이블 부분은 명확히 표시해줘야 합니다.
print(type(of:add3 ))//함수타입인 "(Int ,Int)->int"출력
위 코드에서 #function 리터럴은 각각의 함수가 실행될 때 해당하는 함수 이름을 문자열로 반환하여 출력합니다.
또한 Swift에서는 _ 기호를 사용하여 전달인자 레이블(argument label)을 생략할 수 있습니다. 이 경우에도 #function 리터럴은 _ 기호를 포함하여 함수의 이름을 반환하게 됩니다.
마지막으로 type(of:) 함수는 전달된 값의 타입을 반환하는 Swift 표준 라이브러리 함수입니다. 여기서는 각각의 함수 객체를 전달하므로, 각각의 함수 타입이 출력됩니다.
이와 같이 이번 포스트에서는 제어문과 함수에 대해서 알아보았습니다. 함수는 다음 글에서 더 깊게 다뤄 포스팅하겠습니다. 피드백은 언제나 환영입니다!
'iOS Swift' 카테고리의 다른 글
iOS Swift 클로저(후행 클로저), 클래스(Class) (2) | 2023.10.22 |
---|---|
iOS 1급 객체(시민)와 클로저 (2) | 2023.10.15 |
iOS Swift Guard문, 함수 (2) | 2023.10.15 |
iOS Swift 옵셔널(Optional), 연산자 (0) | 2023.09.24 |
iOS Swift 자료형, 상수(let), 변수(var), 튜플(Tuple) (0) | 2023.09.11 |