티스토리 뷰

매우 다른 두 키워드지만, 얼핏 봤을 때 무언가를 못하게 하려 막는 듯한 이미지로 나에게 비슷하게 다가와 이번에 명확히 구분하여 알아놔야겠어서 정리해본다.

final

final로 선언 시, 재정의(override) 하는 것을 막을 수 있다.
서브클래스에서 특정 메소드, 프로퍼티, 서브스크립트가 오버라이드 하는 것을 방지하기 위해 final 키워드를 사용한다.
final func, final class ...
만약 final로 선언된 메소드, 프로퍼티, 서브스크립트를 오버라이드 하려고 할 경우 컴파일 타임에 에러가 발생.
클래스 전체를 final로 선언하여 클래스 안의 모든 메소드, 프로퍼티 등이 override 되는 것을 막을 수 있다.

예를 들어

class Job {
    final var pay = 3000
}

라면,

class Programmer: Job {
    override var pay: 6000 {
        didSet {
            print(oldValue)
        }
    }
}

이러한 시도는 pay를 override 하려고 하기에 컴파엘 에러가 발생한다.

private

private은 기본적으로 Access Levels에 속해 있다.
Access Level은 엔티티가 정의되는 소스 파일, 그리고 소스 파일이 속해 있는 모듈과 관련 있다.
Access Level에는 기본적으로 Open, Public, Internal, File-private, Private이 있다.
지금은 private만 알아보자.

protocol SomeProtocol {
    func doSomething()
}

struct SomeStruct {
    private var privateVariable = 12
}

extension SomeStruct: SomeProtocol {
    func doSomething() {
        print(privateVariable)
    }
}

var a = SomeStruct()
a.doSomething()  // 12 출력
// print(a.privateVariable) 에러남.

privateVar는 SampleStruct 구조체 안에서만 접근할 수 있다. 따라서 a.privateVar와 같이 접근할 수 없다.
접근 가능한 내부 함수(doSomething())을 통해서만 사용하여 private 변수에 접근할 수 있다.
이를 통해 정보 은닉 효과를 가져올 수 있다.

 

 

 

참고 :

https://docs.swift.org/swift-book/LanguageGuide/AccessControl.html
https://yagom.net/docs/final-오버라이드-방지/
https://zeddios.tistory.com/386

 

'Swift > 문법' 카테고리의 다른 글

Swift Generic(제네릭) 정리  (0) 2021.08.01
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함