The Swift Programming Language 도서 내용을 토대로 번역 및 요약된 내용입니다.
class 클래스명
을 통해 class를 생성할 수 있다.
class의 속성은 var, let
을 통해, 함수는 func
을 통해 동일하게 생성할 수 있다.
class Shape {
var numberOfSides = 0 // 속성
func simpleDescription() -> String { // 함수
return "A shape with \(numberOfSides) sides."
}
}
클래스명 뒤에 괄호()
를 붙여 instance를 생성할 수 있다.
.
을 통해 class의 속성, 함수를 접근할 수 있다.
var shape = Shape() // instance 생성
shape.numberOfSides = 7 // 속성 접근
var shapeDescription = shape.simpleDescription() // 함수 접근
instance 가 생성될 때 init
을 통해 class를 설정할 할 수 있다.
self
를 통해 속성을 접근할 수 있으며, 모든 속성
은 init 에서 함수처럼 받아온 인자를 통해, 혹은 초기값 설정을 통해 초기화
가 되어야 한다.
class NamedShape {
var numberOfSides: Int = 0
var name: String
init(name: String) { // initializer
self.name = name // 속성 초기화
}
func simpleDescription() -> String {
return "A shape with \(numberOfSides) sides."
}
}
deinit
을 통해 객체가 할당 해제되기 전
에 필요한 작업을 수행할 수 있다.
자식 class 들은 클래스명 뒤에 colon(:) 뒤에 부모 클래스명을 받는다.
override
를 통해 부모 클래스에서 구현된것을 재정의
할 수 있다.
하지만 실수로 재정의 없이 override
를 사용한 경우 compiler
를 통해 error
로 감지됩니다.
class Square: NamedShape { // 상속받은 class
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 를 통해 computed property로 사용될 수 있다.
setter 에서 newValue 값을 통해 새로설정되는 값을 사용할 수 있다.
class EquilateralTriangle: NamedShape {
var sideLength: Double = 0.0
init(sideLength: Double, name: String) {
self.sideLength = sideLength
super.init(name: name)
numberOfSides = 3
}
var perimeter: Double {
get {
return 3.0 * sideLength // 계산된 값이 반환된다.
}
set {
sideLength = newValue / 3.0 // 설정되는 값이 newValue로 사용된다.
}
}
override func simpleDescription() -> String {
return "An equilateral triangle with sides of length \(sideLength)."
}
}
var triangle = EquilateralTriangle(sideLength: 3.1, name: "a triangle")
print(triangle.perimeter)
// Prints "9.3"
triangle.perimeter = 9.9
print(triangle.sideLength)
// Prints "3.3000000000000003
또한 setter 에서 set 이후 괄호를 통해 newValue 값을 임의의 변수명으로 사용할 수 있다.
set(nValue) {
sideLength = nValue / 3.0
}
상속받은 자식 class 의 초기화 작업은 세가지 순서에 따르게 된다.
1. 자식 class의 변수 초기화
2. 부모 class의 init
3. 부모 class의 변수 수정
함수 사용, getter와 setter 등의 설정 작업은 이 이후에 가능하다.
willSet
, 또는 didSet
키워드를 통해 new value 로 설정되기 전, 후에 실행되는 코드를 작성할 수 있다.
아래 예시코드의 경우 triangle 과 square 의 sideLength 는 항상 동일하게 유지된다.
class TriangleAndSquare {
var triangle: EquilateralTriangle {
willSet {
square.sideLength = newValue.sideLength
}
}
var square: Square {
willSet {
triangle.sideLength = newValue.sideLength
}
}
init(size: Double, name: String) {
square = Square(sideLength: size, name: name)
triangle = EquilateralTriangle(sideLength: size, name: name)
}
}
var triangleAndSquare = TriangleAndSquare(size: 10, name: "another test shape")
print(triangleAndSquare.square.sideLength)
// Prints "10.0"
print(triangleAndSquare.triangle.sideLength)
// Prints "10.0"
triangleAndSquare.square = Square(sideLength: 50, name: "larger square")
print(triangleAndSquare.triangle.sideLength)
// Prints "50.0"
optional 변수에 ?
를 붙여 함수나 속성
을 사용할 수 있다.
만약 ?
이전 값이 nil일 경우는 ?
이후 모든 값은 nil
로 처리된다.
반대로 ?
이전 값이 nil이 아닌 경우는 unwrapped
된 값이 되며, 최종
결과값은 optional
값이 된다.
let optionalSquare: Square? = Square(sideLength: 2.5, name: "optional square") // 옵셔널 변수
let sideLength = optionalSquare?.sideLength // unwrapped 된 Square 타입의 sideLength 값이 되며, 최종 타입은 optional
다음에서 발췌
docs.swift.org
The Swift Programming Language (Swift 5.5) Apple Inc.
이 자료는 저작권에 의해 보호됩니다.