iOS 프로그래밍 5주차

CDH·2024년 10월 3일

출처 : SmileHan - iOS 프로그래밍 기초 강의


복습하기

- swift에서 문자를 출력할 때 변수나 상수를 같이 넣고 싶다면 \(변수 or 상수) 넣기

예시 코드

var x : Int = 10
print ("x의 값은 \(x) 입니다")

결과
x의 값은 10 입니다


※소수점이 있는 숫자는 웬만하면 Double형을 사용하자


※ Character 형은 다른 언어와 다르게 쌍따옴표("")를 사용한다


swift에서 변수와 상수

출처 : 뤼튼


타입 어노테이션과 타입 추론 (용어)

타입 어노테이션 (type annotation) : 타입을 미리 명시적으로 작성

타입 추론 (type inference) : swift가 자동으로 타입을 결정

뤼튼


튜플

- 여러 값(타입)을 하나의 개체에 일시적으로 묶는 방법

- 자바에서 새로운 클래스를 만드는 것과 비슷함

예시 코드

// 튜플 선언
let person = (name: "Alice", age: 30, city: "Seoul")
// 튜플의 값 사용
print("이름: \(person.name), 나이: \(person.age)")
// 언더스코어를 사용하여 city 값을 무시
let (name, age, _) = person
print("이름: \(name), 나이: \(age)")

결과
이름: Alice, 나이: 30
이름: Alice, 나이: 30


swift 에서 증감 연산자는 아래와 같은 방법을 사용하자

x = x + 1
또는
x += 1

비교연산자에서 이퀄

== (이퀄 두 개) : 값이 같은지 확인
=== (이퀄 세 개) : 메모리 주소 값이 같은지 확인


범위 연산자


클래스, 객체 등의 용어 정리

타입 검사 (is)

- 자료형 뿐만 아니라 클래스형을 검사할 때도 사용 가능함

예제코드

let x = 1
if x is Int { // x가 정수이면
print("Int!") 
}

결과
Int!


for - in 반복문

- 언더스코어 ( _ ) 로 참조체 생략 가능

예시 코드

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

예시 코드

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

dictionary의 항목 접근


repeat~while 반복문


if 조건에서 콤마 : 조건나열(condition-list)


switch - case

- swift에서는 각 case문 마지막에 break가 자동으로 들어가있다(동작한다)

조건 결합하기

var value = 3
var days: Int = 0

switch(value) {
case 1, 3, 5, 7, 8, 10, 12:
    print("31 일입니다")
case 4, 6, 9, 11:
    print("30 일입니다")
case 2:
    print("28 or 29 일입니다")
default:
    print("월을 잘못 입력하셨습니다")
} 

위 코드처럼 콤마를 사용


switch-case문에서의 범위 지정 매칭

let num = 25
let count: String

switch num {
case 0...9:
    count = "한자리 수"
case 10...99:
    count = "두자리 수"
case 100...999:
    count = "세자리 수"
default:
    count = "네자리 수 이상"
}

print("\(count)입니다.")

switch-case에서 where절 사용하기

- switch, catch, while, guard, for 등에서 사용 가능

- 보통 조건을 추가할 때 사용 (하나만 사용 가능)

- 특정 패턴과 결합하여 조건을 추가하기도 함

var numbers: [Int] = [1, 2, 3, 4, 5]
for num in numbers where num > 3 {
      print(num)
}


fallthrough (switch - case 문)

- Swift는 일치하는 case문을 만나면 자동으로 빠져나옴

- case별로 빠져 나가지 않고 아래로 계속 내려가게 하려면 fallthrough 문 사용

예시코드

var value = 4

switch value {
case 4:
    print("4")
    fallthrough
case 3:
    print("3")
    fallthrough
case 2:
    print("2")
    fallthrough
default:
    print("1")
}

결과
4
3
2
1


옵셔널(Optional)

- swift에서 값이 있을 수도 있고 없을 수도 있는(가능성) 변수나 상수를 다루기 위해 사용함

※ nil : 값이 없음을 뜻함 (다른 언어의 Null은 0을 반환함)

- Swift에서 기본 자료형(Int, Double, String 등)은 nil값을 저장할 수 없음

- nil을 저장하려면 옵셔널 타입으로 선언해야 함

- 옵셔널 타입 변수를 선언하기 위해서는 타입 선언부 뒤에 “?” 문자를 씀

  • 주의 : 변수명 뒤에 “?”하는 것 아님

예제코드

