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 스터디 - 함수
댓글