본문 바로가기
Languages/Swift

사당 iOS 스터디 2주차 - 프로퍼티와 메소드

by 탄이. 2018. 7. 24.







__10.1 프로퍼티

10.1.1 저장 프로퍼티

  • 클래스 또는 구조체의 인스턴스와 연관된 값을 저장하는 가장 단순한 개념의 프로퍼티

  • 클래스의 저장 프로퍼티는 옵셔널이 아니라면 프로퍼티 기본값을 지정해주거나 사용자정의 이니셜라이저를 통해 반드시 초기화

  • 클래스 인스턴스의 상수 프로퍼티는 인스턴스가 초기화(이니셜라이즈)될 때 한 번만 값을 할당

  • 프로퍼티 기본값을 지정해주지 않는다면 이니셜라이저를 따로 정의해주어야 합니다.

  • 저장 프로퍼티의 초깃값 지정

    • 구조체는 프로퍼티에 맞는 이니셜라이저를 자동으로 제공

    • 클래스의 저장 프로퍼티에 초깃값을 지정해주면 따로 사용자정의 이니셜라이저를 구현해줄 필요가 없습니다.

  • 옵셔널 저장 프로퍼티

    • 인스턴스를 생성할 때 이니셜라이저를 통해 초깃값을 보내야 하는 이유는 프로퍼티가 옵셔널이 아닌 값으로 선언되어 있기 때문

    • 옵셔널과 이니셜라이저를 적절히 사용하면 다른 프로그래머가 사용할 때, 내가 처음 의도했던 대로 구조체와 클래스를 사용할 수 있도록 유도할 수 있습니다.

10.1.2 지연 저장 프로퍼티

  • 호출이 있어야 값을 초기화하며, 이때 lazy 키워드를 사용

  • 주로 복잡한 클래스나 구조체를 구현할 때 많이 사용

  • 저장 프로퍼티로 쓰이는 인스턴스들이 한 번에 생성되어야 한다면?

  • 또, 굳이 모든 저장 프로퍼티를 사용할 필요가 없다면?

  • 지연 저장 프로퍼티를 잘 사용하면 불필요한 성능저하나 공간 낭비를 줄일 수 있습니다.

  • 다중 스레드와 지연 저장 프로퍼티

    • 다중 스레드 환경에서 지연 저장 프로퍼티에 동시다발적으로 접근할 때는 한 번만 초기화된다는 보장이 없습니다. 생성되지 않은 지연 저장 프로퍼티에 많은 스레드가 비슷한 시점에 접근한다면, 여러 번 초기화될 수 있습니다.

10.1.3 연산 프로퍼티

  • 특정 상태에 따른 값을 연산하는 프로퍼티

  • getter(접근자)

    • 인스턴스 내/외부의 값을 연산하여 적절한 값을 돌려줌

  • setter(설정자)

    • 은닉화된 내부의 프로퍼티 값을 간접적으로 설정

  • 클래스, 구조체, 열거형에 연산 프로퍼티를 정의할 수 있습니다.

  • 프로퍼티가 메서드 형식보다 훨씬 더 간편하고 직관적

  • 메서드로는 설정자 메서드만 구현하여 쓰기 전용 상태로 구현할 수 있지만 연산 프로퍼티는 그것이 불가능

  • 메서드로 구현된 접근자와 설정자에서는

    • 접근자와 설정자 이름의 일관성을 유지하기 힘들며, 해당 포인트에 접근할 때와 설정할 때 사용되는 코드를 한 번에 읽기도 쉽지 않습니다.

  • 연산 프로퍼티의 정의와 사용

    • 하나의 프로퍼티에 접근자와 설정자가 모두 모여있고, 해당 프로퍼티가 어떤 역할을 하는지 좀 더 명확하게 표현 가능

  • 매개변수 이름을 생략한 설정자

  • 읽기 전용 연산 프로퍼티

10.1.4 프로퍼티 감시자

  • 프로퍼티 감시자(Property Observers)를 사용하면 프로퍼티의 값이 변경됨에 따라 적절한 액션을 취할 수 있습니다.

  • 프로퍼티의 값이 새로 할당될 때마다 호출

  • 이때 변경되는 값이 현재의 값과 같더라도 호출

  • 지연 저장 프로퍼티에 사용할 수 없음

  • 프로퍼티 재정의(오버라이드)를 통해 상속받은 저장 프로퍼티 또는 연산 프로퍼티에도 적용할 수 있습니다.

  • 상속받지 않은 연산 프로퍼티에는 프로퍼티 감시자를 사용할 필요가 없으며 할 수도 없습니다.

  • willSet 메서드

    • 프로퍼티의 값이 변경되기 직전에 호출

      • newValue

        • 전달되는 전달인자는 프로퍼티가 변경될 값

  • didSet 메서드

    • 프로퍼티의 값이 변경된 직후에 호출

      • oldValue

        • 전달되는 전달인자는 프로퍼티가 변경되기 전의 값

  • 상속받은 연산 프로퍼티의 프로퍼티 감시자 구현

    • 클래스를 상속받았다면 기존의 연산 프로퍼티를 재정의하여 프로퍼티 감시자를 구현할 수도 있습니다.

  • 입출력 매개변수와 프로퍼티 감시자

    • 프로퍼티 감시자가 있는 프로퍼티를 함수의 입출력 매개변수의 전달인자로 전달한다면 항상 willSet과 didSet 감시자를 호출

      • 함수 내부에서 값이 변경되든 되지 않든 간에 함수가 종료되는 시점에 값을 다시 쓰기 때문

