스위프트의 상속은 전통적인 OOP 언어인 Objective-C와 C++에서 온 객체 지향 프로그래밍의 기본 원칙 중 하나입니다. 그러나 스위프트는 타입 안정성과 코드 예측 가능성에 중점을 두면서 이 메커니즘을 크게 제한하고 간소화합니다.
C++ 및 Objective-C와 같은 초기 OOP 언어에서 상속은 코드 재사용 및 클래스 계층 구조 생성을 위해 사용되었습니다. 스위프트는 상속 메커니즘을 의도적으로 제한하여 다중 상속 문제와 복잡한 계층 구조의 문제를 피하고자 했습니다.
고전적인 상속 구현은 여러 가지 문제에 직면합니다: 부모 클래스에 의한 암묵적인 기능 추가, 코드 유지 보수 및 테스트의 복잡성, 다중 상속에서 발생하는 diamond problem (다이아몬드 문제). 스위프트에서는 클래스의 다중 상속을 금지함으로써 이러한 문제를 부분적으로 해결합니다.
스위프트는 클래스의 단일 상속만을 지원합니다. 이는 클래스가 단 하나의 부모 클래스에서만 상속될 수 있음을 의미합니다. 동작의 구성을 위해서는 프로토콜과 그 확장을 사용하는 것이 권장됩니다.
간단한 상속 예제:
class Animal { func speak() { print("Some sound") } } class Dog: Animal { override func speak() { print("Woof!") } } let animal: Animal = Dog() animal.speak() // "Woof!"
주요 특징:
super에 대한 override를 통해 구현됩니다.스위프트에서 let으로 선언된 속성을 서브클래스에서 재정의할 수 있습니까?
아니요. let을 사용하여 선언된 속성은 재정의할 수 없으며 상수입니다. 재정의 가능성을 위해서는 override 수정자가 있는 var 속성을 사용해야 합니다.
스위프트에서 구조체나 열거형이 어떤 동작을 상속합니까?
아니요, 클래스만 서로 상속할 수 있습니다. 구조체(struct)와 열거형(enum)은 상속을 지원하지 않지만 프로토콜을 구현할 수 있습니다.
상속될 수 없는 클래스를 만들 수 있습니까?
예, 클래스 선언 앞에 final 수정자를 사용하세요. 예:
final class Cat { func meow() { print("Meow!") } } // class Siamese: Cat {} // 컴파일 오류
개발자는 동물에 대한 깊은 클래스 계층을 만들었습니다: Animal -> Mammal -> Carnivore -> Dog -> Bulldog. 각 클래스는 새로운 속성이나 메소드를 추가합니다.
장점: 논리가 개체에 따라 분리되어 있습니다.
단점: 계층의 동작 변경 관리가 어렵습니다. 새로운 동물 유형을 추가하려면 여러 기본 클래스를 수정해야 하며, 이는 오류의 위험을 증가시킵니다.
동물 간의 차이를 위해 프로토콜을 사용합니다 (예: Sitter, Hunter). 각 클래스는 다중 계층 구조를 통해 상속받기보다는 필요한 프로토콜을 구현합니다.
장점: 동작의 구성이 더 유연하며, 기존 코드를 변경하지 않고도 새로운 동물 유형을 쉽게 추가할 수 있습니다.
단점: 프로토콜 지향 프로그래밍에 대한 더 나은 이해가 필요하며, 처음에는 더 복잡할 수 있습니다.