import UIKit
var name = "김병현"
var age = 25
var produce = "저의 이름은 \(name)이고, 나이는 \(age)살입니다."
print(produce)
Let 과 Var 의 차이점
3. Tuple
튜플은 한 줄의 코드로 튜플의 모든 값을 추출하여 변수 혹은 상수로 할당할 수 있다.
예)
let myTuple = (10, 10.2, "Hi")
print(myTuple.1)
해당 소스처럼 한 줄에 값들을 할당하고, 출력문에 myTuple.1을 하게되면 myTuple에 있는 튜플 값중 인덱스 1에 관련된 값을 출력하게된다.
또, 튜플에 각 값당 이름을 할당할 수 있다. 예로들어
let myTuple = (count : 10,length : 10.2,message : "Hi")
print(myTuple.count)
10에 관련된 값은 count라는 이름으로, 10.2는 length라는 이름으로 지정이 가능하다. 또한 출력문을 사용할 때 하나의 이름만 출력하는게 아니라 다른 이름도 같이 출력이 가능하다.
let myTuple = (count : 10,length : 10.2,message : "Hi")
(출력문에 여러 튜플 값을 출력)
let myTuple = (count : 10,length : 10.2,message : "Hi")
print(myTuple.count, myTuple.message)
4. Void 형
Void형은 빈 튜플(empty tuple)라고 한다. 튜플 괄호 안에 아무 내용이 없는것을 의미한다.
5. 연산자
(1) 증가 연산자와 감소 연산자
Swift에서는 증감, 감소 연산자는 i++이라고 하지않고 i+=를 사용한다.
var i = 10
i++
print(i)
i++에서 오류가 난다.
하지만,
var i = 10
i += 1
print(i)
해당 소스처럼 오류가 안나고 11의 값이 출력되는것을 알 수가 있다.
(2) 범위 연산자
닫힌 범위 연산자(closed range operator) -
x...y 처럼 .(점)을 3번을 사용해서 사용하는 범위 연산자이다.
반 열린 범위 연산자(half-open range operator) -
x..<y 처럼 .(점)을 2번 사용하고 <(꺽세)를 사용함.
One-Sided Ranges
let names = ["A", "B", "C", "D"]
for name in names [...3] { //[...2], [..<2] //과제: 실행 결과
print(name)
}
6. 클래스 vs. 객체 vs. 인스턴스
위에 설명에서도 알다싶이 클래스에서 만들어진 객체를 실제로 사용하는것이 "인스턴스"이다.
7. 제어문
(1) for - in
for index in 1...5 {
print(index)
}
1부터 5까지 출력하겠다는 소스코드이다.
for x in 1...5 {
print(x, terminator: " ")
}
원래 터미네티어를 사용하지 않으면 개행된 출력문이 나오는데 터미네이터를 사용해서 개행되지 않고 띄어쓰여져서 출력이 되는것을 알 수 있다.
(1-2) _(under score)
for x in 1...5{
print("sss")
}
해당 소스처럼 sss를 개행해서 5번 출력하는 소스인데. for와 in 사이에 x만 사용하면 출력이 안되는 경우가 있다 그런 경우.
다음과 같은 예로 출력을 할 수 있다.
//1.
for _ in 1...5 {
print("안녕")
}
//2.
for i in 1...5 {
print("\(i) 안녕")
}
(2) while문
for 반복문은 몇 번 정도 반복해야 할지 아는 경우에 적합.
조건을 만족할 때까지는 반복해야 하는 경우 while 반복문 사용
예)
while 조건식 {
// 반복 코드
}
(2-2) repeat ~ while 문
swift 1.x의 do … while 반복문을 대신하는 문
repeat {
//
} while 조건식
(2-3) break문
반복문이 완료되는 조건 전에 반복문을 빠져나오기 ( 무한루프가 걸려져 있는 반복문을 빠져나오게 할 수 있음.)
for i in 1..<10 {
if i > 5 break
print(i)
}
해당 소스처럼 사용하면 되지만 잘 보면 오류를 발견할 수 있따.
for i in 1..<10 {
//오류 if i > 5 break
print(i)
}
오류로 되어있는 부분 줄이 오류이다. 해당 if문처럼 제어문을 사용하게 되면 반드시 중괄호({})를 넣어야 한다.
오류를 고치면 다음 소스와 같다.
(오류 고친 소스)
for i in 1..<10 {
if i > 5{
break
}
print(i)
}
(2-4) if문 출력문이나 다음의 실행코드가 한 줄이더라도 무조건 중괄호({})를 사용해야하는것을 명심해야한다.
(2-5)
if문 조건에서 콤마 : 조건나열(condition-list)
&&을 사용할 때는 논리가 참일때이고, ,(컴마)는 조건이 둘다 참일때 사용한다.
예)
var x = 1
var y = 2
if x == 1 && y==2 { //논리가 참일때.
print(x,y)
}
if x == 1, y==2 { // 조건이 둘 다 참일때 (condition-list)
print(x,y)
}
(2-6) switch - case문
스위치 - 케이스문에는 각 케이스문 마지막 마다 break가 자동적으로 존재한다.
switch 표현식
{
case match1:
구문
case match2:
구문
case match3, match4:
구문
default:
구문
}
해당 예제 소스처럼 케이스문마다 안보이지만 자동적으로 break가 들어가있는것을 알아야한다.
(주의사항)
let anotherCharacter: Character = "a"
switch anotherCharacter {
case "a": // 오류
case "A":
print("A글자")
default:
print("A글자 아님")
}
해당 오류가 난 케이스문에는 조건을 걸어놓고 아무것도 넣지 않아서, 비어있어서 오류가 난다.
(범위 지정 매칭)
let num = 25
let count : String
switch num {
case 0...9:// 0 ~ 9
count = "한자리 수"
case 10...99: // 10 ~ 99
count = "두자리 수"
case 100...999: // 100 ~ 999
count = "세자리 수"
default:
count = "네자리 수 이상"
}
print("\(count)입니다.")
해당 소스처럼 범위를 지정해서 범위에 해당하는 케이스가 있으면 그 해당되는 케이스문에 값을 출력한다.
(where절 사용)
var temperature = 60
switch (temperature)
{
case 0...49 where temperature % 2 == 0: // where 절 사용
print("Cold and even")
case 50...79 where temperature % 2 == 0:// where 절 사용
print("Warm and even")
case 80...110 where temperature % 2 == 0: // where 절 사용
print("Hot and even")
default:
print("Temperature out of range or odd")
}
케이스문에 부가적으로 조건문을 걸고 싶을때 사용한다.
(2-7) where절
조건을 추가하는 문법이다.
예)
var numbers: [Int] = [1, 2, 3, 4, 5]
for num in numbers where num > 3 {
print(num)
}
해당 소스에는 for문에 where절을 결합하여 사용한 소스이다. 이처럼 다양한 제어문에 특정 패턴과 결합하여 사용할 수 있는 문법은 where절이라고 생각하면 된다.
(2-8) fallthrough
스위프트는 일치하는 케이스문을 만나면 자동적으로 빠져나온다.
var value = 4
switch (value)
{
case 4:
print("4")
fallthrough
case 3:
print("3")
fallthrough
case 2:
print("2")
fallthrough
default:
print("1")
}
(3) 옵셔녈(optional) **중요**
var x : Int = 10 // 일반 자료형 Integer형
var y : Int? // 변수의 값 x
print(x)
print(y)
해당 소스에서 integer형 10의 값을 가진 일반적인 자료형 x가 있고,
그 아래에 integer형 앞에 ?(물음표)가 들어가 있는데 이것이 옵셔널이다. 옵셔널은 변수의 값을 넣지 않고도 변수를 사용할 수 있는것을 말한다.
그 종류중에서도 intger 옵셔녈은 값을 넣지 않고 변수를 사용할 수 있는 방법이다.
var y : Int? // 변수의 값 x
y = 10
print(y)
해당 소스처럼 integer형 옵셔널의 변수를 선언하고 값을 넣게된다 그렇게 되면 어떻게 될까?
(값을 넣고 선언해서 출력하게 될 경우)해당 사진처럼 "nil"이라는 값만 출력된다.
출력을 보면 옵셔녈(10)이라는 값이 출력이 된다 이 값은 일반적인 방법으로 사용할 수 없고 특별한 방법으로 풀어야 한다.
var y : Int? // 변수의 값 x
y = 10
print(y, y!)
옵셔널(10)의 값을 출력하지 않고 그냥 일반적인 값을 출력하는 방법은 해당 변수명에 !(느낌표)를 붙여서 사용하는 방법이다.
위에 소스처럼 y를 출력해보도록 하겠다.
y!를 출력한 값은 온전히 10의 값을 출력한것을 알 수 있다.
var y : Int? // 변수의 값 x
print(y)
//x = 10
print(y, y!)
해당 소스처럼 변수의 값이 없는 상태에서 옵셔녈 변수 출력하는것을 풀게되면 오류가 생기는것을 알 수 있다. 이런경우는 초보 개발자들이 자주 실수하는 경우이다.
index라는 이름의 옵셔널 Int 변수를 선언
-> var index: Int?
-> index 변수는 정수 값을 갖거나 아무 값도 갖지 않을 수 있음(nil)
var y : Int = nil// 변수의 값 x
print(y)
nil같은 경우는 값이 없는것을 나타내는것인데 옵셔녈형으로 선언하지 않고 nil의 값을 넣게 될 경우 오류가 생긴다.
var y : Int? = nil// 변수의 값 x
print(y)
(3-1)wrapping과 unwrapping
var x : Int? //wrapping(포장화)
var y : Int
x = 2
print(x)
x = x!+2
print(x)
y = x! // forced unwrapping(강제풀기)
print(y)
(3-2) forced unwrapping
var x : Int?
// x = 10
if x!=nil { // 오류
print(x!)
}
해당 오류라고 적혀있는 주석 줄에 오류가 생기는데 x!=nil에서 다 붙여버려서 오류가 생겼다. 컴퓨터는 x!= nil인지 x! = nil인지 x != nil인지 식별할 수 없기 때문에 확실하게 처리해줘야 한다.
var x : Int?
x = 10
if x != nil {
print(x!)
}
else {
print("nil")
}
var x1 : Int?
if x1 != nil {
print(x1!)
}
else {
print("nil")
}
(예시 소스이다.)
(3-3) optional binding -
var x : Int?
x = 10
if let xx = x {
print(x,xx)
}
else {
print("nil")
}
var x1 : Int?
if let xx = x1 {
print(xx)
}
else {
print("nil")
}
위에 세번째 줄 if문은 옵셔널 변수 x가 값(10)이 있으므로 언래핑해서 일반 상수 xx에 대입하고 if문 실행하고
위에 코드중 열번째 줄 if문은 옵셔널 변수 x1이 값이 없어서 if문의 조건이 거짓이 되어 if문 실행하지 않고 else로 간다.
해당 코드같은 경우가 옵셔녈 바인딩이라고 부른다.
var x : Int?
x = 10
if let x=x { // ??
print(x,x)
}
else {
print("nil")
}
해당 소스에서 주석으로 되어있는 줄을 보면 wrapping으로 되어있는 x의 변수를 x의 다시 대입을 하게 되면 어떻게 될까?
해당 출력을 보면 unwrapping으로 되어서 출력이 되는것을 알 수 있다.
또 다른 방법은
var x : Int?
x = 10
if let x {
print(x)
}
else {
print("nil")
}
이 방법으로도 unwrapping으로 출력이 되는것을 알 수 있다.
이러한 방법을 short form이라고도 부르고 iOS에서 가장 많이 사용하는 문법이다.
import UIKit
var x : Int?
var y : Int?
x = 10
y = 5
if let x, let y{ // 두 개 이상의 옵셔녈 변수를 푸는 방법
print(x, y)
}
else {
print("nil")
}
해당 소스처럼 let을 여러번 사용해서 옵셔녈 변수를 언래핑하는 방법이 존재한다.
그 외에도 if let xx = x, let yy = y와 if let x = x, let y = y의 방법등 세 가지의 방법이 존재한다.
import UIKit
var x : Int?
var y : Int?
x = 10
y = 5
if let x = x, let y = y{
print(x, y)
}
else {
print("nil")
}
import UIKit
var x : Int?
var y : Int?
x = 10
y = 5
if let xx = x, let yy = y{
print(xx, yy)
}
else {
print("nil")
}
(3-4) 옵셔녈 : 조건나열
import UIKit
var x : Int?
var y : Int?
x = 10
//y = 5
if let xx = x, let yy = y{ // 두개의 변수가 값이 있을 경우 참으로 실행됨.
print(xx, yy)
}
else {
print("nil")
}
해당 소스는 두 개의 조건이 참일 경우에만 xx와 yy의 값을 출력하는데 x의 값만 가지고 있기 때문에 참이 아니기 때문에 nil의 값을 출력한다. 이 방법은 전에 다뤘던 조건나열(condition-list)의 방법이다.
(3-5) 옵셔널형(Optional Type)의 두 가지 방법
var x : Int?
x = 10
//x = x+2 오류
var y : Int!
y = 20
y = y+2 // 가능
print(x)
print(y)
1. x = x+2는 옵셔녈 변수이기 때문에 일반형 정수의 값을 연산할 수 없지만,
2. y = y+2는 변수 선언을 할때 Int!(강제풀기)했기 때문에 일반 정수형의 값을 연산할 수 있다. 다음과 같은 출력문으로 예로 들 수 있다.
해당 Optional(22)가 나타나는 경우는 연산할 때만 일반형이기 때문에 출력에서는 옵셔녈(22)로 출력된것을 알 수 있다.
해당 방법은 (implicitly unwrapped) 암묵적인 언래핑이라고도 부른다.
(3-6) ??(nil병합연산자) **중요**
옵셔녈 변수의 값이 nil이면 ?? 다음 값으로 할당이 된다. 반대로 nil값이 아닌 경우 언래핑된 값이 나온다.
let defaultAge = 1
var age : Int?
age = 3
print(age)
var myAge = age ?? defaultAge
print(myAge)
var x : Int? = 1
var y = x ?? 0
print(y)
처음 출력문은 age 변수의 옵셔널 변수로 선언해서 값을 넣었기 때문에 출력값은 Optional(3)의 값이 출력되고,
두 번째 출력문에서는 myAge라는 일반형 변수에 ??연산자를 사용해서 nil이 아니기 때문에 두 번째 출력값은 3으로 나타나게 되고,
세 번째 출력문은 y의 값도 일반 정수형 변수이기 때문에 nil병합연산자를 사용하여도 정수 값이 나오는것을 알 수 있다.
'iOS 프로그래밍 기초' 카테고리의 다른 글
[iOS 프로그래밍 기초] 6주차 클래스/ failable/ initialize (4) | 2024.10.10 |
---|---|
[iOS 프로그래밍] 6주차 일급 객체(일급 시민)와 클로저 기초 (1) | 2024.10.09 |
[iOS 프로그래밍 기초] 4주차 (1) | 2024.09.26 |
[iOS 프로그래밍 기초] 2주차 (0) | 2024.09.12 |
iOS 프로그래밍 기초 1주차 (1) | 2024.09.05 |