일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 영화
- 영화후기
- 코딩공부
- 영화일기
- sopt 35기
- 영화기록
- 오블완
- 자바공부
- 플러터
- 영화리뷰
- 일기
- 인프런
- java
- 자바 스터디
- Flutter
- 백준
- Flutter Toy Project
- 백엔드
- backend
- inflearn
- 리뷰
- 키노
- 스프링 입문
- sopt ios
- SOPT
- toy project
- 티스토리챌린지
- 새벽녘 소소한 기록
- 자바
- 토이프로젝트
- Today
- Total
새벽의 기록
[SOPT] 고량주 3주차 이론 과제 본문
1. Static & Dynamic Dispatch에 대해서 알아봅시다. (민서)
2. Override에 대해서 알아봅시다. (한열)
3. 프로토콜 지향 프로그래밍, 객체 지향 프로그래밍에 대해서 알아봅시다. (송희)
4. Equatable, Hashable, Comparable에 대해서 알아봅시다. (유빈)
Override
애플공식문서
https://docs.swift.org/swift-book/documentation/the-swift-programming-language/inheritance/
💡"하위 클래스는 슈퍼클래스로부터 상속되는 인스턴스 메서드, 유형 메서드, 인스턴스 속성, 유형 속성 또는 구독자의 고유한 사용자 지정 구현을 제공할 수 있습니다. 이것을 오버라이딩이라고 합니다."
override는 상속받은 클래스의 메서드나 프로퍼티 등을 재정의할 때 사용되는 키워드. 이 키워드를 통해 상위 클래스에서 정의된 기능을 하위 클래스에서 덮어씌우거나 확장할 수 있다.
Swift에서는 상위 클래스의 메서드를 오버라이드할 때 반드시 override 키워드를 명시해야 한다.
→ 이를 통해 의도치 않은 오버라이드를 방지하고 코드의 가독성을 높이는 데 도움을 준다.
override의 사용 목적
- 상위 클래스의 기능 확장
→ 상위 클래스의 기본 동작을 하위 클래스에서 변경해, 특정 상황에 맞게 동작을 변경할 수 있다. - 특정 기능 추가
→ 상위 클래스의 동작을 그대로 수행하면서 하위 클래스만의 기능을 추가할 수 있다. - 메서드, 프로퍼티의 다형성
→ 다형성을 지원하여 동일한 이름의 메서드를 호출해도 클래스의 타입에 따라 다른 동작을 수행할 수 있다.
override 사용 예시
class Animal {
func sound() {
print("대충 동물 울음소리")
}
}
class Cat: Animal {
func sound() {
print("야옹")
}
}
// Error: Overriding declaration requires an 'override' keyword
Animal을 상속받은 Cat에서 sound 메서드를 쓰려고 하면 "override"란 키워드를 써야 한다며 에러가 남
→ 이미 상속받는 클래스인 Human 클래스에 동일한 메서드가 있기 때문
→ 오버라이딩 하고 싶은 메서드 앞에 override란 키워드 붙여주기
1. 메서드 오버라이딩
상위 클래스의 메서드를 하위 클래스에서 재정의
class Animal {
func sound() {
print("대충 동물 울음소리")
}
}
class Cat: Animal {
override func sound() {
print("야옹")
}
}
let animal: Animal = Dog()
animal.sound() // 야옹
Cat 클래스는 Animal 클래스의 sound() 메서드를 override해서 고양이 울음소리를 출력하도록 변경.
2. 프로퍼티 오버라이딩
상속받은 프로퍼티를 오버라이딩하여 해당 속성에 대한 getter, setter를 제공하거나 상속받은 프로퍼티 값의 변경을 추적할 수 있도록 프로퍼티 옵저버를 추가할 수 있다.
→ 연산 속성을 추가할 수 있고, 프로퍼티 옵저버를 추가할 수 있음
하위 클래스에서는 상속된 프로퍼티의 특성이 저장 프로퍼티인지, 연산프로퍼티인지 알 수 없으며 상속받은 프로퍼티의 이름과 타입 정도만 알고 있다.
→ 따라서 오버라이딩할 경우 프로퍼티의 이름과 타입을 반드시 명시해야한다.
저장 프로퍼티에 "저장" 속성을 추가하는 오버라이딩은 안 될까?
class Human {
var name = "Kim"
}
class Teacher: Human {
override var name: String = "Kim2"
}
// Error: Cannot override with a stored property 'name'
안됨.
저장 프로퍼티 name을 오버라이딩 할 수 없다는 에러 발생
→ 연산 속성만 추가가능
상위 클래스의 프로퍼티를 하위 클래스에서 연산
class Human {
var name = "Kim"
var fullName: String {
return self.name
}
}
class Teacher: Human {
override var fullName: String {
return self.name + "Hanyeol"
}
}
let human = Human()
print(human.fullName)
let teacher = Teacher()
print(teacher.fullName)
// Kim
// KimHanyeol
속성 감시자(Property Observer) 도 오버라이딩 할 수 있음.
willSet 은 값이 변경되기 직전에 호출, didSet 은 값이 변경된 직후 호출
import Foundation
class Person {
var name: String = "Anonymous" {
willSet {
print("실행되기 직전 이름1: \\(name)")
}
didSet {
print("실행 직후 이름1: \\(name)")
}
}
}
class Person2: Person {
override var name: String {
willSet {
print("실행되기 직전 이름2: \\(name)")
}
didSet {
print("실행 직후 이름2: \\(name)")
}
}
}
let Park = Person2()
Park.name = "Park"
// 실행되기 직전 이름2: Anonymous
// 실행되기 직전 이름1: Anonymous
// 실행 직후 이름1: Park
// 실행 직후 이름2: Park
3. super 키워드와 함께 사용하기
오버라이드된 메서드나 프로퍼티에서 super 키워드를 사용하면 상위 클래스의 원래 메서드나 프로퍼티도 호출할 수 있다.
class Animal {
func move() {
print("동물은 꿈틀꿈틀")
}
}
class Fish: Animal {
override func move() {
super.move() // 상위 클래스 메서드 호출
print("물.. 물코기")
}
}
let fish = Fish()
fish.move()
// 동물은 꿈틀꿈틀
// 물.. 물코기
오버라이드할 수 없는 멤버
final 키워드를 사용하면 특정 메서드, 프로퍼티, 서브스크립트가 하위 클래스에서 오버라이드되는 것을 막을 수 있고, 클래스 자체에도 적용해서 상속이 불가능하게 할 수 있다.
class Animal {
final func eat() {
print("냠냠")
}
}
class Dog: Animal {
override func eat() {
print("쩝쩝")
}
}
// 에러: 'eat' 메서드는 final이기 때문에 오버라이드할 수 없음
'SOPT' 카테고리의 다른 글
[SOPT] 고량주 2주차 이론 과제 (0) | 2024.11.08 |
---|---|
[SOPT] 고량주 1주차 이론 과제 (0) | 2024.11.07 |
[SOPT] 35기 iOS 파트 합격 후기 (4) | 2024.09.26 |