diff --git a/LEVEL 1/20-Inheritance, Protocol b/LEVEL 1/20-Inheritance, Protocol new file mode 100644 index 0000000..c234e89 --- /dev/null +++ b/LEVEL 1/20-Inheritance, Protocol @@ -0,0 +1,112 @@ +## 20-Inheritance, Protocol + +### 1. 상속(Inheritance)과 프로토콜(Protocol)의 차이점은 무엇인가요? + +- 상속과 프로토콜은 Swift에서 객체 지향 프로그래밍(OOP) 및 프로토콜 지향 프로그래밍(POP)을 구현하기 위한 두 가지 주요 개념입니다. + +#### 상속(Inheritance) + +- 정의: + - 상속은 클래스가 다른 클래스의 속성과 메서드를 물려받는 기능입니다. Swift에서는 단일 상속만 지원되며, 하나의 클래스는 하나의 부모 클래스만 가질 수 있습니다. +- 사용 목적: + - 상속을 통해 코드 재사용이 가능하며, 부모 클래스의 기능을 확장하거나 수정하기 위해 사용됩니다. +- 예시: + - 부모 클래스에 있는 기본 속성이나 메서드를 자식 클래스에서 사용하거나 오버라이딩하여 고유한 기능을 추가할 수 있습니다. +- 특징: + - 재사용성: 부모 클래스의 속성과 메서드를 자식 클래스에서 그대로 재사용할 수 있습니다. + - 오버라이딩(Overriding): 자식 클래스에서 부모 클래스의 메서드 또는 속성을 재정의할 수 있습니다. + - 단일 상속: Swift는 단일 상속만 허용하므로, 하나의 클래스가 여러 부모 클래스를 상속받을 수 없습니다. + - 사용 범위: 상속은 클래스에서만 사용가능하며, 구조체나 열거형에서는 사용할 수 없습니다. + +#### 프로토콜(Protocol) + +- 정의: + - 프로토콜은 특정 기능이나 속성의 요구 사항을 정의하는 틀입니다. 클래스, 구조체, 열거형이 프로토콜을 채택하고 구현할 수 있습니다. +- 사용 목적: + - 여러 타입이 공통적으로 구현해야 하는 기능을 정의하는 데 사용됩니다. 다중 프로토콜 채택이 가능하므로, 클래스나 구조체, 열거형이 여러 프로토콜을 채택하여 다양한 기능을 구현할 수 있습니다. +- 예시: + - 공통 기능을 정의하고, 각 타입에 맞게 내부 구현을 정의할 수 있습니다. +- 특징: + - 다중 채택: 한 타입이 여러 프로토콜을 채택할 수 있습니다. + - 유연성: 클래스뿐만 아니라 구조체와 열거형에서도 프로토콜을 채택할 수 있어 다양한 타입에서 공통 기능을 정의할 수 있습니다. + - 추상적인 요구 사항 정의: 프로토콜은 실제 구현을 포함하지 않고, 구현해야 할 메서드와 속성의 청사진만 제공합니다. + - 확장 가능성: 프로토콜 익스텐션을 사용해 모든 프로토콜을 채택한 타입에 기본 구현을 제공할 수 있습니다. + +#### 상속과 프로토콜 차이점 + +| 특성 | 상속 | 프로토콜 | +| :--------: | :--------: | :--------: | +| 주요 사용 대상 | 클래스 | 클래스, 구조체, 열거형 | +| 상속 관계 | 단일 상속만 가능 | 다중 프로토콜 채택 가능 | +| 목적 | 코드 재사용 및 클래스 계층 구조 정의 | 특정 기능 요구 사항 정의, 다형성 구현 | +| 오버라이딩 | 메서드 오버라이딩 가능 | 프로토콜 자체에 구현이 없고 채택한 타입이 구현 | +| 확장성 | 클래스 상속 체계 내에서만 확장 가능 | 프로토콜 익스텐션을 통해 모든 타입에 확장 가능 | +| 추상성 | 구체적인 구현 포함 가능 | 요구 사항만 정의, 구현은 타입에서 수행 | + +#### 상속과 프로토콜의 선택 기준 +- 상속은 클래스 계층이 명확하게 정의되어 있고, 자식 클래스가 부모 클래스의 속성과 메서드를 상속받아야 할 때 사용합니다. 상속은 코드 재사용이 필요한 경우와 기본적인 동작을 자식 클래스에서 확장할 때 유용합니다. +- 프로토콜은 클래스뿐만 아니라 구조체와 열거형에서도 사용할 수 있어, 특정 기능을 여러 타입에 걸쳐 공통적으로 구현해야 할 때 적합합니다. 다중 프로토콜 채택이 가능하므로 특적 기능 요구 사항을 여러 타입에서 유연하게 구현할 수 있습니다. +- Swift에서는 상속과 프로토콜을 함께 사용할 수도 있습니다. 클래스 상속을 통해 공통 동작을 물려받으면서, 프로토콜을 채택해 추가적인 기능 요구 사항을 정의할 수 있습니다. + +### 2. 클래스 상속을 사용할 때의 장단점은 무엇인가요? + +#### 클래스 상속의 장점 + +- 코드 재사용: + - 부모 클래스의 속성과 메서드를 자식 클래스에서 그대로 상속받을 수 있어 코드 중복을 줄이고, 코드 재사용성을 높입니다. + - 공통 기능을 부모 클래스에 구현함으로써 여러 자식 클래스에서 공유할 수 있습니다. +- 확장성: + - 상속을 통해 기존 클래스에 기능을 추가하거나, 기존 메서드를 오버라이드하여 특정 동작을 변경할 수 있어, 유지 보수와 확장이 용이합니다. + - 자식 클래스에서 부모 클래스의 기본 동작을 활용하면서 필요한 기능을 추가할 수 있습니다. +- 계층 구조 형성: + - 상송을 사용하면 객체 계층 구조를 정의할 수 있습니다. 이 계층 구조는 개념적으로 연관된 클래스 간의 관계를 명확히하여, 프로그램의 구조를 이해하기 쉽게 만듭니다. + - 상위 클래스와 하위 클래스 간의 계층을 통해 특정 유형의 객체를 그룹화하고 관리하기 쉽습니다. +- 다형성(Polymorphism) 활용: + - 부모 클래스 타입의 참조를 통해 자식 클래스의 인스턴스를 다룰 수 있어, 다형성을 활용한 유연한 코드를 작성할 수 있습니다. + - 이를 통해 자식 클래스의 고유 기능을 통해 동일한 부모 클래스 타입을 확장할 수 있습니다. + +#### 클래스 상속의 단점 + +- 강한 결합 (Coupling): + - 상속은 자식 클래스가 부모 클래스에 의존하게 만들어, 부모 클래스의 변경이 자식 클래스에 영향을 미칠 수 있습니다. + - 부모 클래스의 수정이 필요할 때, 해당 클래스를 상속하는 모든 자식 클래스에서 예상치 못한 오류가 발생할 가능성이 있어 유지보수에 부담이 될 수 있습니다. +- 복잡한 계층 구조: + - 상속 계층이 깊어질수록 클래스 구조가 복잡해져서 가독성과 관리가 어려워집니다. 또한, 다수의 상속 계층이 있는 경우, 클래스 간 관계를 파악하기가 까다로울 수 있습니다. + - 불필요하게 깊은 계층 구조는 설계의 유연성을 떨어뜨리며, 코드의 이해도와 유지 보수를 어렵게 만듭니다. +- 다중 상속 제한: + - Swift는 단일 상속만 허용하기 때문에, 하나의 클래스가 여러 부모 클래스를 상속받을 수 없습니다. + - 여러 부모 클래스로부터 상속이 필요한 경우, 상속 대신 프로토콜을 활용하는 것이 필요합니다. +- 유연성 부족: + - 상속을 통해 자식 클래스는 부모 클래스의 특젓을 물려받지만, 이는 때로는 제한적이어서 모드 상황에 적합하지 않을 수 있습니다. 자식 클래스에서 불필요한 부모 클래스의 기능까지 물려받는 경우도 발생할 수 있습니다. + - 이러 인해 상소보다는 프로토콜을 사용하는 것이 더 유연하고 적합한 경우가 많습니다. +- 캡슐화 문제: + - 상속을 사용하면 부모 클래스의 내부 구현이 자식 클래스에 노출될 수 있어 캡슐화가 깨질 수 있습니다. + - 자식 클래스가 부모 클래스의 세부 구현에 의존하게 되면, 부모 클래스의 내부 구현을 수정할 때 자식 클래스에서 부작용이 발생할 가능성이 있습니다. + +### 3. 다중 상속(Multiple Inheritance)이 불가능한 이유는 무엇인가요? + +- 다이아몬드 문제 (Diamond Problem): + - 다중 상속을 허용하면 동일한 상위 클래스가 두 개 이상의 경로로 상속되는 상황이 발생할 수 있습니다. + - 이런 경우 상속 받는 자식 클래스는 어떤 클래스의 인스턴스를 상속받을지 모호해지며, 속성과 메서드가 중복될 수 있습니다. + - 이러한 문제를 해결하려면 복잡한 규칙을 정의해야 하며, 이는 코드의 복잡성과 오류 가능성을 증가시킵니다. +- 모호성 문제: + - 다중 상속을 통해 부모 클래스들이 동일한 이름의 메서드나 속성을 정의하고 있을 때, 자식 클래스에서 어떤 부모 클래스의 메서드 또는 속성을 사용할지 모호해질 수 있습니다. +- 복잡한 상속 구조: + - 다중 상속을 허용하면 상속 관계가 복잡해지기 쉽습니다. 다수의 부모 클래스를 상속받는 클래스는 여러 부모 클래스에서 가져온 메서드와 속성을 모두 포함하므로, 클래스 간 관계가 복잡해지고 코드의 이해가 어려워집니다. + - 상속 구조가 복잡해지면 클래스 간의 결합도가 높아져 유지보수와 확장성이 떨어질 수 있습니다. + +### 4. 프로토콜 준수(Conformance)를 통해 다형성을 구현하는 방법은 무엇인가요? + +프로토콜 준수를 통해 다형성을 구현하면 특정 프로토콜을 채택한 객체가 해당 프로토콜에서 정의된 요구 사항을 준수하여, 일관된 방식으로 다양한 객체를 처리할 수 있게 해줍니다. 이를 통해 코드의 유연성과 재사용성을 높일 수 있습니다. + + 1. 프로토콜 정의: 공통 기능을 요구하는 프로토콜을 정의합니다. + 2. 타입 구현: 여러 타입이 프로토콜을 채택하여 요구 사항을 구현하고, 각기 다른 방식으로 메서드를 정의합니다. + 3. 다형성 활용: 프로토콜 타입을 사용하여 다양한 객체를 동일한 인터페이스로 처리하고, 다형적인 동작을 구현합니다. + 4. 프로토콜 확장: 기본 메서드 구현을 제공하여 코드 중복을 줄이고, 프로토콜 채택 타입에 공통 동작을 추가할 수 있습니다. + 5. 제네릭과 결합: 제네릭을 통해 프로토콜 준수 타입에 대해 유연한 다형성을 구현합니다. + +#### 다형성이란? + +- 객체 지향 프로그래밍에서 다형성이란 한 타입의 참조변수를 통해 여러 타입의 객체를 참조할 수 있도록 만든 것을 의미합니다. 좀 더 구체적으로, 상위 클래스 타입의 참조변수로 하위 클래스의 객체를 참조할 수 있도록 하는 것입니다. +- 즉, 하나의 타입만으로 여러 가지 타입의 객체를 참조할 수 있어 보다 간편하고 유연하게 코드를 작성하는 것이 가능해집니다. +- 또한, 프로토콜(인터페이스)을 통해 간접적으로 연결되어 결합도를 낮출 수 있습니다.