Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- Realm
- 인스펙터
- 독학
- 패스트캠퍼스
- enum
- Threading
- switch
- SeSAC
- TableView
- beginAsyncWrite
- 프로퍼티 관찰자
- 패스트캠퍼스후기
- 열거형
- Git
- 옵셔널 체이닝
- 기본문법
- userDefaults
- 패캠챌린지
- cancelAsyncWrite
- xcode
- ios
- swift
- RawValue
- 직장인자기계발
- 직장인인강
- Background
- 30개프로젝트로배우는iOS앱개발withSwift초격자패키지Online
- Optional Chaining
- 함수
- 문자열 보간법
Archives
- Today
- Total
아삭아삭 iOS 개발
[Swift 독학] 패스트캠퍼스 챌린지 26일차_오버라이딩 본문
■ 재정의 (오버라이딩, overriding)
- 하위 클래스는 상위 클래스에서 상속할 인스턴스 메서드, 타입 메서드, 인스턴스 프로퍼티, 타입 프로퍼티, 또는 서브 스크립트에 대해 자체적인 사용자 구현을 제공할 수 있음
- override 키워드 사용
→ 같은 이름의 정의가 슈퍼클래스에 없을 경우, 오버라이드를 사용시 컴파일러 오류 발생
→ 슈퍼클래스에 동일한 이름의 정의가 있을 경우, 오버라이드 키워드 없이 사용하면 오류 발생
■ 메서드 재정의 (Overriding Methods)
- 상속된 인스턴스나 타입 메서드 재정의
→ 하위 클래스 내에서 메서드의 맞춤형(또는 대체) 구현 가능
// 지난 포스팅에서 정의했던 베이스 클래스인 Music을 상속한 MCHammer 클래스에 singing()메서드를 재정의
class MCHammer: Music {
override func singing() {
print("U Can't Touch This")
}
}
// MCHammer에 새로운 인스턴스 생성, singing() 메서드를 호출한다면 MCHammer 하위 클래스 버전의 메서드가 호출됨
let mchammer = MCHammer()
mchammer.singing() // U Can't Touch This
■ 프로퍼티 오버라이딩 (Overriding Properties)
- (프로퍼티 자체가 아닌) 프로퍼티의 get, set, 프로퍼티 옵저버 등을 재정의 하는 것
1) 프로퍼티 get, set 재정의
- 모든(계산, 저장) 프로퍼티를 재정의 하기위해 프로퍼티는 get, set문을 가질 수 있음
- 자식 클래스에서 재정의하려는 프로퍼티는 슈퍼클래스 프로퍼티의 ‘이름’과 ‘타입’이 일치해야 함
- 슈퍼클래스에서 ‘읽기-쓰기’로 정의된 프로퍼티를 서브클래스에서 읽기 전용 프로퍼티로는 재정의 불가
※ 단, 슈퍼클래스에서 읽기 전용으로 정의된 프로퍼티를 서브클래스에서 ‘읽기-쓰기’로 오버라이드 가능 - (서브클래스에서 슈퍼클래스의 특성을 재정의시) 슈퍼클래스의 특성을 서브클래스에서 사용하고 싶을 경우, ‘super’ 키워드를 사용하여 상위 클래스에 접근 가능
- 메서드, 프로퍼티, 서브 스크립트가 재정의 되는 것을 방지할 수 있음
→ class, var, func, subscript 등 키워드 앞에 'final' 추가하면 재정의 불가
ex) final var, final func, final class func, final static func??, final subscript
// Music의 하위 클래스인 RecordPlayer라는 새로운 클래스를 정의
// RecordPlayer 클래스는 3이라는 기본값을 갖는 volume이라는 새로운 저장된 프로퍼티를 가짐
// RecordPlayer 클래스는 현재 volume을 포함한 설명을 제공하기 위해 Music으로부터 상속한 description 프로퍼티를 재정의
class RecordPlayer: Music {
var volume = 3
override var description: String {
return super.description + " in volume \(volume)"
}
}
// description 프로퍼티의 재정의는 Music 클래스의 description 프로퍼티를 반환하는 super.description호출로 시작
// description의 RecordPlayer 클래스 버전은 현재 volume에 대한 정보를 추가함
let recordplayer = RecordPlayer()
recordplayer.beat = 99.9
recordplayer.volume = 7
print("RecordPlayer: \(recordplayer.description)")
// RecordPlayer: put your records on 99.9 rythm in the moonlight in volume 7
// RecordPlayer 클래스의 인스턴스를 생성하고 beat와 volume 프로퍼티를 설정하면
// description 프로퍼티는 RecordPlayer 클래스 내에서 설정한 설명을 반환하는 것 확인 가능
2) 프로퍼티 관찰자 재정의
- 프로퍼티 재정의를 사용하여 상속된 프로퍼티에 프로퍼티 관찰자 추가 가능
- (기존 구현 프로퍼티와 무관하게) 상속된 프로퍼티의 값이 변경될 때 알림을 받을 수 있음
- 상수 저장 프로퍼티나 읽기 전용 연산 프로퍼티의 경우, 값을 설정할 수 없기 때문에 프로퍼티 관찰자 추가 불가
→ 프로퍼티의 값 설정이 불가하므로 재정의 부분에 willset이나 didset을 사용 불가 - 같은 프로퍼티에 재정의한 set구문과 재정의한 프로퍼티 관찰자를 동시에 한 번에 제공 불가
→ 사용자화 set구문으로 간단하게 프로퍼티 값변경 관찰 가능
// RecordPlayer의 하위 클래스인 AutomaticPlayer라는 새로운 클래스를 정의
// AutomaticPlayer 클래스는 현재 비트에 기반하여 적절한 볼륨을 자동으로 선택하는 자동 음량조절기기가 있는 레코드플레이어를 표시함
class AutomaticPlayer: RecordPlayer {
override var beat: Double {
didSet {
volume = Int(beat / 5.0) + 2
}
}
}
// AutomaticPlayer 인스턴스에 beat 프로퍼티를 설정할 때마다 프로퍼티의 didSet 관찰자는 새로운 비트에 적절한 볼륨을 인스턴스의 volume에 설정함
// 프로퍼티 관찰자는 새로운 beat 값을 5로 나눈다음 가까운 정수로 내림한 다음 2를 더한 값을 volume으로 선택함
// 예시로 72의 beat는 volume이 16이 됨
let automatic = AutomaticPlayer()
automatic.beat = 72.0
print("AutomaticPlayer: \(automatic.description)")
// AutomaticPlayer: put your records on 72.0 rythm in the moonlight in volume 16
본 게시물은 개인 공부 기록용이므로 내용에 오류가 있을 수 있습니다.
■ fast campus강의 외 참조자료
[1] https://blog.yagom.net/557/
[2] https://bbiguduk.gitbook.io/swift/language-guide-1/inheritance
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
'Swift' 카테고리의 다른 글
[Swift 독학] 패스트캠퍼스 챌린지 28일차_assert와 precondition과 guard (0) | 2022.02.20 |
---|---|
[Swift 독학] 패스트캠퍼스 챌린지 27일차_타입캐스팅 (0) | 2022.02.19 |
[Swift 독학] 패스트캠퍼스 챌린지 25일차_상속 (0) | 2022.02.17 |
[Swift 독학] 패스트캠퍼스 챌린지 24일차_프로퍼티 래퍼 (0) | 2022.02.16 |
[Swift 독학] 패스트캠퍼스 챌린지 23일차_프로퍼티 관찰자 (0) | 2022.02.15 |