Class
- 클래스를 만들기 위해서는 클래스 이름과 함께 class 키워드를 사용
- 메서드와 함수도 선언
- new라는 키워드가 없다.
초기화자(생성자)
class NamedShape {
var numberOfSides: Int = 0 // nonoptional이나 초기화를 함
var name: String // nonoptional이나 초기화를 하지 않음
init(name: String) {
self.name = name // 여기서 반드시 초기화 하여야 함, nonoptional
}
func simpleDescription() -> String {
return "A shape with \(numberOfSides) sides."
}
}
파괴자
override
- override 키워드를 이용해 표시해줘야 함
- 상위 클래스의 생성자를 호출 시에는 반드시 현재 클래스의 멤버를 초기화 한 후에 호출하여야 함
class Square: NamedShape { // 상속, 자바에서 extends와 동일
var sideLength: Double
init(sideLength: Double, name: String) {
self.sideLength = sideLength
super.init(name: name) // 이 함수의 호출 위치가 중요
numberOfSides = 4
}
func area() -> Double {
return sideLength * sideLength
}
override func simpleDescription() -> String {
return "A square with sides of length \(sideLength)."
}
}
let test = Square(sideLength: 5.2, name: "my test square")
test.area()
test.simpleDescription()
getter/setter
- 저장되어 있는 간단한 속성 외에도 속성은 getter와 setter를 가질 수 있음
var perimeter: Double { // perimeter을 연산 프로퍼티라고 함(computed properties)
get {
return 3.0 * sideLength
}
set {
sideLength = newValue / 3.0
}
}
// perimeter에는 값을 저장할 수 없음
열거형
- enum 키워드를 사용하면 열거형을 만들 수 있음
- 클래스나 모든 알려진 타입들의 경우 열거형에 메서드를 포함할 수 있음
- 실제 값이 의미 있는 경우가 아니라면 굳이 첫번째 값을 제공할 필요 없음(기본값으로 0, 1, 2, ... 부여)
Struct
- 메서드나 이니셜라이저 같은 클래스와 비슷한 기능들을 지원
- 클래스와 구조체의 가장 중요한 차이점은 구조체의 경우 코드 내에서 전달될 때 값 복사 형태로 전달되지만 클래스의 경우에는 참조 복사 형태로 전달
Protocol
- 자바에서 interface와 같음
- 메소드 외 프로퍼티도 가능
- {get} -> 하위 클래스 구조체에서 var, let을 모두 할 수 있음
- {get set} -> 하위 클래스 구조체에서 var만 모두 할 수 있음
Extenstion
- 기존의 타입들에 새로운 메서드나 속성들을 추가할 수 있음
- 기존 존재하는 기능을 재정의 할 수 없음
- 연산 프로퍼티, 메소드, 이니셜라이저 등을 추가할 수 있음
- 저장 프로퍼티는 추가 불가(static 저장 프로퍼티는 가능): 필요하다면 상속받아서 해야 함
옵셔널
- 어떤 변수는 컴파일 순간에 값이 정해지지 않는 경우가 있다. 이 변수를 Optional 변수라고 함
- 변수/상수 선언의 3가지
- 일반: nil 제외 일반 값 저장
- Optional: 일반 값과 nil 저장
- Implicit Unwrapping Optional: 일시적으로 nil을 가질 수 있으나 read 되기 전에 반드시 일반 값이 저장되어야 한다. 아니면 죽음
- Forced Unwrapping(강제 언래핑)
- Optional 변수의 값을 일반 변수의 값으로 변환
- 문법: 변수!
- 변수의 값이 nil이 아니면 일반값으로 변환되나, 변수의 값이 nil이면 프로그램이 죽음
Optional Binding
- If Statements and Forced Unwrapping을 합친 것
if let constantName = someOptional {
statements // 여기서 constantName 변수는 이 블록 {} 내에서만 유효하다
Mutiple optional binding
- If 문 안에서 comma로 분리하여 여러 개를 binding 할 수 있음
guard
- 옵셔널 바인딩 중 하나라도 nil이면 else로 빠져나옴
- 반드시 함수 안에서 사용해야 함
Optional Chaining
- 옵셔널 체이닝은 옵셔널 변수를 사용하여 하위 프로퍼티, 메소드, 서브스크립트 등을 액세스할 때 옵셔널 변수가 nil인 경우 하위 프로퍼티, 메소드, 서브스크립트 등의 액세스 없이 결과를 nil로 함
체이닝의 다중 레벨 연결
- 여러 레벨로 옵셔널 체이닝이 적용되는 경우
- xxx?.yyy?.zzzz? : 이 경우 xxx, yyy, zzz 중 하나라도 nil이면 전체 결과가 nildlek