Swift Inheritance final

final

final 예약어 키워드로 재정의를 방지하여 컴파일 타임에 오류를 방지한다.
다른 클래스가 상속할 수 없는 클래스를 Final 클래스 라고 부른다.

사용 가능 키워드

  1. 클래스
  2. 속성
  3. 메소스
  4. 서브스크립트
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)
    }
  }
}

Image

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 를 해칠 것이고 동료 개발자와 합의가 필요할 것이다. 코드 리뷰를 진행한다면 자연스럽게 논의가 되며 합의점을 찾을 수 있다.

참고

developer.apple.com/swift/blog/

댓글남기기