var x : Int? // ?를 넣지 않으면 에러가 남
x = 10
var y = x! + 1 // !를 사용하지 않으면 에러가 남 (!로 강제 언래핑)
print (x, y) // Optional(10) 이 출력됨

결과
Optional(10) 11

※ 값이 nil인데 강제로 (!를 사용하면) 출력을 하면 에러


옵셔널 타입 강제 언래핑(forced unwrapping) 1

- 옵셔널 활용 부분

중요!

예시 코드

var x : Int?

if x != nil { // 띄어쓰기 주의!
// 여기서 띄지 않고 붙여서 x!=nil로 사용하면 x! = nil이 된다
    print (x!)
} else {
    print ("nil")
}

옵셔널 타입 강제 언래핑(forced unwrapping) 2 : optional binding

- 옵셔널 타입의 변수나 상수에 값이 있을 때만 안전하게 그 값을 사용하는 방법

예시 코드

var x: Int?
x = 10

if let xx = x { // if let xx 로 생략해서 사용 가능
    print(x, xx)
} else {
    print("nil")
}
// 옵셔널 변수 x가 값(10)이 있으므로 언래핑해서 일반 상수 xx에 대입하고 if문 실행

결과
Optional(10) 10

var x1: Int?

if let xx = x1 { // 옵셔널 변수 x1이 값이 없어서 if문의 조건이 거짓이 되어 if문 실행하지 않고 else로 감
    print(xx)
} else {
    print("nil")
}

결과
Optional(10) 10


※ 콤마를 사용하여 여러 옵셔널 변수를 한번에 언래핑 할 수 있다

예시 코드

var pet1: String?
var pet2: String?

pet1 = "cat"
pet2 = "dog"

if let firstPet = pet1, let secondPet = pet2 { // 콤마사용 (pet1, pet2로 생략 가능)
    print(firstPet, secondPet)
} else {
    print("nil")
}

두 가지 Optional 타입

- 옵셔널이 항상 유효한 값을 가질 경우 암묵적인 언래핑(implicitly unwrapped) 옵셔널로 선언할 수도 있음 (선언부에 물음표(?) 대신에 느낌표(!)를 사용)


두 가지 Optional 형 : Int? vs Int!

Int? 옵셔널

let x : Int? = 1
let y : Int = x!
print(x!,y)
print(type(of: x!),type(of: y))

결과
1 1
Int Int

Int! 옵셔널

let a : Int! = 1 //Implicitly Unwrapped Optional (암시적 옵셔널) 
let b : Int = a //Optional로 사용할 수 없으면 자동으로 unwrap함
let c : Int = a! 
let d = a // 자료형이 정해져 있지 않은 상태에서는 Optional로 사용될 수 있음
let e = a + 1
print(a)
print(b)
print(c)
print(d)
print(e)

print("")

print(type(of: a))
print(type(of: b))
print(type(of: c))
print(type(of: d))
print(type(of: e))

결과
Optional(1)
1
1
Optional(1)
2
Optional<Int>
Int
Int
Optional<Int>
Int


nil-coalescing operator (nil병합연산자) : ??

- 옵셔널변수 ?? 는 값이 nil일 때 사용(변경)될 기본값을 지정해줌

- 옵셔널 변수의 값이 nil이면 ?? 다음 값으로 할당됨

예시 코드

var x : Int? // 여기서 x의 값을 초기화하지 않음
var y = x ?? 0 // x가 nil일 때의 값을 0으로 지정
print(x, y)

결과
nil 0

과제 : Optional (3), 3


(복습 끝) 함수와 메서드 (method)

함수

- 특정 작업을 수행하는 코드 블록

- 실행시 데이터를 제공해야 하거나, 함수를 호출한 코드에 작업한 결과를 반환할 수도 있음

swift에서 argument(인수) 와 parameter(파라미터)

https://docs.swift.org/swift-book/documentation/the-swift-programming-language/functions/


함수를 선언하는 방법

func <함수명> (<매개변수 이름>: <매개변수 타입>, <매개변수 이름>: <매개변수 타입>,... ) -> <반환값 타입> {
        // 함수 코드
}

- func ― 함수라는 것을 스위프트 컴파일러에게 알려주는키워드

- <함수명> ― 함수에 할당되는 이름

- <매개변수 이름> ― 함수 코드 내에서 참조되는 매개변수의 이름

- <매개변수 타입> ― 함수에 전달되는 매개변수의 타입

