구조를 짤 때 protocol과 class의 기준이 있을까요?

3 답변 글타래를 보이고 있습니다
  • 글쓴이
    • 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은 기능 단위로 보이지 않아서 약간은 애매해서 질문드립니다.

      보통 프로토콜과 클래스의 기준은 어떻게 나누시나요?

    • 야곰
      키 마스터
      • 글작성 : 37
      • 답글작성 : 580

      @hyunji-kim

      마크다운에서 여러줄 코드블럭은 백틱 세개를 씁니다. 한 개는 인라인(한 줄 안에서) 코드입니다.

      백틱 세개 뒤에 언어이름을 명시하면 언어에 맞게 코드 하이라이팅이 가능합니다.

       

      • 이 답변은 야곰에 의해 3 years, 12 months 전에 수정됐습니다.
      • 이 답변은 야곰에 의해 3 years, 12 months 전에 수정됐습니다.
    • rabbit
      참가자
      • 글작성 : 3
      • 답글작성 : 9

      코드를 좀 보기 어렵지만;;;

      프로토콜 지향 프로그래밍에서 말하는 방향의 프로토콜만 생각하고 프로토콜이 의미하는바를 명확히 이해하지 못하신거 같아요.

      여러 각도? 관점?에서 기능을 바라보는 것도 필요합니다

    • 멍단비
      참가자
      • 글작성 : 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등의 키워드로 추가 공부를 해보시면 될것같아요. )

      만약에 초기구현과 기능이 다르게 하고 싶으시다면 원하시는 기능에 맞게 재정의해서 쓰시면 되지요.

      코드 잘보이게 글 수정은 하셔야할 것 같아요. 보기가 좀 힘들긴 하네요. ㅎㅎ

      나중에 보실 분들도 있을테니 수정해주시는 것이 좋다고 사료됩니다.

      참고링크
      클래스vs구조체
      프로토콜
      UITableViewDelegate
      프로토콜지향프로그래밍

      • 이 답변은 멍단비에 의해 3 years, 12 months 전에 수정됐습니다.
      • 이 답변은 멍단비에 의해 3 years, 12 months 전에 수정됐습니다. 이유: 개념오류로 인한 취소선 및 링크추가
      • 이 답변은 멍단비에 의해 3 years, 12 months 전에 수정됐습니다.
      • 이 답변은 멍단비에 의해 3 years, 12 months 전에 수정됐습니다.
      • 야곰
        키 마스터
        • 글작성 : 37
        • 답글작성 : 580

        장문의 상세한 답변 정말 멋지네요!
        아마 현지님께 많은 도움이 될 것 같습니다.
        좋은 글이지만 제 사견을 좀 붙이자면, 클래스와 객체의 관계를 붕어빵 틀과 붕어빵의 관계로 표현하는 것은 큰 오해의 소지가 있기 때문에 지양하는 것이 좋을 것 같습니다.
        그 이유에 대해서는 아래 링크의 글이 잘 설명해 주고 있는 것 같아서 링크로 이유를 대신합니다.
        https://simsimjae.tistory.com/277

        • 멍단비
          참가자
          • 글작성 : 10
          • 답글작성 : 98

          아 역시..

          기초가 워낙에 없어서 몰랐네요. 또 한번 배웠습니다.
          개념과 실채, 실체가 없는것에 실체를 불어넣는것이다.

          가르쳐주셔서 감사합니다.

          • 야곰
            키 마스터
            • 글작성 : 37
            • 답글작성 : 580

            아녜요 위의 설명 정말 좋습니다!
            다만 붕어빵 틀의 비유는, 클래스와 객체의 관계를 명확히 알고있는 사람에게는 그럴듯하게 자의적 해석이 가능하지만 그 관례를 모르는 초보자 입장에선 오해를 살만한 여지가 크지요.
            그래서 그런겁니다^^; 좋은 설명 고맙습니다!

            • 멍단비
              참가자
              • 글작성 : 10
              • 답글작성 : 98

              그나저나 슬프게도 취소선이 안먹네요. 회심의 취소선이었는데 ㅎㅎ

              • 야곰
                키 마스터
                • 글작성 : 37
                • 답글작성 : 580

                아… 취소선은 아마도 표준 마크다운 문법이 아니라서요…ㅠㅠ

                깃헙이나 슬렉처럼 몇몇 서비스에서만 먹힐겁니다..

                취소선은 HTML로 하셔야합니다… ‘ㅁ’

                <strike>취소선 줄 글</strike>의 결과 :취소선 줄 글

                • 이 답변은 야곰에 의해 3 years, 12 months 전에 수정됐습니다.
              • 멍단비
                참가자
                • 글작성 : 10
                • 답글작성 : 98

                html5?부터는 strike가 안먹는다는지뭔지 모르겠지만은 잘안되서 메뉴에있는 del 태그 써서 수정했습니다.

                오늘 많이 배워가네요. 감사합니다.

                • 이 답변은 멍단비에 의해 3 years, 12 months 전에 수정됐습니다.
              • 야곰
                키 마스터
                • 글작성 : 37
                • 답글작성 : 580

                헛, 그렇군요! HTML5 부터 strike 태그가 안되는군요!
                del 태그를 써야하나 봅니다…
                아… 안녕 strike
                s 태그로도 된다는데, 차이가 좀 있나봅니다. Hello s tag!

              • 멍단비
                참가자
                • 글작성 : 10
                • 답글작성 : 98

                약간 찾아보니 html5부터 strike가 없어지고 방금 말씀하신 s하고 del이 새로 생겼나봅니다.

                블로그 참조할게요. https://ckbcorp.tistory.com/636

      • HyunJi
        참가자
        • 글작성 : 9
        • 답글작성 : 10

        질문을 애매하게 했는데도 장문에 답변 너무 감사해요 !! 많은 도움이 되었습니다 🙂

3 답변 글타래를 보이고 있습니다
  • 답변은 로그인 후 가능합니다.

logo landscape small

사업자번호 : 743-81-02195
통신판매업 신고번호 : 제 2022-충북청주-1278 호
고객센터 : 카카오톡채널 @yagom