10.1.5 전역변수와 지역변수

  • 전역변수 또는 전역상수는 지연 저장 프로퍼티처럼 처음 접근할 때 최초로 연산이 이루어집니다.

  • 반대로 지역변수 및 지역상수는 절대로 지연 연산 되지 않습니다.

10.1.6 타입 프로퍼티

  • 각각의 인스턴스가 아닌 타입 자체에 속하는 프로퍼티(static)

  • 타입 자체에 영향을 미치는 프로퍼티

  • 인스턴스의 생성 여부와 상관없이 타입 프로퍼티의 값은 하나며, 그 타입의 모든 인스턴스가 공통으로 사용하는 값(C언어의 static constant와 유사), 모든 인스턴스에서 공용으로 접근하고 값을 변경할 수 있는 변수(C언어의 static 변수와 유사) 등을 정의할 때 유용

  • 저장 타입 프로퍼티

    • 변수 또는 상수로 선언할 수 있음

      • 반드시 초깃값을 설정해야 하며 지연 연산 됨

      • 다중 스레드 환경이라고 하더라도 단 한 번만 초기화된다는 보장을 받습니다

  • 연산 타입 프로퍼티

    • 변수로만 선언할 수 있음

  • 인스턴스를 생성하지 않고도 사용

  • 타입에 해당하는 값

10.1.7 키 경로

  • 프로퍼티도 값을 바로 꺼내오는 것이 아니라 어떤 프로퍼티의 위치만 참조하도록 할 수 있습니다. 바로 키 경로(Key Path)를 활용

  • 간접적으로 특정 타입의 어떤 프로퍼티 값을 가리켜야 할지 미리 지정해두고 사용

  • 역슬래시()와 타입, 마침표(.) 경로로 구성

  • 키 경로를 잘 활용하면 프로토콜과 마찬가지로 타입간의 의존성을 낮추는 데 많은 도움을 줍니다. 또, 애플의 프레임워크는 키-값 코딩 등 많은 곳에 키 경로를 활용

__10.2 메서드

스위프트에서는 프로그래머가 정의하는 타입(클래스, 구조체, 열거형 등)에 자유롭게 메서드를 정의할 수 있습니다.

10.2.1 인스턴스 메서드

  • 인스턴스 내부의 프로퍼티 값을 변경하거나 특정 연산 결과를 반환하는 등 인스턴스와 관련된 기능을 실행

  • 함수와 달리 특정 타입 내부에 구현

  • 인스턴스가 존재할 때만 사용

  • mutating 키워드의 사용

    • 자신의 프로퍼티 값을 수정할 때 클래스의 인스턴스 메서드는 크게 신경쓸 필요가 없지만, 구조체나 열거형 등은 값 타입이므로 메서드 앞에 mutating 키워드를 붙여서 해당 메서드가 인스턴스 내부의 값을 변경한다는 것을 명시해야 합니다.

  • self 프로퍼티

    • 인스턴스 자기 자신을 가리키는 프로퍼티

    • 스위프트는 자동으로 메서드 내부에 선언된 지역변수를 먼저 사용하고, 그 다음 메서드 매개변수, 그 다음 인스턴스의 프로퍼티를 찾아서 변수이름이 무엇을 지칭하는지 유추

    • 다른 용도는 값 타입 인스턴스 자체의 값을 치환할 수 있습니다.

10.2.2 타입 메서드

  • 타입 자체에 호출이 가능한 메서드를 타입 메서드(흔히 객체지향 프로그래밍에서 지칭하는 클래스 메서드와 유사)

  • 클래스의 타입 메서드는 static 키워드와 class 키워드를 사용할 수 있는데 static으로 정의하면 상속 후 메서드 재정의가 불가능하고 class로 정의하면 상속 후 메서드 재정의가 가능

  • 타입 프로퍼티와 타입 메서드의 사용

    • 인스턴스 메서드에서는 self가 인스턴스를 가리킨다면 타입 메서드의 self는 타입을 가리킵니다.






참고


야곰의 스위프트 프로그래밍 https://book.naver.com/bookdb/book_detail.nhn?bid=12571019



2018/07/23 - [삽질/Swift] - 사당 iOS 스터디 - 구조체와 클래스

2018/07/23 - [삽질/Swift] - 사당 iOS 스터디 - 옵셔널

2018/07/23 - [삽질/Swift] - 사당 iOS 스터디 - 함수


댓글