[TIL] Swift 문법 상속(Inheritance)

2023. 5. 5. 15:48·Swift/문법
728x90

swift

상속(Inheritance)

  • class는 메소드, 프로퍼티와 다른 특징을 다른 클래스로 부터 상속할 수 있음
  • Swift에서 클래스가 다른 타입과 구분되는 근본적인 요소
  • 저장된 프로퍼티, 계산된 프로퍼티 상관없이 상속받은 프로퍼티에 프로퍼티 옵저버를 설정하여 값 설정에 반응

기반 클래스 정의 (Defining a Base Class)

  • 다른 어떤 클래스로부터 상속받지 않은 클래스를 기반 클래스라고 함
class Bulmang {
	 var age = 25
	 var description: String {
			return "bulmang's age is \\(age)"
		}
	func developApp() {
		
	}
}
print("Bulmang: \\(Bulmang.age)")
// Bulmang: bulmang's age is 25

서브클래싱(Subclassing)

  • 서브클래싱(상속)을 하면 부모로 부터 성격을 상속받고 자기 자신 고유 특성도 추가 가능
  • 서브클래싱하여 새 클래스를 선언하는 코드는 다음과 같음
class SomeSubclass: SomeSuperclass {
    // subclass definition goes here
}
// Bulmang 클래스를 상속(서브클래싱)하여 Develop클래스를 선언하면 
class Develop: Bulmang {
	var swift = false
}
// 인스턴스화(객체 생성)
let develop = Develop()
develop.swift = true

// 고유 속성(상속받은 부모의 속성)도 사용 가능
develop.age = 14

// 서브클래스로 생성된 클래스를 다시 서브클래싱(상속)하는 것도 가능
class Algorithm: Develop{
	var levelZero: Int = 0
}

오버라이딩(Overriding)

  • 서브클래스에서는 부모클래스에서 상속받은 것을 재정의 가능
  • overriding 이라고 하는데,인스턴스 메소드, 타입 메소드, 인스턴스 프로퍼티, 타입 프로퍼티, 서브스크립트 모두 가능
  • 오버라이드를 위해서는 다른 선언 앞에 override 키워드를 붙여줌
  • Swift는 override 키워드를 보면 부모에 그 정의가 있는지 확인

부모클래스의 메소드, 프로퍼티, 서브 스크립트의 접근(Accessing Superclass Methods, Properties, and Subscripts)

  • super키워드와 점문법 혹은 인덱스 구문으로 부모 클래스의 메소드, 프로퍼티, 서브스크립트에 접근
  • super.someMethod, super.someProperty, super[someIndex]

메소드 오버라이드(Overriding Methods)

  • 상속받은 메소드를 오버라이드 하기 위해서는 메소드 선언 앞에 override 키워드를 붙이고 내용에 적어주면 됨
class Work: Bulmang {
    override func developApp() {
        print("SwiftUI Application Develop")
    }
}

let work = Work()
work.developApp()

프로퍼티 오버라이드 (Overriding Properties)

  • 서브 클래스에서는 상속받은 저장된 프로퍼티,계산된 프로퍼티 모두 오버라이드 가능
  • 오버라이드시 프로퍼티의 이름과 타입을 명시
  • 상속받은 읽기전용 프로퍼티도 getter/setter를 정의하여 읽고 쓰기가 가능한 프로퍼티로 변경 가능
    • 반대의 경우는 할 수 없음.
class RealAge: Bulmang {
    var realAge = 24
    override var description: String {
        return super.description + " bulmang's real age is \\(realAge)"
    }
}
var real = RealAge()
real.description

프로퍼티 옵저버 오버라이드 (Overriding Property Observers)

  • 이미 부모클래스에 선언된 프로퍼티 옵저버도 서브클래스에 재정의해 사용 할 수 있음
class RealAge: Bulmang {
    var realAge = 24
    override var description: String {
        return super.description + " bulmang's real age is \\(realAge)"
    }
}
var real = RealAge()
real.description

오버라이드 방지 (Preventing Overrides)

  • 서브클래스에서 특정 methods,property,subscripts가 오버라이드 되는 것을 방지하려면 final
  • final로 선언되면 override를 막을 수 있음
  • 클래스 전체를 final 로 선언해서 클래스 안의 메소드, 프로퍼티 등이 override가 되는 것을 막을 수 있음
class Vehicle {
    final var numberOfWheels: Int {
        return 4
    }
    
    final func startEngine() {
        print("Starting the engine")
    }
}

class Car: Vehicle {
    // 오버라이드를 시도하면 컴파일 에러가 발생합니다.
    // 'numberOfWheels' 프로퍼티는 'final'로 선언되어 있으므로 하위 클래스에서 오버라이드할 수 없습니다.
    override var numberOfWheels: Int {
        return 4
    }
    
    // 'startEngine' 메서드는 'final'로 선언되어 있으므로 하위 클래스에서 오버라이드할 수 없습니다.
    // 컴파일 에러: 'startEngine()' cannot override a 'final' method
    //override func startEngine() {
    //    print("Starting the engine of the car")
    //}
}

모르는 용어

Type Property

  • class, struct , enum에 속하며 타입에 대한 데이터를 저장하고 제공
  • static 키워드를 사용하여 정의
  • class에서는 서브클래싱(상속)
