아삭아삭 iOS 개발

[Swift 독학] 패스트캠퍼스 챌린지 26일차_오버라이딩 본문

Swift

[Swift 독학] 패스트캠퍼스 챌린지 26일차_오버라이딩

바닐라머스크 2022. 2. 18. 23:27

 

■ 재정의 (오버라이딩, 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

 

https://bit.ly/37BpXiC

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

 

포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.