면접스터디 - Access Control, Property Wrapper, Defer

Groot·2023년 3월 16일
0

TIL

목록 보기
131/153
post-thumbnail

🌱 난 오늘 무엇을 공부했을까?

📌 면접스터디

📍 접근제어자

🔗 Access Levels

  • open : 모듈의 모든 소스 파일 내에서 그리고 정의 모듈을 가져오는 다른 모듈의 소스 파일에서도 엔터티를 사용

    • 클래스를 open으로 표시하는 것은 해당 클래스를 슈퍼클래스로 사용하는 다른 모듈의 코드 영향을 고려했으며 그에 따라 클래스의 코드를 설계했음을 명시적으로 나타내는 것.
  • public : open과 동일하지만, 다른 모듈에서 코드를 하위 클래스로 만들고 재정의할 수 없다.

  • internal : 모듈의 모든 소스 파일 내에서 사용할 수 있지만 해당 모듈 외부의 소스 파일에서는 사용할 수 없다. 일반적으로 앱 또는 프레임워크의 내부 구조를 정의에 사용.

    • 따로 정의하지 않으면 기본적인 접근레벨
  • file-private : 엔터티의 사용을 자체 정의 소스 파일로 제한, 특정 기능의 구현 세부 정보가 전체 파일 내에서 사용되는 경우 이를 숨김.

  • private : 동일한 파일에 있는 해당 선언의 확장에 대한 엔터티 사용을 제한(내부 구현에서만 접근가능), 세부 정보가 단일 선언 내에서만 사용되는 경우 private를 사용하여 특정 기능의 구현 세부 정보를 숨긴다.

🔗 Access Levels for Unit Test Targets

  • import앞에 @testable이라는 에트리뷰트를 붙여주면 해달 모듈을 테스트가 가능한 모듈로 컴파일해 사용

🔗 Constants, Variables, Properties, and Subscripts

  • 상수, 변수, 프로퍼티 등은 그 타입보다 더 높은 접근레벨을 갖을 수 없다.
  • fileprivate(set), private(set), internal(set)

🔗 Initializers

  • 타입의 접근레벨이 public이면 Default Initializers는 internal의 레벨

🔗 Protocol

  • 프로토콜의 접근레벨과 그 안의 요구사항의 접근레벨은 항상 동일
  • 새로운 프로토콜을 선언하는 경우 새 프로토콜은 상속을 한 프로토콜과 같은 접근레벨

🔗 Extensions

  • 클래스, 구조체, 열거형 등에 익스텐션에서 새로운 맴버를 추가하면 새로 추가된 것은 기존에 타입이 선언된 접근레벨과 같은 레벨'

  • Private Members in Extensions

    • 원본 선언에서 private 멤버로 선언한것을 익스텐션에서 멤버로 접근
    • 하나의 익스텐션에서 private멤버로 선언한 것을 같은 파일의 다른 익스텐션에서 접근
    • 하나의 익스텐션에서 private멤버로 선언한 것을 원본 선언에서 멤버로 접근

📍 property Wrapper

  • @propertyWrapper 특성으로 주석을 추가하여 구조체 또는 클래스를 사용하여 구현하여 반복되는 논리들을 구성할 수 있다.
  • 쉽게 말하면 동일한 동작이 필요한 연산 프로퍼티나, 프로퍼티 옵저버 동작을 반복해서 작성하지 않고, 하나의 타입과 같은 형태로 만들어서 중복을 제거하는 방법이다.
  • 내부에 새로운 프로퍼티 선언이 가능하다.
@propertyWrapper struct Capitalized {
    var wrappedValue: String {
        didSet { wrappedValue = wrappedValue.capitalized }
    }

    init(wrappedValue: String) {
        self.wrappedValue = wrappedValue.capitalized
    }
}

struct User {
    @Capitalized var firstName: String
    @Capitalized var lastName: String
}

// John Appleseed
var user = User(firstName: "john", lastName: "appleseed")

// John Sundell
user.lastName = "sundell"

📍 defer

  • 함수 종료 직전에 실행되는 구문을 클로저로 감싸서 사용한다.
  • 위치와 상관없이 무조건 마지막, 여러개의 defer는 호출순서의 역순으로 실행된다.
func test() {
    defer { print("end") }
    print("start")
    print("working...")
}

test() 
// 결과
// start
// working...
// end

🔗 특징

  • defer를 호출 전 함수가 종료되면 defer는 실행되지 않는다
  • 하나의 함수에서 여러 번 defer를 호출 가능, 실행 순서는 가장 마지막에 호출된 defer부터 역순으로 실행된다.
func test() {
    defer { print("1") }
    defer { print("2") }
    defer { print("3") }
}

test() 
// 결과
// 3
// 2
// 1
profile
I Am Groot

0개의 댓글