[스파르타 내일배움캠프 Swift]iOS 앱 개발 7기 6일차 - 2023. 07. 17

조재민·2023년 7월 18일
0

Swift

2014년 애플 세계 개발자 컨퍼런스(WWDC) 2014 에서 처음 발표된 애플의 독자적인 템플릿

Swift 의 특징

1. 안정성(Safe)

1). 타입에 엄격한 프로그래밍 언어

-문자열 배열에 다른 타입인 숫자 타입의 값을 입력할 수 없음
-타입 안정성을 위해 타입 체크를 해야함

2). nil(빈 값)에 엄격한 프로그래밍 언어

-Swift 컴파일러는 컴파일 시 문제가 발생할 수 있는 nil 객체를 만들거나 사용할 수 없도록 해야 함
-nil을 사용할 경우 '?' 모양의 옵셔널(Optional)을 이용하여 표시

2. 표현성(Expressive)

1). Swift는 표현성을 고려한 프로그래밍 언어

func greet(person: String, from hometown: String) -> String {
    return "안녕하세요 \(person)님! \(hometown)에서 오시느라 고생 많으셨습니다 🥹."
}

greet(person: "스코", from: "제주")

2). 다중 패러다임 프로그래밍 언어 지원

-명령형 프로그래밍 패러다임, 객체 지향 프로그래밍 패러다임, 함수형 프로그래밍 패러다임, 프로토콜 지향 프로그래밍 패러다임 지원

*Swift는 카멜 표기법(Camel case) 를 사용

  1. 카멜 표기법(Camel case)
    카멜 표기법(Camel case 카멜 케이스) 또는 낙타 표기법은 프로그래밍에서 파일, 변수, 함수 등 대상의 이름을 띄어쓰기 없이 짓기 위하여 따르는 관례인 네이밍컨벤션(Naming convention)의 하나

  2. 예시
    -올바른 예시
    camelCase(일반적인 변수 이름)
    isCamelCase(Boolean 타입의 변수 이름)
    -잘못된 예시
    camel_case(스네이크 표기법 형태로 지어진 변수명)

프로퍼티와 출력, 메서드

1) 할당 연산자 =

A=B
프로그래밍 언어에서 "B 값을 A에 할당한다." 는 의미

2)저장 프로퍼티

let

-변경할 수 없는 상수를 선언할 때 사용

var

-변경할 수 있는 변수를 선언할 때 사용

3) 연산 프로퍼티

var

-연산 프로퍼티는 그 때 그 때 계산한 값을 알려주기 때문에 변수를 나타내는 var를 사용하여 선언.
-매번 계산하기 때문에 값을 저장하지 않음

print()

-콘솔에 출력할 때 print() 함수를 사용하여 출력

print("Hello World 🌍") // 출력값: Hello World 🌍

한 줄 텍스트

"내용"을 사용하여 표현

var greeting = "Hello World 🌍"

멀티라인 텍스트

"""내용""" 을 사용하여 표현.

var greeting = """
							Hello 
							World 
							🌍 
							"""

문자 보간법

-문자 사이에 변수값을 넣고 싶을 때 "\( )"사용

let name = "정종"
var greeting = "Hello \(name)" //출력값: Hello 정종

주석

-한 줄의 주석을 작성할 때 : //

// 한 줄 주석

-여러 줄의 텍스트를 작성할 때 /* */ 사용

/*
여러줄
주석
입니다
*/

메서드

1) 메서드 기본 형태

func 메서드_이름(아규먼트_레이블: 파라미터_타입 -> 리턴_타입 {//...코드
}

func sayHi(friend: String) {
print("Hi~ \(friend)!")
}
sayHi(friend: "영호")

func sayHi(to friend: String) {
print("Hi~\(friend)!")
}
sayHi(to: "영호")

func sayHi(_ friend: String) {
  print("Hi~ \(friend)!")
}
sayHi("영호")

func sayHi(_ friend: String) -> String {
  return ("Hi~ \(friend)!")
}
print(sayHi("영호"))
// 출력값: Hi~ 영호!

func sayHi(_ friend: String = "철수") -> String {
  return ("Hi~ \(friend)!")
}
print(sayHi("영호"))
// 출력값: Hi~ 영호!
print(sayHi())
// 출력값: Hi~ 철수!

기본 데이터 타입과 큐&스택, 배열

1) 숫자

  • Int
    정수를 표현하는 데이터 타입

  • Float
    소수점을 표현하는 데이터 타입, 32비트 부동 소수를 표현할 수 있음
    Float의 정밀도는 소수점 이하 6자리까지 가능

