iOS 프로그래밍 기초

[iOS 프로그래밍] 3주차

kimbh 2024. 9. 19. 16:50
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병합연산자를 사용하여도 정수 값이 나오는것을 알 수 있다.