iOS프로그래밍실무 (03.14)
Swift에서 데이터 타입과 변수 선언
Swift에서 변수나 상수를 선언할 때, 그 데이터 타입을 명시할 수 있습니다. 데이터 타입은 변수에 저장할 수 있는 값의 종류를 정의하는 것으로, 예를 들어 숫자, 문자열, 불리언 값 등이 있습니다. Swift는 타입 추론(type inference)을 지원하여, 변수에 값을 할당하면 그 타입을 자동으로 추측합니다. 하지만 필요에 따라 명시적으로 타입을 선언할 수도 있습니다.
변수 선언 및 타입 추론
Swift에서는 변수를 선언할 때, 타입을 명시하지 않아도 초기 값에 따라 자동으로 타입을 추론합니다.
var myNumber = 10
변수 선언 시 명시적 타입 지정
때때로 명시적으로 데이터 타입을 지정해야 할 경우도 있습니다.
주요 데이터 타입
- Int: 정수형 (예: 10, -3, 500)
- Float: 32비트 부동소수점 숫자 (예: 3.14)
- Double: 64비트 부동소수점 숫자 (예: 3.1415926535)
- String: 문자열 (예: "Hello, Swift!")
- Bool: 불리언 (참 또는 거짓, 예: true, false)
- Character: 문자 하나 (예: "A")
- Void: 반환 값이 없는 함수의 반환 타입
변수 값 출력
변수의 값을 출력하려면 print() 함수를 사용할 수 있습니다.
var x: Int = 10
print(x) // 10 출력됨
https://developer.apple.com/documentation/swift/print(_:separator:terminator:)
print(_:separator:terminator:) | Apple Developer Documentation
Writes the textual representations of the given items into the standard output.
developer.apple.com
코드 작성 시 주의사항
코드를 작성할 때 = 연산자 양쪽에 공백을 일관되게 사용해야 합니다.
var x: Int=10 // 오류 발생
Swift에서 자료형 지정과 추론
Swift에서는 일반적으로 초깃값을 주지 않을 경우에만 자료형을 명시합니다. 초깃값이 있으면, Swift는 해당 변수나 상수의 자료형을 자동으로 추론합니다.
초깃값이 없을 경우 자료형 명시하기
초깃값이 제공되지 않으면, Swift는 해당 변수의 자료형을 알 수 없으므로 자료형을 명시적으로 지정해야 합니다.
var welcomeMessage: String // 자료형을 명시적으로 String으로 지정
초깃값이 있을 경우 자료형 추론
상수나 변수가 정의될 때 초깃값을 제공하면, Swift는 그 값을 바탕으로 자료형을 추론합니다.
let myAge = 25 // myAge가 Int형으로 자료형(타입) 추론됨
let pi = 3.141592 // pi는 Double형으로 추론됨
Swift에서 Int 데이터 타입
Swift에서 Int 데이터 타입은 정수 값을 저장하는 데 사용됩니다. 정수는 소수점 없이 양수, 음수, 0을 포함하는 값을 의미합니다. Swift는 부호 있는(signed) 정수뿐만 아니라 부호 없는(unsigned) 정수도 지원합니다.
Int와 관련된 주요 데이터 타입
- Int: 부호 있는 정수 (양수, 음수, 0을 포함)
- UInt: 부호 없는 정수 (양수와 0만 포함)
Int는 8비트, 16비트, 32비트, 64비트 크기의 정수 타입을 지원하지만, 애플은 Int 데이터 타입을 사용하는 것을 권장합니다. 이유는, Int는 실행되는 플랫폼에 맞는 정수 크기를 자동으로 선택하기 때문입니다.
Int 타입 사용 예시
변수나 상수에 Int 타입을 사용하여 정수 값을 저장할 수 있습니다.
var myAge: Int = 20 // Int 타입 변수 선언 (초깃값 20이 있으므로 자료형은 생략 가능)
print(myAge) // 출력: 20
Int32 타입의 최소값과 최대값
Swift에서는 각 정수 타입에 대해 최솟값과 최댓값을 확인할 수 있는 min과 max 속성을 제공합니다.
print("Int32 Min = \(Int32.min) Int32 Max = \(Int32.max)")
// 출력: Int32 Min = -2147483648 Int32 Max = 2147483647
Int형의 최소값과 최대값 출력하기
Int는 실행되는 플랫폼에 따라 32비트 또는 64비트 크기를 사용합니다. Int 타입의 최솟값과 최댓값을 확인하려면 Int.min과 Int.max를 사용합니다.
print("Int Min = \(Int.min) Int Max = \(Int.max)")
// Int.min이 -2147483648, Int.max는 2147483647
Swift에서 부동 소수점 데이터 타입: Double vs Float
Swift에서 부동 소수점 숫자(소수점이 있는 숫자)를 다루기 위해 Double과 Float라는 두 가지 데이터 타입을 제공합니다. 이 두 타입은 각각 정밀도와 메모리 사용량에서 차이를 보입니다.
부동 소수점 숫자란?
부동 소수점 숫자는 소수점이 있는 실수 값을 나타냅니다. 예를 들어, 1234.5는 부동 소수점 숫자입니다. 이 값은 정수가 아닌, 소수점 이하의 값을 포함하는 숫자입니다.
Double 타입
Double 타입은 배정도 (Double Precision) 부동 소수점 숫자를 저장하는 데 사용됩니다. 64비트로 숫자를 저장하며, 소수점 이하 15자리까지의 정밀도를 제공합니다.
Double 타입은 Swift에서 기본적인 부동 소수점 타입으로 사용됩니다.
Float 타입
Float 타입은 단정도 (Single Precision) 부동 소수점 숫자를 저장하는 데 사용됩니다. 32비트로 숫자를 저장하며, 소수점 이하 6자리까지의 정밀도를 제공합니다.
Double형이 기본
var myWeight: Double
var myWeight: Double = 58.5
var myWeight = 58.5 // Double 형
Swift에서 부울 데이터 타입: Bool
부울(Boolean) 데이터 타입은 조건을 처리하는 데 사용되는 데이터 타입으로, 참(true) 또는 거짓(false) 두 가지 값을 가질 수 있습니다. Bool 타입은 주로 조건문에서 사용되며, 프로그램의 흐름을 제어하는 데 중요한 역할을 합니다.
Bool 데이터 타입
Bool은 참(true) 또는 거짓(false) 값을 나타내는 데이터 타입입니다. 이를 통해 조건을 처리하고, 프로그램 내에서 참/거짓 판단을 할 수 있습니다.
Bool 타입 변수 선언
Bool 타입 변수는 true 또는 false 값을 저장합니다.
var orangesAreOrange: Bool = true
타입 추론을 통한 선언
초깃값이 주어지면 Swift는 타입을 자동으로 추론합니다. Bool 타입을 명시하지 않고 변수만 선언하고, 초깃값으로 true를 제공할 수 있습니다.
var orangesAreOrange: Bool // 초깃값 true가 있으므로 : Bool은 일반적으로 생략함
Swift에서 문자 데이터 타입: Character
Character 타입은 유니코드 문자 하나를 저장할 수 있는 데이터 타입입니다. 이 타입은 문자, 숫자, 문장 부호, 심볼 등 다양한 단일 문자를 저장할 때 사용됩니다.
Character 타입 선언
Character 타입 변수는 반드시 **작은 따옴표(')**로 문자를 감싸야 합니다. 주의할 점은 큰 따옴표(")는 String 타입을 나타내기 때문에 작은 따옴표만 사용해야 합니다.
var myChar1: Character = "X"
var myChar2: Character = ":"
유니코드를 이용한 문자 할당
유니코드를 사용하여 문자도 저장할 수 있습니다. 예를 들어, 유니코드 값 \u{0058}는 문자 'X'를 나타냅니다.
print(myChar4) // X
myChar4 = "\u{0263B}" // 다른 유니코드 문자 출력
print(myChar4) // 𠎻 (이 유니코드 문자 출력)
Character 생략 불가
Character 타입은 생략할 수 없으며, 만약 생략하면 기본적으로 String으로 처리됩니다.
print(type(of: myChar3)) // 출력: String
Swift에서 문자열 데이터 타입: String
String 타입은 여러 문자를 연속적으로 저장하는 데 사용됩니다. 단어나 문장, 심지어 특수 문자와 공백 등을 포함한 일련의 문자를 처리할 수 있습니다.
String 타입 변수 선언
String 타입 변수는 큰 따옴표(")로 감싼 문자열을 할당합니다. 주로 변수 선언 시 타입을 생략할 수 있습니다.
var age = 20 // 타입 추론으로 String을 사용
var message = "\(userName)의 나이는 \(age)입니다."
print(message) // "Kim의 나이는 20입니다."
문자열 보간 (String Interpolation)
Swift에서는 문자열 보간을 통해 문자열과 변수, 상수, 표현식, 함수 호출 등을 쉽게 결합할 수 있습니다.
var age = 20 // 타입 추론으로 String을 사용
var message = "\(userName)의 나이는 \(age)입니다."
print(message) // "Kim의 나이는 20입니다."
var age = 20
var message = "\(userName)의 나이는 \(age)입니다."
print(message) // "Kim의 나이는 20입니다."
특수 문자와 이스케이프 시퀀스
문자열 내에서 특정 제어 문자나 특수 문자를 나타내려면 이스케이프 시퀀스를 사용해야 합니다. 이스케이프 시퀀스는 역슬래시(\)를 앞에 붙여서 구별합니다.
이스케이프 시퀀스 예시
- \n - 개행 (new line)
- \t - 수평 탭 (tab)
- \\ - 역슬래시 (backslash)
- \" - 큰따옴표 (double quote)
- \u{nn} - 유니코드 문자
Swift에서 변수와 상수
Swift는 타입 안전(type safety) 언어로, 변수와 상수의 데이터 타입을 엄격하게 정의하여 코드의 안정성과 예측 가능성을 높여줍니다. **변수(variable)**와 **상수(constant)**는 데이터를 저장하는 데 사용되지만, 그 특성과 사용 방법에 차이가 있습니다. 이번 포스트에서는 변수와 상수의 차이점과 사용법에 대해 알아보겠습니다.
변수 (var)
변수는 값이 변경될 수 있는 데이터를 저장하는 데 사용됩니다. 변수를 선언할 때 var 키워드를 사용하며, 변수에 할당된 값은 언제든지 변경 가능합니다.
var myVariable = 10 // Int 타입 추론
이 코드는 myVariable이라는 변수를 선언하고, 그 값을 10으로 초기화합니다. 타입 어노테이션 없이 초기값을 제공하면 Swift가 타입을 타입 추론을 통해 자동으로 결정합니다.
여기서도 var를 사용하여 x, y, z를 모두 Double 타입으로 선언하고 초기화합니다. x, y, z의 타입은 Swift가 자동으로 추론합니다.
상수 (let)
상수는 한 번 값을 할당하면 이후에 값을 변경할 수 없는 데이터를 저장하는 데 사용됩니다. 상수를 선언할 때 let 키워드를 사용합니다. 값이 변경되지 않기 때문에, 코드에서 변경되지 않는 상수를 사용할 때 더 안전하고 효율적인 코드를 작성할 수 있습니다.
let maximumNumber = 10
변수와 상수의 사용 시 차이점
- 변수는 var 키워드를 이용하여 선언되며, 변수를 생성할 때에 값을 가지고 초기화할 수도 있습니다.
var userCount = 10
var userCount : Int? - 상수는 let 키워드를 사용하여 선언, 선언하는 시점에서 상수에 값이 할당되어 초기화되고,
할당된 값을 수정할 수 없습니다.
let maxUserCount = 20
maxUserCount = 30
error: cannot assign to value: 'maxUserCount' is a 'let' constant change 'let' to 'var' to make it mutable
애플은 코드의 효율성과 실행 성능을 높이기 위해서 변수(var)보다는 상수(let)를 사용하라고 권장합니다.
타입 어노테이션과 타입 추론
Swift에서는 변수나 상수를 선언할 때 명시적으로 **타입 어노테이션(type annotation)**을 사용할 수 있으며, 그렇지 않으면 **타입 추론(type inference)**을 사용하여 Swift가 자동으로 타입을 결정합니다.
var userCount: Int = 10 // 타입 어노테이션을 사용하여 Int로 선언
var signalStrength = 2.231 // 타입 추론으로 Double 타입으로 간주
let companyName = "My Company" // String 타입으로 추론
타입 어노테이션을 사용하면 코드에서 변수나 상수의 타입을 명확히 지정할 수 있지만, 타입 추론을 사용하면 코드가 간결해지고, Swift 컴파일러가 해당 값을 바탕으로 적절한 타입을 자동으로 결정합니다.
상수의 값 할당
상수에 값을 할당할 때는 값을 한 번만 할당할 수 있습니다. 이후에 값을 변경하려고 하면 구문 오류가 발생합니다.
var book = true
if book {
bookTitle = "iOS"
} else {
bookTitle = "Android"
}
print(bookTitle) // "iOS" 또는 "Android" 출력
상수에는 값을 한 번만 할당, 이미 값이 할당된 상수에 다시 값을 할당하려고 시도한다면 구문 에러(syntax error)가 발생합니다.
Swift에서 튜플(Tuple)
튜플(Tuple)은 Swift에서 여러 값을 하나의 개체로 묶을 수 있는 매우 강력한 데이터 구조입니다. 튜플을 사용하면 서로 다른 데이터 타입을 한 번에 다룰 수 있으며, 다양한 데이터를 효율적으로 그룹화할 수 있습니다.
튜플의 기본 개념
- 튜플은 여러 값을 하나의 값처럼 묶을 수 있는 방법입니다.
- 다양한 타입의 데이터를 하나의 튜플로 묶을 수 있습니다.
- 튜플의 값들은 인덱스를 사용하여 접근할 수 있으며, 값들이 반드시 같은 타입일 필요는 없습니다.
튜플 값 접근하기
튜플의 요소에 접근하는 방법은 인덱스를 사용하는 방법이 있습니다.
let myTuple = (10, 12.1, "Hi")
var myString = myTuple.2
print(myString) // Hi
튜플(Tuple) 실습
튜플은 여러 값을 하나의 값으로 묶을 수 있는 Swift의 매우 강력한 기능입니다. 이번 실습에서는 튜플을 다양한 방식으로 다뤄보겠습니다.
튜플의 모든 값을 추출하여 변수 또는 상수에 할당하기
튜플에 저장된 값을 여러 개의 변수 또는 상수에 한 번에 할당할 수 있습니다.
let myTuple = (10, 12.1, "Hi") // 튜플 선언
let (myInt, myFloat, myString) = myTuple // 튜플의 값들을 변수에 할당
print(myInt) // 10
print(myFloat) // 12.1
print(myString) // Hi
튜플 값 선택적으로 추출하기
튜플에서 값을 선택적으로 추출할 수 있습니다. 값을 무시하려면 밑줄 _을 사용하면 됩니다.
var (myInt, _, myString) = myTuple // 두 번째 값인 12.1은 무시됨
print(myInt) // 10
print(myString) // Hi
튜플 값에 이름 할당하기
튜플을 선언할 때 각 값에 이름을 할당하여 보다 직관적으로 다룰 수 있습니다.
let myTuple = (count: 10, length: 12.1, message: "Hi") // 각 값에 이름을 할당
print(myTuple.count) // 10
print(myTuple.length) // 12.1
print(myTuple.message) // Hi
튜플 값 출력하기
튜플의 값을 출력할 때, 이름을 사용하여 접근하거나 인덱스를 사용하여 접근할 수 있습니다.
print(myTuple.message) // Hi
print(myTuple.2) // Hi
튜플을 함수에서 반환하기
튜플은 함수에서 여러 값을 동시에 반환할 때 유용하게 사용됩니다. 예를 들어, 함수에서 여러 값을 반환할 때 튜플을 사용하여 한 번에 반환할 수 있습니다.
return ("Alice", 30)
}
let details = getPersonDetails()
print(details.0) // Alice
print(details.1) // 30

옵셔널 타입 강제 언래핑(forced unwrapping)
옵셔널 변수에 값이 있으면 옵셔널로 "래핑되었다(wrapped)"고 합니다.
래핑된 값은 풀어서(unwrapping) 사용합니다
가장 쉬운 방법은 강제 언래핑(forced unwrapping)
var x: Int? // 옵셔널 정수형 변수 x 선언
var y: Int = 0
x = 10 // x에 값 할당
print(x) // 출력: Optional(10) (옵셔널로 래핑된 값)
print(x!) // 강제 언래핑을 통해 10 출력
print(y) // 출력: 0
//x = x + 2 // 오류 발생
//y = x // 오류 발생
옵셔널 타입 강제 언래핑(forced unwrapping) optional binding
강제 언래핑하는 다른 방법으로, 옵셔널 바인딩(optional binding)을 이용하여 옵셔널에 할당된 값을 임시 변수 또는 상수에 할당됩니다.
if let constantName = optionalName{
//옵셔널 변수가 값이 있다면 언래핑해서 일반 상수 constantName에 대입하고 if문 실행 //값이 없다면 if문의 조건이 거짓이 되어 if문을 실행하지 않습니다.
}
if var variableName = optionalName {
//옵셔널 변수가 값이 있다면 언래핑해서 일반 변수 varibleName에 대입하고 if문 실행 //값이 없다면 if문의 조건이 거짓이 되어 if문을 실행하지 않습니다.
}
Nil-Coalescing Operator (Nil합병연산자) ??
옵셔널변수 ?? nil일 때 할당되는 값
옵셔널 변수의 값이 nil이면 ?? 다음 값으로 할됩니다.
https://developer.apple.com/documentation/swift/string
String | Apple Developer Documentation
A Unicode string value that is a collection of characters.
developer.apple.com
옵셔널 바인딩 : if let vs. guard let~else
함수 내부에서 옵셔널 바인딩할 때는 if let보다는 guard let~else을 사용하는 것이 더 가독성이 좋은 소스를 만들 수 있습니다.
암묵적인 언래핑(implicitly unwrapped) 옵셔널
옵셔널이 항상 유효한 값을 가질 경우 옵셔널이 암묵적인 언래핑(implicitly unwrapped)이 되도록 선언할 수도 있습니다.
클래스의 아웃렛 변수 초기화에서 많이 사용(자동 생성되는 코드)
강제 언래핑이나 옵셔널 바인딩을 하지 않아도 값에 접근할 수 있음 암묵적인 언래핑으로 옵셔널을 선언하기 위해서는 선언부에 물음표(?) 대신에 느낌표(!)를 사용합니다.
var x : Int? //옵셔널 변수 선언방법 1
var y : Int! //옵셔널 변수 선언방법 2, 암묵적인 언래핑(implicitly unwrapped) 옵셔널
https://docs.swift.org/swift-book/documentation/the-swift-programming-language/thebasics/
Documentation
docs.swift.org
두 가지 Optional 형 : Int? vs Int
Int!형을 property로 갖는 클래스
왜 옵셔널을 사용하나요?
옵셔널 타입은 값을 갖지 않는다는 의미의 nil 값을 가질 수 있습니다.
옵셔널 변수에 nil을 할당하면 값이 없는(valueless state) 상태입니다.
옵셔널이 아닌 변수나 상수에는 nil을 할당할 수 없습니다.
var myInt = nil // error
var myInt : Int? = nil // OK
var myInt : Int? // OK, 위와 같은 코드
옵셔널 변수는 초기화하지 않으면 자동으로 nil로 초기화
var myString : String = nil // error
let myConstant = nil // error, 옵셔널 형을 지정해야됩니다.
nil이란?
nil은 값이 없다는 의미를 나타냅니다. Swift에서는 옵셔널 변수에 nil을 할당하여 해당 변수에 값이 없음을 명시적으로 표시할 수 있습니다. 옵셔널은 값이 없을 수도 있는 변수나 상수를 처리하는 데 매우 유용하며, 이는 프로그램에서 오류를 예방하고 안전하게 값을 다룰 수 있게 합니다.
옵셔널 타입과 nil
옵셔널 변수는 ? 또는 !를 사용하여 선언합니다. 이러한 변수를 사용하면, 해당 변수에 값이 없을 때 nil을 할당할 수 있습니다.
- var x: Int : 항상 값이 존재하는 일반적인 변수
- var y: Int? : 옵셔널 변수, 값이 없을 수도 있음
- var z: Int! : 옵셔널 변수, 값이 없을 수도 있지만 암시적으로 안전하게 강제 언래핑될 수 있음
이와 같은 방식으로 옵셔널 타입을 선언하면, 해당 변수는 값이 없을 수도 있다는 상태를 나타냅니다.
옵셔널 변수의 초기화
옵셔널 변수에 값이 할당되지 않으면 기본적으로 nil이 할당됩니다. 예를 들어, var y: Int?와 같은 옵셔널 변수는 초기화하지 않으면 자동으로 nil이 들어가며, 이를 통해 값이 없는 상태임을 명확히 할 수 있습니다.
var y: Int? // 옵셔널 변수 선언, 초기 값은 nil
var z: Int! // 암시적 옵셔널 변수, 초기 값은 nil
nil의 활용
옵셔널 변수에 nil을 할당하여 변수에 값이 없음을 명확하게 표현할 수 있습니다. nil을 사용하여 값이 존재하지 않음을 처리하고, 나중에 이 값이 있을 때만 안전하게 사용할 수 있습니다.
var myNumber: Int? = nil // 값이 없는 상태로 초기화
옵셔널은 연관 값(associated value)을 갖는 enum
https://developer.apple.com/documentation/swift/optional
Optional | Apple Developer Documentation
A type that represents either a wrapped value or the absence of a value.
developer.apple.com
Swift의 Any와 AnyObject: 타입을 다루는 두 가지 방식
Swift에서는 다양한 타입을 다루기 위해 Any와 AnyObject라는 두 가지 중요한 개념을 제공합니다. 이 두 타입은 특정 타입에 구애받지 않고 다양한 객체를 처리할 수 있는 강력한 기능을 제공합니다. 이번 포스트에서는 Any와 AnyObject의 차이점과 사용법을 살펴보겠습니다.
AnyObject
AnyObject는 Swift에서 모든 클래스 타입의 인스턴스를 표현할 수 있는 프로토콜입니다. 이 프로토콜은 범용 타입으로서, 클래스만 허용하고 구조체나 열거형 타입은 허용하지 않습니다.
주요 특징:
- 클래스만 허용: AnyObject는 오직 클래스 타입의 객체만 저장할 수 있습니다.
- 타입 캐스팅 가능: 클래스 인스턴스를 저장할 수 있지만, 상속 관계가 아니라도 타입 캐스팅이 가능합니다.
- 객체 저장: 클래스의 객체를 저장하고 처리하는 데 유용합니다.
- 가장 추상화된 최상위 개념: Obj-C에서의 id와 유사한 역할을 합니다.
Any
Any는 AnyObject보다 더 범용적인 타입입니다. Any는 어떤 타입의 인스턴스든 표현할 수 있으며, 클래스, 구조체, 열거형, 함수 타입 등 모든 타입을 포함합니다.
주요 특징:
- 모든 타입 허용: Any는 클래스는 물론, 구조체, 열거형, 함수 타입 등 모든 타입을 포함할 수 있습니다.
- 타입에 구애받지 않음: Any는 특정한 타입에 구애받지 않으므로 다양한 데이터 타입을 처리할 수 있습니다.
The Swift Programming Language: Redirect
docs.swift.org
대입 연산자
왼쪽에 있는 피연산자는 값이 할당되는 변수 또는 상수이며, 오른쪽에 있는 피연산자는 할당할 값입니다.
오른쪽 피연산자는 주로 산술식 또는 논리식을 수행하는 표현식이며, 그 결과는 왼쪽 피연산자인 변수나 상수에 할당됩니다.
var x: Int? // 옵셔널 Int 변수를 선언
var y = 10 // 일반 Int 변수를 선언하고 초기화
x = 10 // 값을 x에 할당 (Optional(10))
x = x! + y // x는 옵셔널이므로, 강제 언래핑한 후 y와 더하여 x에 할당 (Optional(20))
x = y // y의 값을 x에 할당 (x는 Optional(10))
https://docs.swift.org/swift-book/documentation/the-swift-programming-language/basicoperators/
Documentation
docs.swift.org
산술 연산자
보통 두 개의 피연산자를 받는 이항(binary) 연산자
값이 음수임을 가리키는 단항 마이너스 연산자(unary negative operator)인 ‘ - ’
var x = -10 // 변수 x에-10을 할당하기 위해 사용되는 단항 - 연산자
- (단항) 변수 또는 표현식의 값을 음수로 만듦 니다.
* 곱셈
/ 나눗셈
+ 덧셈
- 뺄셈
%나머지
연산 하나의 표현식에 여러 개의 연산자를 사용할 수 있습니다.
x = y * 10 + z - 5 / 4
복합 대입 연산자
x += y // x와 y를 더하고 그 결과를 x에 할당
x -= y // x에서 y를 빼고 그 결과를 x에 할당
x *= y // x와 y를 곱하고 그 결과를 x에 할당
x /= y // x를 y로 나누고 그 결과를 x에 할당
x %= y // x를 y로 나눈 나머지를 x에 할당
x &= y // x와 y의 bit AND 연산 결과를 x에 할당
x |= y x // x와 y의 bit OR 연산 결과를 x에 할당
증가 연산자(++)와 감소 연산자(--)
x = x + 1 // x 변수의 값을 1 증가시킴
x = x - 1 // x 변수의 값을 1 감소시킴
이러한 방법 대신 ++ 연산자와--연산자를 사용할 수도 있었습니다.
x++ // x를 1 증가시킴, Swift 3에서 없어짐, x+=1
x-- // x를 1 감소시킴, Swift 3에서 없어짐, x-=1
비교 연산자
비교의 결과로 불리언(Boolean) 값을 반환
var result: Bool?
var x = 10
var y = 20
result = x < y //true
x == y // x와 y가 같다면 true를 반환
x > y // x가 y보다 크면 true를 반환
x >= y // x가 y보다 크거나 같다면 true를 반환
x < y // x가 y보다 작다면 true를 반환
x <= y // x가 y보다 작거나 같다면 true를 반환
x != y // x와 y가 같지 않다면 true를 반환
==는 값이 같은가?
===는 동일한 메모리 주소인가?
https://developer.apple.com/documentation/swift/===(_:_:)
===(_:_:) | Apple Developer Documentation
There's never been a better time to develop for Apple platforms.
developer.apple.com
논리 연산자
NOT(!), AND(&&), OR(||)와 XOR(^)
NOT(!) 연산자는 불리언 값 또는 표현식의 결과를 현재와반대로 바꾸어줍니다.
var flag = true // 변수는 참
var secondFlag = !flag // secondFlag는 거짓
OR(||) 연산자는 두 개의 피연산자 중에 하나라도 참이면 참(true), 두 개 모두 거짓이면 거짓(false)을 반환됩니다.
범위 연산자
닫힌 범위 연산자(closed range operator)
x...y
- x에서 시작하여 y로 끝나는 범위에 포함된 숫자
5...8
- 5, 6, 7, 8
반 열린 범위 연산자(half-open range operator)
x..<y
- x부터 시작하여 y가 포함되지 않는 모든 숫자
5..<8
- 5, 6, 7
One-Sided Ranges
삼항 연산자 ?
비교 연산을 빠르게 하기 위해 삼항 연산자(ternary operator)를 지원
[조건] ? [참 표현식] : [거짓 표현식]
삼항 연산자는 [조건] 부분을 계산하여 참(true) 혹은 거짓(false)을 확인하여
결과가 참이면 [참 표현식] 부분이 실행되며, 거짓이면 [거짓 표현식] 부분을 수행합니다.
- var x = 1
- var y = 2
- print("더 큰 값은 \(x > y ? x : y)")
nil-Coalescing Operator (nil합병연산자) ??
옵셔널변수 ?? nil일 때 할당되는 값
옵셔널 변수의 값이 nil이면 ?? 다음 값으로 할당됨
옵셔널 변수의 값이 nil이 아니면 언래핑된 값이 나옴
let defaultColor = "black"
var userDefinedColor: String? // defaults to nil
var myColor = userDefinedColor ?? defaultColor
//nil이므로 defaultColor인 black으로 할당됨
print(myColor) //black
userDefinedColor = "red"
myColor = userDefinedColor ?? defaultColor
//nil이 아니므로 원래 값인 red가 할당됨
print(myColor) //red, 주의 optional(red)가 아님
https://en.wikipedia.org/wiki/Class_(computer_programming)
Class (computer programming) - Wikipedia
From Wikipedia, the free encyclopedia Specification of an object In object-oriented programming, a class defines the shared aspects of objects created from the class. The capabilities of a class differ between programming languages, but generally the share
en.wikipedia.org
타입 검사 : is
타입 검사(type check)
let x = 1
if x is Int {
print("Int형")
}
객체가 MyClass라는 이름의 클래스의 인스턴스인지 검사
인스턴스가 해당 클래스인가?
인스턴스 is 클래스
if myobject is MyClass {
// myobject는 MyClass의 인스턴스이다
}
class A {}
let a = A()
if a is A{
print("Yes")
}
연산자의우선순위와결합성
https://docs.swift.org/swift-book/documentation/the-swift-programming-language/advancedoperators/
Documentation
docs.swift.org
https://developer.apple.com/documentation/swift/===(_:_:)
===(_:_:) | Apple Developer Documentation
There's never been a better time to develop for Apple platforms.
developer.apple.com
https://developer.apple.com/documentation/accelerate/simd
simd | Apple Developer Documentation
Perform computations on small vectors and matrices.
developer.apple.com
for-in 반복문
for-in 반복문은 컬렉션 또는 숫자 범위 내에 있는 목록을 반복
for 상수명 in 컬렉션 또는 범위 {
// 실행될 코드
}
‘상수명’은 반복문이 돌면서 컬렉션 또는 범위에서 가져온 항목을 담게
될 상수
for 문 다음의 실행 코드가 한 줄이라도 괄호({})를 필수적으로 사용
‘컬렉션 또는 범위’는 반복문이 반복되면서 현재의 항목을 참조
문자열 값들의 배열이거나 범위 연산, 문자들로 구성된 문자열일 수 있습니다.
for index in 1...5 {
print(index)
}
index에 현재 항목이 할당
배열의 항목 접근
https://docs.swift.org/swift-book/documentation/the-swift-programming-language/collectiontypes/
Documentation
docs.swift.org
for 반복문은 몇 번 정도 반복해야 할지를 이미 아는 경우에 사용하기 적합
어떠한 조건이 되기 전에 대체 몇 번 정도 반복해야 할지를 알 수는 없지만 그 조건을 만족할 때까지는 반복해야 하는 경우 while 반복문 사용
지정된 조건을 만족할 때까지 작업을 반복
while 조건식 {
// 반복 코드
}
myCount 변수가 1000보다 크지 않을 때까지 반복, 1000이 되는 시점에 반복문이 종료
swift 1.x의 do … while 반복문을 대신하는 문
repeat … while 반복문의 몸체는 적어도 한번은 실행
반복문이 완료되는 조건 전에 반복문을 빠져나오기
특히 무한 루프를 생성할 경우
현재의 반복문에서 빠져나와서 반복문 바로 다음에 있는 코드를 실행
continue 문은 반복문에서 continue문 이후의 모든 코드를 건너뛰고 반복문의 상단 시작 위치로 돌아갑니다.
if문
if 불리언 표현식 {
// 불리언 표현식이 참일 경우 수행될 코드
}
다른 프로그래밍 언어들과는 다르게, 스위프트에서는 if 문 다음의 실행 코드가 한 줄이라도 괄호({})를 필수적으로 사용
기본적으로 ‘불리언 표현식’이 참(true)으로 판단되면 괄호로 감싸인 코드 실행
‘불리언 표현식’이 거짓(false)이면 괄호로 감싸인 코드는 건너뜀
if~else문
if 문의 표현식이 거짓(false)일 경우에도 수행될 코드를 else에 작성
if 불리언 표현식 {
// 표현식이 참일 경우 실행되는 코드
} else {
// 표현식이 거짓일 경우 실행되는 코드
}
다중 if-else문
다양한 조건을 바탕으로 결정해야 할 때 다중 if-else구문을 사용
다중 if-else문 : BMI 계산 결과 판정
guard문(조건식이 거짓이면 실행)
guard문은 swift 2에 도입된 구문
guard문은 표현식이 거짓(false)으로 판단될 경우에 수행될 else 절을 반드시 포함해야 합니다.
else 절에 속한 코드는 현재의 코드 흐름을 빠져 나갈 수 있는 구문(return, break, continue, throw 구문)을
반드시 포함해야 합니다.
또는 다른 함수를 else 코드 블록 안에서 호출할 수도 있습니다.
guard <불리언 표현식> else {
// 표현식이 거짓일 경우에 실행될 코드
<코드 블록을 빠져 나갈 구문>
}
// 표현식이 참일 경우에 실행되는 코드는 이곳에 위치
guard문은 기본적으로 특정 조건에 맞지 않을 경우에 현재의 함수나 반복문에서 빠져 나갈 수있도록 하는 ‘조기 출구(early exit)’ 전략을 제공
guard~let의 활용
guard는 return, break, continue, throw 등 제어문 전환 키워드를 쓸 수 있는 상황이라면 사용이 가능합니다.
그래서 함수 뿐 아니라 반복문 등 특정 블록 내부에 있으면 사용 가능합니다.
물론 함수 내부에 있다면 보통 return을 써서 해당 함수를 조기에 빠져나오는 조기 출구 용도로 사용
실제 앱을 만들다 보면 옵셔널 바인딩 때문에 다중 if~else를 사용해야 하는데, guard~let을 사용하면 다중 루프 없는 훨씬 가독성이 좋은 코드가 가능해서 그런 경우 많이 사용
if~let vs. guard~let
guard let~else로옵셔널바인딩
언래핑된number변수를guard문밖에있는코드가사용할수있습니다.
if문을이용하여언래핑된변수는그렇게못합니다.
switch-case문
switch 표현식
{
case match1:
구문
case match2:
구문
case match3, match4:
구문
default:
구문
}
switch-case문예제
switch-case문 주의 사항
switch-case문 결합하기 : 콤마 사용
여러 가지 다른 경우에 대해서 동일한 코드를 실행해야 할 경우 실행될 공통 코드로 그룹 case 문을 만들 수 있습니다.
switch-case문에서의범위지정매칭
switch-case에서 where절 사용하기
where절을 switch case에 부가적인 조건을 추가하기 위하여 사용
값이 속하는 범위뿐만 아니라 그 숫자가 홀수인지 짝수인지도 검사
where : 조건을 추가
특정 패턴과 결합하여 조건을 추가
fallthrough
C/C++, objective-C와 달리 case문 다음에 break 문을 포함할 필요가 없습니다.
Swift는 일치하는 case문을 만나면 자동으로 빠져나옴
case별로 빠져 나가지 않고 아래로 계속 내려가게 하려면 fallthrough 문 사용
함수
특정 작업을 수행하는 코드 블록
수행하기 위하여 데이터가 제공될 수 있으며, 함수를 호출한 코드에 작업한 결과를 반환할 수도 있습니다.
매개변수(parameter,인자)와 인수(argument)는 차이점이 있습니다.
https://en.wikipedia.org/wiki/Parameter_(computer_programming)
Parameter (computer programming) - Wikipedia
From Wikipedia, the free encyclopedia Input provided to a function/subroutine In computer programming, a parameter or a formal argument is a special kind of variable used in a subroutine to refer to one of the pieces of data provided as input to the subrou
en.wikipedia.org
함수 정의부의 값을 매개변수, 호출시의 값은 아규먼트라고 부릅니다.
함수를 선언하는 방법
func <함수명> (<매개변수 이름>: <매개변수 타입>, <매개변수 이름>: <매개변수 타입>,... )-> <반환값 타입> {
// 함수 코드
}
func― 함수라는 것을 스위프트 컴파일러에게 알려주는 키워드
<함수명>― 함수에 할당되는 이름
<매개변수 이름>― 함수 코드 내에서 참조되는 매개변수의 이름
<매개변수 타입>― 함수에 전달되는 매개변수의 타입
<반환값 타입>― 함수가 반환하는 결과에 대한 데이터 타입. 반환하지 않으면 “->Void”는 생략 가능합니다.
매개변수를 받지 않으며 결과를 반환하지도 않고 오직 메시지만 출력
하나의 문자열과 하나의 정수를 매개변수로 받아서 문자열을 반환
Swift 함수 정의와 호출하기
func sayHello() { //->Void 생략
print("Hello")
} //정의
sayHello() //호출