var interestRate: Float = 1.2345678910 // Float 타입
print("이자율은 \(interestRate) % 입니다")
// 출력값: 이자율은 1.2345679 % 입니다
  • Double
    소수점을 표현하는 데이터 타입, 64비트 부동소수를 표현할 수 있음
    Double의 정밀도는 소수점 이하 15자리 이상 가능
    두 유형 모두 적합한 상황에서 Double 을 사용하는 것이 좋음
var interestRate: Double = 1.2345678910123456789 // Double 타입
print("이자율은 \(interestRate) % 입니다")
// 출력값: 이자율은 1.2345678910123457 % 입니다

2) 참 혹은 거짓

  • Bool
    true 와 false를 표현할 수 있는 데이터 타입

3) 문자

  • String
    문자열을 표현하는 데이터 타입, 텍스트를 표현할 수 있음
var emptyString: String = "" 
var anotherEmptyString = String()  

var variableString = "Horse"
variableString += " and carriage"
print(variableString)
// 출력값: "Horse and carriage"
  • Character
    하나의 문자를 표현하는 데이터 타입
코드를 입력let catCharacters: [Character] = ["S", "a", "y", "H", "i", "!"]
let catString = String(catCharacters)
print(catString)
// Prints "SayHi!"하세요

4) 다양한 값의 묶음

  • Tuple
    여러 값을 하나로 그룹화한 값
    관련 값의 단순한 그룹에 유용함, 복잡한 데이터 구조를 만드는 데는 적합하지 않음

5) 모든 타입

  • Any
    다양한 데이터 타입의 값을 수용할 수 있음
    배열을 만들면 특정 타입의 배열이 아니라 여러 타입을 담을 수 있음
    데이터 형을 대입하려면 반드시 형 변환이 필요함
var anyArray: [Any] = [1,"Hi", true]

var anyValue: Any = 1000
anyValue = "어떤 타입도 수용 가능"
anyValue = 12345.67

// 컴파일 에러
let doubleValue: Double = anyValue  // 🚨 에러 메시지: Cannot convert value of type 'Any' to specified type 'Double'
// Any 타입에 Double 값을 넣는 것은 가능하지만
// Any는 Double 과 엄연히 다른 타입이 때문에
// Double 타입의 값에 Any 타입의 값을 할당할 때에는 명시적으로 타입을 변환해 주어야 합니다.

6) Queue

First-In-First-Out (FIFO)
먼저 들어온 값을 먼저 내보내는 구조

7) Stack

Last-In-First-Out(LIFO)

8) 배열

Array의 특징

인덱스(index)의 0부터 시작함
처음에 초기화할 때 배열의 길이를 미리 지정하지 않아도 됌

// 생성자로 배열 만들기
var ages = Array<Int>()
print(ages)
// 출력값: []
var numbers = [Int]()
print(numbers)
// 출력값: []
var zeroes = [Int](repeating: 0, count: 10)
print(zeroes)
// 출력값: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

// 배열의 원소 개수
numbers = [5,6]
print("numbers 배열에 있는 value 개수는 \(numbers.count) 개 입니다")
// 출력값: "numbers 배열에 있는 value 개수는 1 개 입니다

// 배열 마지막에 value 추가하기
numbers.append(3)
// 현재 numbers = [5,6,3]

numbers[0] = 9
// 현재 numbers = [9,6,3]

numbers.insert(5, at: 1)
// 현재 numbers = [9,5,6,3]

let secondValue = numbers.remove(at: 1)
// 현재 numbers = [9,6,3]
// secondValue = 5

let lastValue = numbers.removeLast()
// 현재 numbers = [9,6]
// lastValue = 3

let firstValue = numbers.removeFirst()
// 현재 numbers = [6]
// firstValue = 9

// numbers 배열이 비었는지 확인
let isNoNumber = numbers.isEmpty
// isNoNumber = false

numbers.removeAll()
// 현재 numbers = []