struct Car {
    static var numberOfWheels = 4
    
    var color: String
}

// 타입 프로퍼티에 접근
print(Car.numberOfWheels) // 출력값: 4

// 인스턴스 생성 후 인스턴스 프로퍼티에 접근
let myCar = Car(color: "red")
print(myCar.color) // 출력값: "red"

// 타입 프로퍼티 값 변경, 인스턴스 생성을 하지 않아도 접근 가능 
Car.numberOfWheels = 2
print(Car.numberOfWheels) // 출력값: 2

서브스크립트

  • 인스턴스에 대한 접근을 제공하는 단축 구문
  • 인스턴스를 Array,Dictionary등과 같은 컬렉션 Type으로 사용할 수 있도록 함
  • 매개변수와 반환타입을 가지는 메소드와 유사한 형태로 정의
struct MyArray {
    private var storage: [Int] = []
    
    subscript(index: Int) -> Int {
        get {
            return storage[index]
        }
        set(newValue) {
            storage[index] = newValue
        }
    }
}

var arr = MyArray()
arr[0] = 1 // 서브스크립트를 사용하여 요소에 접근 및 값 변경
print(arr[0]) // 출력값: 1

// 서브스크립트는 index라는 매개변수를 받으며, 해당 매개변수는 배열 요소의 인덱스를 나타냄
// 서브스크립트의 반환 타입은 Int로 지정되어 있으며, get 블록에서 배열 요소에 접근하여 값을 반환하고, 
//  set 블록에서는 전달된 새로운 값을 해당 인덱스의 배열 요소에 할당

super

  • 부모 클래스에 접근하기 위한 키워드
  • 자식이 부모의 메소드, 프로퍼티등을 오버라이딩 하거나 호출할 때 super키워드를 사용
  • 부모 클래스의 기능 확장
    • 기존 기능을 유지후 새로운 기능 추가
  • 부모 클래스의 초기화 메소드 호출
    • 초기화 메소드 호출X 부모 property 초기화가 안될 수 있음
  • 부모 클래스의 프로퍼티 호출
    • 자식이 부모클래스의 프로퍼티에 접근 할 수 있음

프로퍼티 옵저버

  • 프로퍼티의 변화를 감지하고 변화에 대응하여 특정 동작을 수행 시킴
  • willSet 값이 변경 되기전에 실행
  • didSet 값이 변경된 후에 실행
    • oldValue는 프로퍼티 옵저버에서 이전값에 접근할 수 있도록 제공되는 상수 (didSet에서 사용)
class Academy {
    var task: String {
        didSet {
            print("\\(oldValue)에서 \\(task)로 변경 되었음")
        }
    }
    init(task: String) {
        self.task = task
    }
}

let academy = Academy(task: "MC1")
academy.task = "MC2"

// Print MC1에서 MC2로 변경 되었음
728x90

'Swift > 문법' 카테고리의 다른 글

[TIL] Swift 문법 초기화(Initializer) - 2  (1) 2023.05.11
[TIL] Swift 문법 초기화(Initialization) - 1  (0) 2023.05.10
[TIL] Swift 문법(Subscripts)  (0) 2023.05.03
[TIL] Swift 문법 메소드(Methods)  (0) 2023.04.28
[TIL] Swift 문법 클래스와 구조체  (0) 2023.04.27
'Swift/문법' 카테고리의 다른 글
  • [TIL] Swift 문법 초기화(Initializer) - 2
  • [TIL] Swift 문법 초기화(Initialization) - 1
  • [TIL] Swift 문법(Subscripts)
  • [TIL] Swift 문법 메소드(Methods)
bulmang
bulmang
모바일 개발자 도전
  • bulmang
    bulmang
    bulmang
  • 전체
    오늘
    어제
    • 분류 전체보기 (208)
      • 알고리즘 (68)
        • List (3)
        • Two Pointer (6)
        • Binary Search (4)
        • Prefix Sum (3)
        • Sort (4)
        • Brute Force (5)
        • Array (2)
        • String (4)
        • 프로그래머스 (12)
        • 백준 (9)
        • Queue (2)
        • Stack (2)
        • Recursion (12)
      • Computer Science (16)
        • Computer Architecture (6)
        • Operating System (5)
        • Network (2)
        • 기타 (2)
        • System Programming (1)
      • Swift (70)
        • 개발 (24)
        • 정리 (25)
        • 문법 (20)
      • Flutter (24)
      • 기타 (12)
        • 후기 (12)
      • Git (6)
      • Ios 오픈소스 (5)
      • UI 디자인 (5)
      • AppleScript (2)
  • 링크

    • Notion
    • Github
  • 태그

    개발
    Apple Developer Academy
    재귀
    피플
    Swift
    today i learned
    riverpod
    컴퓨터구조
    SwiftUI
    문법
    IOS
    협업
    til
    Xcode
    백준
    FLUTTER
    알고리즘
    코딩테스트
    Java
    자료구조
  • 최근 댓글

  • 최근 글

  • 인기 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.2
bulmang
[TIL] Swift 문법 상속(Inheritance)
상단으로

티스토리툴바