Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[줄라이 & 나무 & 고사리] 인터페이스란? #38

Open
gogosilver opened this issue Dec 28, 2021 · 7 comments
Open

[줄라이 & 나무 & 고사리] 인터페이스란? #38

gogosilver opened this issue Dec 28, 2021 · 7 comments

Comments

@gogosilver
Copy link
Collaborator

  1. 인터페이스와 구현을 분리하는 방법은 어떤 것이 있을까?
  2. 그렇다면 인터페이스는 무엇인가?
  3. 인터페이스 구현 세부사항을 노출하는 경우는?
@yim2627
Copy link
Collaborator

yim2627 commented Dec 29, 2021

1 질문 같은 경우엔 검색해본 결과 브릿지 패턴이라는 것이 있네요.
https://lktprogrammer.tistory.com/35

@hwangjeha
Copy link

hwangjeha commented Dec 29, 2021

  1. 인터페이스와 구현을 분리하는 방법은 어떤 것이 있을까?
    저도 인터페이스와 구현을 분리하는 방법은 메서드를 잘 나누자 정도로 생각하고 있었는데
    지성이 링크 남겨주신 브릿지 패턴에 대해서도 한번 공부해 봐야겠습니다.

  2. 그렇다면 인터페이스는 무엇인가?

  • 객체가 다른 객체들과 메시지를 주고 받을 수 있는 창구 라고 생각합니다.
    전 객체 외부에 노출된 메서드나 프로퍼티라고 생각했습니다.
  1. 인터페이스 구현 세부사항을 노출하는 경우는?
  • 외부에 노출된 인터페이스(메서드, 프로퍼티) 내부에 또 다른 메서드가 노출되어 있는 상황 아닐까요? 말로 설명하려니 어렵네요.
// 외부로 노출할 인터페이스(메서드) methodA(), methodB()

struct SomeStruct {
    func methodA() { // 외부에 노출된 인터페이스
        methodB() // 구현 세부사항
    }

    func methodB() { // methodA()의 구현 세부사항이지만 외부로 노출된 인터페이스이기도 함.
        // ...
    }
}

// 개선?
struct SomeStruct {
    func methodA() { // 외부에 노출된 인터페이스
        // methodA에서는 methodB의 기능이 필요함
        methodA구현()
    }

    func methodB() { // 외부에 노출된 인터페이스
        methodB구현()
    }

    private func methodA구현() {
        methodB구현() 
    }

    private func methodB구현()  {

    }
}

@yanghojoon
Copy link
Collaborator

yanghojoon commented Dec 29, 2021

  1. 인터페이스와 구현을 분리하는 방법은 어떤 것이 있을까?

찾아보니 브릿지 패턴, 어댑터 패턴 등이 있는 것 같은데 아직 어떻게 적용하는지는 정확히 모르겠네요...
참고: https://velog.io/@kante/%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4-%EB%B0%8F-%EB%B6%84%EB%A6%AC

  1. 그렇다면 인터페이스는 무엇인가?

저는 인터페이스가 객체 간에 상호작용을 할 수 있도록 어떤 메세지를 전달할 지 정해진 객체( -> 프로토콜)라고 생각합니다.
책 p162에서도 다음과 같이 인터페이스를 설명하고 있습니다.

서로 상호작용할 수 있게 이어주는 방법이나 장치

  1. 인터페이스 구현 세부사항을 노출하는 경우는?

인터페이스 내 대부분의 구현은 은닉화해놓고, 이를 사용할 수 있도록 캡슐화되어 있는 메서드만 노출시키는 것이 좋지 않을까 생각이 됩니다!

@gogosilver
Copy link
Collaborator Author

  1. 정보은닉을 위해 사용되는 몇 가지 방법들이 그 대답이 될 수 있을 것 같습니다. 우선 제가 떠올리는 큰 방법은 두 가지 정도인데요.
    1. 접근제어
    2. 간접참조

위에서 지성이 적어주신 브릿지 패턴을 swift에 적용하면 간접참조에 해당하지 않을까 추측되네요.

  1. 인터페이스를 프로토콜로 보는 경우가 많은데, 저는 조금 더 확장하여 바라봐야 한다고 생각합니다.

    ... 그러나 실제로 인터페이스는 외부에서 접근 가능한 공개된 인터페이스와 내부에서만 접근할 수 있는 감춰진 인터페이스로 구분된다. 내부에서만 접근 가능한 사적인 인터페이스와 구분하기 위해 외부에 공개된 인터페이스를 공용 인터페이스라고 한다.

    저는 이 부분을 읽으면서, 인터페이스란 외부 혹은 내부로 분리될 수 있는 모든 프로퍼티나 메서드 라벨(?) 의 집합이라고 판단하였습니다. 아래는 찰리의 코멘트의 일부입니다.

    🤔 자바의 인터페이스(Swift의 Protocol) 과는 다르게 사용하였습니다. 워낙 다양한 의미를 가진 단어이고, 저는 자동완성을 했을 때 'Node' 라는 기능(인터페이스)이 노출되지 않았으면 하는 맥락에서 말씀드렸습니다.
  2. 의도를 가지고 노출하는 경우는 그다지 없지 않을까 싶습니다. 해당하는 경우인지는 모르겠지만, 클래스로 관리되는 참조 타입의 데이터 정도...?

@hayeonhee
Copy link
Contributor

  1. 책 219쪽에 따르면 각 객체를 협력이라는 문맥에서 떼어내어 수신 가능한 메시지만 추려내면 객체의 인터페이스가 된다 고 합니다.
    수신 가능한 메세지는 메세지를 사용했을 때 해당 객체가 할 행동이라고 바꾸어 말할 수 있을 것같습니다. 그래서 인터페이스는 일종의 (그렇게 행동하겠다는) 약속이라고 생각하고 있습니다.

@hayeonhee
Copy link
Contributor

hayeonhee commented Dec 29, 2021

  1. 저도 이런 상황이 있을지 궁금합니다. 허황이 남겨주신 원 코드를 보았을 때 method B() 를 안보이도록 가려도 되지 않을까 생각했는데요!
    private으로 지정되어 있다면 구현에 해당할 것같다고 생각하고 있습니다.

@hayeonhee hayeonhee added this to the 07 함께 모으기 milestone Dec 29, 2021
@yeahg-dev
Copy link
Collaborator

인터페이스는 상호작용할 수 있는 창구라고 이해했습니다.

책의 164p의 객체가 다른 객체와 상호작용할 수 있는 유일한 방법은 '메시지 전송' 이다라고 설명한 것에 비춰봤을 때,
인터페이스 = 메시지 인것 같습니다.

다른 객체가 다른 객체에게 접근하고 요청할 수 있는 방법은 메서드와 프로퍼티를 통해서뿐인 것 같다고 생각했습니다.
즉, 인터페이스 = 메시지 = 메서드, 프로퍼티 이지 않을까요?

제가 생각해본 인터페이스와 구현을 분리하는 방법으론

  1. 외부에 제공할 메서드(공용 인터페이스)는 접근제어로 외부에서 접근 가능하도록 하고, 메서드 내부 구현은 객체내부에서만 수정가능 하도록 하는 것
  2. 프로토콜로 메시지의 리스트만 정의하고, 객체가 프로토콜을 채택해서 상세 구현을 해서 분리하는 것

이 있다고 생각했습니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants