[Swift] 상속 (Inheritance)

김형근·2024년 7월 21일

[Swift] 문법

목록 보기
12/20

🍎 Swift 상속 (Inheritance)

  • Swift의 상속은 클래스와 프르토콜에서만 가능
  • 열거형과 구조체에서는 상속이 불가능
  • 다중 상속을 지원하지 않음
  • 상속을 통해 기존 클래스의 기능을 확장하거나 변경할 수 있습니다.

🍏 1. 클래스의 상속과 재정의

  • 클래스는 다른 클래스의 속성과 메서드를 상속받아 재사용 가능
  • 상속받은 클래스를 서브클래스(Subclass), 상속하는 클래스를 슈퍼클래스(Superclass) 라고 합니다.
  • 서브클래스는 슈퍼클래스의 모든 속성과 메서드를 그대로 상속받거나, 필요에 따라 재정의(Override) 할 수 있습니다.

🧃 1.1 클래스 정의와 상속

// 기본 클래스 정의
class Person {
    var name: String = ""
    
    // 인스턴스 메서드: 인스턴스마다 다른 동작을 할 수 있는 메서드
    func selfIntroduce() {
        print("저는 \(name)입니다.")
    }
    
    // final 키워드를 사용하여 재정의를 방지할 수 있습니다.
    // 이 메서드는 서브클래스에서 재정의할 수 없습니다.
    final func sayHello() {
        print("hello")
    }
    
    // 타입 메서드: 클래스 자체에서 호출할 수 있는 메서드
    // static으로 정의된 메서드는 재정의할 수 없습니다.
    static func typeMethod() {
        print("type method - static")
    }
    
    // class로 정의된 메서드는 서브클래스에서 재정의할 수 있습니다.
    class func classMethod() {
        print("type method - class")
    }
    
    // final class로 정의된 메서드는 재정의할 수 없습니다.
    final class func finalClassMethod() {
        print("type method - final class")
    }
}

// 상속을 통해 Person 클래스를 기반으로 새로운 Student 클래스 정의
class Student: Person {
    var major: String = ""
    
    // 상위 클래스의 메서드를 재정의
    override func selfIntroduce() {
        print("저는 \(name)이고, 전공은 \(major)입니다.")
    }
    
    // 재정의 가능한 타입 메서드 재정의
    override class func classMethod() {
        print("overridden type method - class")
    }
    
    // static으로 정의된 메서드는 재정의할 수 없습니다.
    // override static func typeMethod() {  }
    
    // final로 정의된 메서드는 재정의할 수 없습니다.
    // override func sayHello() {  }
    // override class func finalClassMethod() { }
}
  • 'Person' 클래스는 기본적인 속성과 메서드를 정의합니다.
  • 'Student' 클래스는 'Person' 클래스를 상속받아 추가적인 속성과 메서드를 정의하며 상위 클래스의 메서드를 재정의할 수 있습니다.

🧃 1.2 상속 클래스 사용 예시

// Person 클래스의 인스턴스 생성
let geuni: Person = Person()
geuni.name = "geuni"

// Student 클래스의 인스턴스 생성
let hana: Student = Student()
hana.name = "hana"
hana.major = "Swift"

// Person 클래스의 메서드 호출
geuni.selfIntroduce() // 저는 geuni입니다.

// Student 클래스에서 재정의한 메서드 호출
hana.selfIntroduce() // 저는 hana이고, 전공은 Swift입니다.

// 타입 메서드 호출
Person.classMethod() // type method - class
Person.typeMethod() // type method - static
Person.finalClassMethod() // type method - final class

Student.classMethod() // overridden type method - class
Student.typeMethod() // type method - static
Student.finalClassMethod() // type method - final class
  • 'geuni'는 'Person' 클래스의 인스턴스이고, 'hana'는 'Student' 클래스의 인스턴스 입니다.
  • 'Student' 클래스는 'Person' 클래스의 메서드를 재정의하여 자신의 특성에 맞게 동작합니다.
  • 'typeMethod'와 'finalClassMethod'는 재정의가 불가능한 메서드입니다.

🧃 1.3 클래스 상속의 개념 요약

  • 상속(Inheritance): 새로운 클래스가 기존 클래스의 속성과 메서드를 물려받아 사용하는 것

  • 슈퍼클래스(Superclass): 상속을 제공하는 클래스

  • 서브클래스(Subclass): 상속을 받는 클래스

  • 재정의(Override): 서브클래스에서 슈퍼클래스의 메서드를 변경하는 것

  • final: 클래스 또는 메서드 앞에 사용하여 상속이나 재정의를 방지하는 키워드

  • 인스턴스(Instance): 클래스의 설계도에 따라 메모리에 할당된 실제 객체.
    인스턴스는 클래스에서 정의한 속성과 메서드를 실제로 사용.
    각각의 인스턴스는 독립적인 속성 값을 가질 수 있음.

  • 메서드(Method): 클래스 내부에 정의된 함수. 메서드는 클래스의 인스턴스가 특정 동작을 수행할 수 있도록 합니다.
    메서드는 인스턴스 메서드와 타입 메서드로 나눌 수 있습니다.

    • 인스턴스 메서드(Instance Method): 인스턴스에 속하는 메서드로 인스턴스의 속성을 읽거나 수정할 수 있습니다. 'self'를 통해 인스턴스 자신을 참조합니다.
    • 타입 메서드(Type Method): 클래스 자체에 속하는 메서드로 인스턴스와는 독립적으로 호출됩니다. 'static' 또는 'class' 키워드를 사용하여 정의합니다.

🧃 1.4 상속과 재정의의 유용성

  • 코드 재사용: 기존 클래스의 코드를 재사용하여 새로운 클래스를 쉽게 만들 수 있습니다.
  • 유지 보수: 코드를 일관되게 유지할 수 있으며, 변경이 필요한 경우 슈퍼클래스에서 한 번의 수정으로 모든 서브클래스에 반영할 수 있습니다.
  • 다형성(Polymorphism): 동일한 메서드 호출이 객체의 실제 타입에 따라 다른 동작을 수행할 수 있습니다.
    코드의 유연성과 확장성 높임.
profile
꾸준히 기록하기

0개의 댓글