프로그래밍iOS 개발자

스위프트에서 상속(inheritance)의 특징은 무엇이며, 어떻게 구현되며, 다른 OOP 언어와 비교할 때 어떤 제한이 있습니까?

Hintsage AI 어시스턴트로 면접 통과

답변.

스위프트의 상속은 전통적인 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). 각 클래스는 다중 계층 구조를 통해 상속받기보다는 필요한 프로토콜을 구현합니다.

장점: 동작의 구성이 더 유연하며, 기존 코드를 변경하지 않고도 새로운 동물 유형을 쉽게 추가할 수 있습니다.

단점: 프로토콜 지향 프로그래밍에 대한 더 나은 이해가 필요하며, 처음에는 더 복잡할 수 있습니다.