- <반환값 타입> ― 함수가 반환하는 결과에 대한 데이터 타입. 반환하지 않으면(Void) 반환값 타입(Void)과 ->는 생략 가능


◆ 매개변수를 받지 않으며 결과를 반환하지도 않고 오직 메시지만 출력

※ swfit는 다른 언어와 다르게 함수를 먼저 실행하고 밑에 정의해도 실행이 가능함

func sayHello() { //리턴값 없으면( -> Void ) 지정하지 않아도 됨
	print("Hello")
}
void sayHello() { //C, C++
	printf("Hello");
}

반환값이 Void 일 때만 생략 가능!

◆ 하나의 문자열과 하나의 정수를 매개변수로 받아서 문자열을 반환

func message(name: String, age: Int) -> String {
	return("\(name) \(age)")
}

과제 (변경 연습)
+ add 함수의 자료형은 (Int, Int) -> Int

func add(x : Int, y : Int) -> Int {
    return x + y
}
print(add(x:10, y:20))

var z = add(x:20, y:40)
print(z)

print("")

print(type(of:add))
print(type(of:z))

결과
30
60

(Int, Int) -> Int
Int


Swift 함수 실습(과제:매우 중요)
- and 함수의 type은?

+ 과제 : 4가지 add함수의 함수명

func add(x : Int, y : Int) -> Int {
    return x + y
}
print(add(x : 10, y :20))
print(type(of:add))

함수명 : add(x:y:)

// add함수의 타입 : (Int, Int) -> Int

  • 외부매개변수명(argument label) 생략하면
  • 내부매개변수명(parameter name)이 외부 매개변수명까지 겸함

func add(first x : Int, second y : Int) -> Int {

    return x + y
} 
print(add(first:10, second:20))
print(type(of:add))

함수명 : add(first:second:)

// add함수의 타입 : (Int, Int) -> Int

  • first 와 second 는 argument lable에 해당함 (외부 매개변수명, 호출)
  • x와 y는 parameter name에 해당함 (내부 매개변수명, 함수내부)

func add(_ x : Int, _ y : Int) -> Int {
    return(x + y)
}
print(add(10, 20)) // x와 y를 (레이블) 표시하지 않고 생략
print(type(of:add))

함수명 : add(_:_:)

// add함수의 타입 : (Int, Int) -> Int

  • 외부매개변수명 생략한다는 의미
  • 다른 언어처럼 호출 가능하지만 추천X


func add(_ x : Int, with y : Int) -> Int {
    return (x + y)
}
print(add(10, with : 20))
print(type(of:add))

함수명 : add(_:with:)

// add함수의 타입 : (Int, Int) -> Int

  • 첫번째 외부매개변수명만 생략하는 경우가 많음
  • Objective-C언어의 호출 방식이 이러함
  • 두번째 매개변수부터는 외부매개변수 사용
  • ※ 제일 많이 쓰는 방법

※ 함수의 type이 모두 같고, 함수명이 모두 다르다


함수명이 궁금할 때 : #function 리터럴(literal)

  • 함수명(외부매개변수명:외부매개변수명: ...)

예시코드

func add ( _ x : Int, with y : Int) -> Int {
    print (#function)
    return x + y
}
print(add(10, with : 20))

결과
add(_:with:)

중요!
- x와 y같은 매개변수 이름은 사용하지 않음
- 자료형(이름)도 사용하지 않음


함수명과 함수 자료형(type)

https://developer.apple.com/documentation/uikit/uitableviewdatasource

https://developer.apple.com/documentation/uikit/uitableviewdatasource

ChatGPT 과제

  • iOS 테이블뷰에서 많이 사용하는 메서드를 많이 사용하는 순서대로 나열하고 예를 들어 기능을 설명하고, 전체 메서드 이름과 메서드 자료형을 알려달라고 하기

    1. tableView(:cellForRowAt:)
    셀 구성: 각 행에 표시할 셀을 반환
    자료형: UITableViewCell

    2. tableView(
    :numberOfRowsInSection:)
    행 수 반환: 섹션 내의 행 수를 반환
    자료형: Int

    3. tableView(:didSelectRowAt:)
    행 선택 시 동작: 사용자가 특정 행을 선택할 때 호출
    자료형: Void

    4. numberOfSections(in:)
    섹션 수 반환: 테이블의 섹션 수를 반환
    자료형: Int

    5. tableView(
    :heightForRowAt:)
    셀 높이 설정: 각 행의 높이를 반환
    자료형: CGFloat

0개의 댓글