// 배열 초기화
numbers = []
// 현재 numbers = []

세트, 딕셔너리, 열거형

1) Set

세트(Set)

  • 집합을 생각하면 됌
  • 순서를 정의하지 않고 동일한 타입의 값을 저장함
  • 항목의 순서가 중요하지 않거나 항복이 한 번만 표시되도록 해야 하는 경우 배열 대신 집합을 사용할 수 있음
  • 세트 안에 있는 모든 값을 고유해야하므로 중복을 허용하지 않음
var letters = Set<String>()
// 값 넣기
letters.insert("Classical Music")

// 초기화
letters = []

var favoriteGenres: Set<String> = ["Rock", "Classical", "Hip hop"]
favoriteGenres = ["Rock", "Classical", "Hip hop"]

let oddDigits: Set = [1, 3, 5, 7, 9]
let evenDigits: Set = [0, 2, 4, 6, 8]
let singleDigitPrimeNumbers: Set = [2, 3, 5, 7]

// 합집합
oddDigits.union(evenDigits).sorted()
// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

// 교집합
oddDigits.intersection(evenDigits).sorted()
// []

// 차집합
oddDigits.subtracting(singleDigitPrimeNumbers).sorted()
// [1, 9]

// 대칭 차집합
oddDigits.symmetricDifference(singleDigitPrimeNumbers).sorted()
// [1, 2, 9]

2) Dictionary

딕셔너리(Dictionary)

  • 사전을 생각하면 됌
  • 순서를 정의하지 않고 같은 타입의 key와 같은 타입의 value를 저장함
    -key는 중복될 수 없음
    -모든 key는 같은 타입이어야 함
    -모든 value는 같은 타입이어야 함
    -key와 value는 다른 타입이어도 됌
  • 실물 사전을 찾는 것처럼 순서가 아닌 식별자 기준으로 값을 찾을 때 사용
var namesOfIntegers: [Int: String] = [:]

namesOfIntegers[16] = "sixteen"

// 초기화
namesOfIntegers = [:]

var airports: [String: String] = ["YYZ": "Toronto Pearson", "DUB": "Dublin"]

airports["APL"] = "Apple International"
// airports = ["YYZ": "Toronto Pearson", "DUB": "Dublin", "APL": "Apple International"]

// key에 매칭된 value 값 초기화
airports["APL"] = nil

// 딕셔너리 airports에 있는 값의 수
print(airports.count)
// 출력값: 2

// 딕셔너리 airports에 있는 모든 key들
print(airports.keys)
// ["YYZ", "DUB"]

// 해당 key가 있다면 value를 덮어쓰고, 덮어쓰기 전 기존값울 반환
let newYyz = airports.updateValue("Hello YYZ", forKey: "YYZ") 
           
print(newYyz) // 출력값: Optional("Toronto Pearson")
print(airports["YYZ"]) // 출력값: Optional("Hello YYZ")

// 해당 key가 없다면 그 key에 해당하는 value에 값을 추가하고 nil을 반환
let newApl = airports.updateValue("Hello APL", forKey: "APL") 

print(newApl) // 출력값: nil
print(airports["APL"]) // 출력값: Optional("Hello APL")

3) Enum

열거형(Enum)

  • 관련된 값으로 이뤄진 그룹을 같은 타입으로 선언해 타입 안전성을 보장하는 방법으로 코드를 다룰 수 있게 해줌
enum CompassPoint {
    case north
    case south
    case east
    case west
}

// 한 케이스 선언 방법
var directionToHead = CompassPoint.west
directionToHead = .east

// 활용 예시 1
directionToHead = .south
switch directionToHead {
case .north:
    print("북쪽")
case .south:
    print("남쪽")
case .east:
    print("동쪽")
case .west:
    print("서쪽")
}
// 출력값: "남쪽"

// allCases 
enum Beverage: CaseIterable {
    case coffee, tea, juice
}
let numberOfChoices = Beverage.allCases.count
print("\(numberOfChoices) 잔 주문 가능합니다.")
// 출력값: 3잔 주문 가능합니다
profile
“누군가는 너를 사랑하고 있다.”

1개의 댓글

comment-user-thumbnail
2023년 7월 18일

좋은 글 잘 읽었습니다, 감사합니다.

답글 달기

관련 채용 정보