-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path20-Inheritance, Protocol
More file actions
112 lines (91 loc) · 10.6 KB
/
20-Inheritance, Protocol
File metadata and controls
112 lines (91 loc) · 10.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
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. 제네릭과 결합: 제네릭을 통해 프로토콜 준수 타입에 대해 유연한 다형성을 구현합니다.
#### 다형성이란?
- 객체 지향 프로그래밍에서 다형성이란 한 타입의 참조변수를 통해 여러 타입의 객체를 참조할 수 있도록 만든 것을 의미합니다. 좀 더 구체적으로, 상위 클래스 타입의 참조변수로 하위 클래스의 객체를 참조할 수 있도록 하는 것입니다.
- 즉, 하나의 타입만으로 여러 가지 타입의 객체를 참조할 수 있어 보다 간편하고 유연하게 코드를 작성하는 것이 가능해집니다.
- 또한, 프로토콜(인터페이스)을 통해 간접적으로 연결되어 결합도를 낮출 수 있습니다.