- This topic has 12개 답변, 4명 참여, and was last updated 4 years, 8 months 전에 by HyunJi.
-
글쓴이글
-
-
HyunJi참가자
- 글작성 : 9
- 답글작성 : 10
안녕하세요!
책으로 Swift를 공부하다가 아래와 같은 예제를 보게되었습니다.
`protocol Machine {
func join()
}protocol Wheel: Machine {
func lotate()init(name: String, currentSpeed: Double)
}
class Vehicle {
var currentSpeed = 0.0
var name = “”init(name: String, currentSpeed: Double) { self.name = name self.currentSpeed = currentSpeed }
}
class Car: Vehicle, Wheel {
required override init(name: String, currentSpeed: Double = 0.0) {
super.init(name: name, currentSpeed: currentSpeed)
}func join() { // join parts } func lotate() { print("\(self.name)의 바퀴가 회전합니다.") }
}
class Carpet: Vehicle, Machine {
func join() {
// join parts
}
}var translist = Vehicle
translist.append(Car(name: “자동차”, currentSpeed: 10.0))
translist.append(Carpet(name: “양탄자”, currentSpeed: 15.0))for trans in translist {
if let obj = trans as? Wheel {
obj.lotate()
} else {
print(“(trans.name)의 하위 타입 변환이 실패했습니다.”)
}
}`이 예제에서 Machine과 Wheel은 프로토콜로 선언했고 Vehicle, Car, Carpet은 클래스로 선언했습니다.
공부를 할 때 기능 단위로 프로토콜로 구조를 짠다고 알고있었는데 그렇다면 위의 예제에서 Machine은 기능 단위로 보이지 않아서 약간은 애매해서 질문드립니다.
보통 프로토콜과 클래스의 기준은 어떻게 나누시나요?
2020-04-01 오후 6:39 #5666 -
야곰키 마스터
- 글작성 : 37
- 답글작성 : 579
마크다운에서 여러줄 코드블럭은 백틱 세개를 씁니다. 한 개는 인라인(한 줄 안에서) 코드입니다.
백틱 세개 뒤에 언어이름을 명시하면 언어에 맞게 코드 하이라이팅이 가능합니다.
2020-04-01 오후 6:49 #5678 -
멍단비참가자
- 글작성 : 10
- 답글작성 : 98
일단 질문에 대한 대답부터 먼저 말씀드리면, 질문이 모호해서 잘 이해가 가질 않아요.
예를들어, Class와 Struct를 사용하는 기준은 어떻게 나누시나요? 라는 질문이면 이해가 가는데
음,, 기준. 기준이라.. Protocol과 Class는 어떻게 보통 어떻게 사용되나요? 정도가 낫겠네요. ㅎㅎ
일단은 질문하신 의도를 제가 나름대로 이해?한대로 설명은 해볼게요.
먼저 Class와 Protocol의 정의부터 짧게 짚고 넘어가면,
<h1> </h1>
- Class를 흔히들 어떤 설계도,
혹은 붕어빵 기계의 틀이라고 표현을 합니다.개념오류 아래참조 - Protocol은 Class같은 것들이 특정 역할을 수행하기 위해서 꼭 가져야 하는 메서드, 프로퍼티, 기타 요구사항들을 준수할 수 있게 강제하는 역할을 하죠.
그리고 질문에 적어주신 글 기준으로 보면,
Machine이라는 Protocol은 기계니까 시동을 거는 기능을 하는 join()이라는 메소드를 정의합니다.
Wheel도 Protocol은 마찬가지로 바퀴(타이어가없지만 편의상 바퀴라고 표현할게요)가 굴러가야하니까 rotate()라는 메소드를 정의하죠.
그리고 Vehicle가 있습니다. 이름을 보니 오토바이를 뜻하나보네요. 이녀석은 속도와 이름이라는 속성을 가지고 있죠. 아무런 기능은 없네요.
그러면 Vehicle은 오토바이가 맞을까요? 아마 아닐겁니다. 오토바이는 키를 꽂아서 시동도 걸고, 달릴 수도 있어야 하겠죠.
그러면 오토바이가 오토바이처럼 되려면 어떻게 해야 할까요? 시동을걸고(join) 달릴수있게(rotate) 해당 기능을 추가해주면 되겠죠.
Class안에 해당 메소드를 구현하면 될겁니다.
그렇다면 Class 안에 해당 메소드를 구현하면되는데 왜 굳이 Protocol로 나눌까요? 헷갈리게 말이죠.
정답은 이렇습니다. 오토바이만 달릴수있나요? 오토바이만 시동걸수있구요? 아니죠. 자동차도 되고, 전동 킥보드도되고, 심지어는 비행기도 휠이 있죠.
- Protocol로 정의해놓는다면, 오토바이가 아니라 자동차나 킥보드, 비행기에도 Protocol을 사용할 수 있습니다.
- 또한 Protocol을 ‘준수’하면 해당 기능은 필수적으로 구현해야 합니다. 구현하지 않으면 에러가 발생하죠. 이 말인 즉슨, Class의 정의부에 해당 Protocol을 준수한다고 정의된다면 해당 Class는 시동걸 수있고 달릴 수있다는 걸 해당 Class를 보는 사람이 보장받을 수 있죠. 안전?하네요. 때에따라서 몇천줄이 될 수 있을지 모르는 Class가 해당 Protocol을 준수하고 있으니 난 비행기가 뭔지는 모르지만, 그것이 적어도 시동을 걸 수 있고 달릴 수 있다는 것은 알 수 있겠네요.
추가사항:
조금 헷갈리실까봐 적을까 말까 했는데, 적는게 나을 것 같긴 해요. 만약에 이해가 안되시면 일단 위에만 보시고, 이 아래는 나중에 보세요 ㅎㅎ
음, 프로토콜을 준수한다고 해당 기능을 ‘무슨일이 있어도’ 구현해야 하는 건 아니에요. 꼭 필요한 건 강제하고 아닌건 선택할 수 있죠.
대표적인 예로는 테이블뷰의 UITableViewDelegate 프로토콜을 참고할 수 있을 거에요.
또한, optional이 아니더라도 프로토콜을 준수하는 클래스의 코드 중복을 피하기 위해 Extension을 이용해서 미리 초기 구현 해놓을 수도 있어요.
(이건 프로토콜지향프로그래밍(POP), Protocol+Extension등의 키워드로 추가 공부를 해보시면 될것같아요. )만약에 초기구현과 기능이 다르게 하고 싶으시다면 원하시는 기능에 맞게 재정의해서 쓰시면 되지요.
코드 잘보이게 글 수정은 하셔야할 것 같아요. 보기가 좀 힘들긴 하네요. ㅎㅎ
나중에 보실 분들도 있을테니 수정해주시는 것이 좋다고 사료됩니다.
2020-04-02 오전 9:38 #5901-
야곰키 마스터
- 글작성 : 37
- 답글작성 : 579
장문의 상세한 답변 정말 멋지네요!
아마 현지님께 많은 도움이 될 것 같습니다.
좋은 글이지만 제 사견을 좀 붙이자면, 클래스와 객체의 관계를 붕어빵 틀과 붕어빵의 관계로 표현하는 것은 큰 오해의 소지가 있기 때문에 지양하는 것이 좋을 것 같습니다.
그 이유에 대해서는 아래 링크의 글이 잘 설명해 주고 있는 것 같아서 링크로 이유를 대신합니다.
https://simsimjae.tistory.com/2772020-04-02 오후 3:36 #5927-
-
-
-
멍단비참가자
- 글작성 : 10
- 답글작성 : 98
약간 찾아보니 html5부터 strike가 없어지고 방금 말씀하신 s하고 del이 새로 생겼나봅니다.
블로그 참조할게요. https://ckbcorp.tistory.com/636
2020-04-02 오후 4:09 #5960
-
-
-
-
글쓴이글
- 답변은 로그인 후 가능합니다.