Swift
Inheritance
final
final
final 예약어 키워드로 재정의를 방지하여 컴파일 타임에 오류를 방지한다.
다른 클래스가 상속할 수 없는 클래스를 Final 클래스 라고 부른다.
사용 가능 키워드
- 클래스
- 속성
- 메소스
- 서브스크립트
final var
final func
final class func
final func subscript
final 을 이용한 재정의 방지
class ParticleModel {
var point = ( 0.0, 0.0 )
var velocity = 100.0
func updatePoint(newPoint: (Double, Double), newVelocity: Double) {
point = newPoint
velocity = newVelocity
}
func update(newP: (Double, Double), newV: Double) {
updatePoint(newPoint: newP, newVelocity: newV)
}
}
class ChildModel: ParticleModel {
override var point: (Double, Double) {
get {
return super.point
}
set {
super.point = (newValue.0, newValue.1 / 10)
}
}
}
class ParticleModel {
final var point = ( 0.0, 0.0 )
var velocity = 100.0
func updatePoint(newPoint: (Double, Double), newVelocity: Double) {
point = newPoint
velocity = newVelocity
}
func update(newP: (Double, Double), newV: Double) {
updatePoint(newPoint: newP, newVelocity: newV)
}
}
class ChildModel: ParticleModel {
override var point: (Double, Double) { // Var overrides a 'final' var
get {
return super.point
}
set {
super.point = (newValue.0, newValue.1 / 10)
}
}
}
initailize
final 클래스는 required 식별자를 붙여줄 필요가 없다.
상속할 수 없는 클래스의 요청 이니셜 라이저 구현은 무의미 하다.
required 를 요구하는 Protocol 을 사용할 수 있어야 하기 때문에
required 를 붙여도 문법상 문제는 없다.
final class ChildModel: ParticleModel {
var name: String
required init(name: String) { // X
self.name = name
}
}
final class ChildModel: ParticleModel {
var name: String
init(name: String) { // OK
self.name = name
}
}
pivate final
private 은 final 명시가 가능하지만 의미는 없다.
class ChildModel: ParticleModel {
var name: String = "Swift Man"
private final func update(name: String) {
let name = name.split(separator: " ")
}
}
성능
Swift 는 일반적으로 모듈을 개별적으로 구성하는 파일 단위로 컴파일 된다. 전체 모듈을 최적화 할때 컴파일러는 final, private 에 대해 추론이 가능하다.
런타임에 추론되는가? 컴파일타임에 추론되는가? 의 성능 차이가 발생한다.
private 과 final 은 컴파일러 최적화가 가능하다. 최적화 동작은 컴파일러 내부 세팅에 의해 일어나기 때문에 가능은 하더라도 항상 보장되지 않는다.
전체 모듈을 최적화 할때 컴파일러는 final, private 에 대해 추론이 가능하고 오버헤드를 줄일 수 있다고 한다.
클린 코드의 관점
기본적으로 코드 가독성을 해지지 않고 명시한 부분에 사용 정의하는게 좋다. 지나친 남용은 코드의 readability 를 해칠 것이고 동료 개발자와 합의가 필요할 것이다. 코드 리뷰를 진행한다면 자연스럽게 논의가 되며 합의점을 찾을 수 있다.
댓글남기기