변수는 계속 변하는 값을 지정 할 때에 사용하고, 상수는 변하지 않는 값을 지정할 때에 사용한다.
변수: var name: type(생략가능) = value
상수: let name: type(생략가능) = vlaue
Bool, Character, Int, Float 이다.
Bool: Ture/False, A == B 에 대한 참/거짓을 반환
Character: 문자 (String: 문자열;;문자의 나열)
Int: 정수 (UInt: 0을 포함한 자연수)
Float: 유리수
64비트: Double, 32비트: Float
라면 끓이는 방법
라면개수 설정
버너 위에 냄비를 올린다.
냄비에 (라면개수-1)*200 + 500 물을 넣는다.
냄비가 올려진 버너에 불을 붙인다.
라면개수만큼의 포장봉지를 뜯는다.
라면개수만큼의 라면스프봉지를 뜯는다.
라면개수만큼의 야채스프봉지를 뜯는다.
냄비에 라면스프를 라면개수 만큼 넣는다.
냄비에 야채스프를 라면개수 만큼 넣는다.
if 물온도 > 99 {
냄비에 라면개수 만큼 라면을 넣는다.
else 물온도 측정
if 타이머 > 179 {
버너를 끈다.
else 버너유지
}
}
냄비의 라면을 접시로 옮긴다.
이분탐색
배열 중 구성요소를 찾을 때에 정중앙의 구성요소를 타겟으로 하는 요소와 비교하여 정중앙 값이 타겟보다 값이 작으면 왼쪽의 요소들을 클 경우에는 오른쪽 요소들을 제거하고 남은 요소들의 중앙값을 새로 설정하여 위 과정을 반복한다.
함수
func 함수명(독립변수명: type) { -> 종속변수 type
}
클래스는 init 함수를 꼭 만들어야 함.
구조체는 복사본을 만들고 원본을 바꾸어도 복사본이 바뀌지 않음.
클래스는 복사본을 만들고 원본을 바꿀 경우 복사본이 바뀜.
클래스에서만 상속이 가능함.
값이 있을수도 있고, 비워저 있을 수도 있다는 의미
nil의 가능성을 주석 및 문서가 아닌 코드로 표현가능하여 효율적인 코딩이 가능하게함.
var optionalValue: Int?! = 100
switch optionalValue {
case .none:
print(This Optional variable is nil"
case. some:
print("Value is \(value)")
var someValue: String?! = "어떤 값"
// someValue는 "어떤 값" 또는 nill이 될 수 있음.
1) Optional: 옵셔널
var question: Int? = 100
question = question + 1
//Error
2) Implicitly Unwrapped Optional(IUO): 암시적 추출 옵셔널
var exclamation: Int! = 100
exclamation = exclamation + 1
//101
exclamation = nil
exclamation = exclamation + 1
//Error: Optional Chaining
class Person {
var name: String
var job: String?
var home: Apartment?
init(name: String) {
self.name = name
}
}
class Apartment {
var buildingNumber: String
var roomNumber: String
var `guard`: Person?
var owner: Person?
init(dong: String, ho: String) {
buildingNumber = dong
roomNumber = ho
}
}
let yagom: Person? = Person(name: "yagom")
let apart: Apartment? = Apartment(dong: "101", ho: "202")
let superman: Person? = Person(name: "superman")
// 옵셔널 체이닝이 실행 후 결과값이 nil일 수 있으므로
// 결과 타입도 옵셔널입니다
// 만약 우리집의 경비원의 직업이 궁금하다면..?
// 옵셔널 체이닝을 사용하지 않는다면...
func guardJob(owner: Person?) {
if let owner = owner {
if let home = owner.home {
if let `guard` = home.guard {
if let guardJob = `guard`.job {
print("우리집 경비원의 직업은 \(guardJob)입니다")
} else {
print("우리집 경비원은 직업이 없어요")
}
}
}
}
}
guardJob(owner: yagom)
// 옵셔널 체이닝을 사용한다면
func guardJobWithOptionalChaining(owner: Person?) {
if let guardJob = owner?.home?.guard?.job {
print("우리집 경비원의 직업은 \(guardJob)입니다")
} else {
print("우리집 경비원은 직업이 없어요")
}
}
guardJobWithOptionalChaining(owner: yagom)
// 우리집 경비원은 직업이 없어요
yagom?.home?.guard?.job // nil
yagom?.home = apart
yagom?.home // Optional(Apartment)
yagom?.home?.guard // nil
yagom?.home?.guard = superman
yagom?.home?.guard // Optional(Person)
yagom?.home?.guard?.name // superman
yagom?.home?.guard?.job // nil
yagom?.home?.guard?.job = "경비원"
optional ?? Value 로 사용
optional 값이 nil일 경우 오른쪽 값 사용
var guardJob: String
guardJob = yagom?.home?.guard?.job ?? "슈퍼맨"
print(guardJob) // 경비원
yagom?.home?.guard?.job = nil
guardJob = yagom?.home?.guard?.job ?? "슈퍼맨"
print(guardJob) // 슈퍼맨
var my: String?! = "yagom"
print(my) // optional("yagom")
if let name = my {
print(name)
}
//yagom
2) Force Unwrapping: 강제 추출
-> !를 붙여서 강제로 추출
var my: String? = "yagom"
print(my!) // yagom
3) Force Unwrapping이 편함에도 주의해야 할 것: 런타임 오류
따라서 Force Unwrapping 보다는 Optional Binding을 사용하는 것이 더 안전함.
RunTimeError
nil이 아닌 값이 들어갈 때만 동작하게 하는 Optional Binding으로 옵셔널 값을 추출하면, RunTimeError를 예방할 수 있음.
var my: String? = "ag"
var you: String! = nil
if let name = my, let friend = you {
print("\(name) and \(friend)")
}
// 실행해도 아무 일이 일어나지 않음
클래스 상속:
부모클래스(Superclass/Parents-class)의 methods, properties등을 자식클래스(Subclass/Child-class) 에서도 동일하게 사용할 수 있게 함.
// 기반 클래스 Person
class Person {
var name: String = ""
func selfIntroduce() {
print("저는 \(name)입니다")
}
// final 키워드를 사용하여 재정의를 방지할 수 있습니다
final func sayHello() {
print("hello")
}
// 타입 메서드
// 재정의 불가 타입 메서드 - static
static func typeMethod() {
print("type method - static")
}
// 재정의 가능 타입 메서드 - class
class func classMethod() {
print("type method - class")
}
// 재정의 가능한 class 메서드라도
// final 키워드를 사용하면 재정의 할 수 없습니다
// 메서드 앞의 `static`과 `final class`는 똑같은 역할을 합니다
final class func finalCalssMethod() {
print("type method - final class")
}
}
// Person을 상속받는 Student
class Student: Person {
var major: String = ""
override func selfIntroduce() {
print("저는 \(name)이고, 전공은 \(major)입니다")
}
override class func classMethod() {
print("overriden type method - class")
}
// static을 사용한 타입 메서드는 재정의 할 수 없습니다
// override static func typeMethod() { }
// final 키워드를 사용한 메서드, 프로퍼티는 재정의 할 수 없습니다
// override func sayHello() { }
// override class func finalClassMethod() { }
}
UIKit: Apple 플랫폼에서 앱을 구축하기 위한 그래픽, 이팩트 기반의 프레임워크.
UIViewController는 UIKit 프레임워크에 정의 된 클래스.
ViewController는 UIViewCotroller를 상속받는다.
여기서 부모클래스는 UIViewController
자식클래스는 ViewController가 된다.