de-vook / The-Essence-of-Object-Orientation

책 <객체지향의 사실과 오해> 그룹 스터디
18 stars 3 forks source link

[Jiseong & 고사리] 공용 인터페이스를 스위프트의 프로토콜과 동일하게 생각하시나요? #32

Open gogosilver opened 2 years ago

gogosilver commented 2 years ago

공용 인터페이스엔 객체의 공통된 메서드나 프로퍼티를 넣어주고 사용하는데, 이 공용 인터페이스를 자바의 인터페이스 역할을 한다고 알려진 스위프트의 프로토콜과 동일하게 생각하시는지 궁금합니다.

저희는 "그렇다" 고 느꼈는데, 여러분의 의견이 궁금하여 단순한 질문이지만 해봅니다.

yanghojoon commented 2 years ago

Java 언어를 한 번도 사용해보지 않아 정확하진 않지만 개념 자체는 거의 유사하다고 생각합니다!

다만 Java에선 추상 메서드 뿐만 아니라 default 메서드도 존재하고, 프로퍼티도 get, set으로만 표시하지 않고 직접 값을 넣어줄 수 있는 것으로 찾아봤습니다.

따라서 Swift의 프로토콜보단 기능?이 조금 더 많지만 역할 자체는 유사하다고 생각합니다!

ye-ha commented 2 years ago

우선 저는 자바의 인터페이스를 모릅니다. 😢 검색해서 보여지는 자바의 인터페이스는 스위프트의 프로토콜과 상당히 유사해보여요.


저는 책에서 공용 인터페이스 부분을 읽을 때는 프로토콜로 한정짓지 않고, 공용 인터페이스는 외부에서 사용될 & 그래서 외부로 보여질 최소한의 (객체가 수신할 수 있는) 메세지의 목록을 나타내는 부분 이라고 이해했습니다. 지성과 고사리의 질문을 읽으며 생각해보니.. 프로토콜도 위에 나열한 기능을 수행한다는 것이 떠올랐고요. 그래서 저도 호댕의 의견처럼 역할 자체는 유사하다!라고 생각이 됩니다.

July911 commented 2 years ago

저는... 프로토콜이라기 보다는 접근제어자가 private 하지 않은 메서드라고 이해했습니다.

jsim27 commented 2 years ago

저도 줄라이와 같은 의견입니다. protocol뿐만 아니라 모든 객체는 공용 인터페이스를 가진다고 생각했습니다.

예시를 하나 만들어보았는데요,

class 로봇청소기 {
    private func moveForward() {
        ...
    }
    private func rotate() {
        ...
    }
    private func vaccum() {
        ...
    }
    func cleanRoom() {
        while true {
            moveForward()
            rotate()
            vaccum()
        }
        ...
    }
    func togglePower() {
        ...
    }
}

위의 로봇청소기 타입의 객체들은 5개의 메서드를 갖고 있지만, 외부에 공개된 것은 cleanRoom(), togglePower() 둘입니다. 그래서 이 객체들의 공용 인터페이스는 'cleanRoom(), togglePower()' 라고 생각했습니다.

물론 프로토콜이 여러 객체가 같은 공용 인터페이스를 사용하여 다형성과 대체 가능성을 확보하도록 돕는것은 맞지만, 공용 인터페이스를 프로토콜이라고 한정짓기보다는 조금 더 넓은 의미에서 이해하는게 맞다고 생각했어요.

yeahg-dev commented 2 years ago

저도 자바의 인터페이스는 잘 모르지만...🥲 공용인터페이스라는 개념에 더 포커스를 맞춰서 제가 이해한 바를 공유하겠습니다!

줄라이와 나무의 의견과 동일한데요~ 공용인터페이스를 객체의 은닉화와 캡슐화의 관점에서 외부에 공개되어도 되는 부분, 외부와 소통할 수 있는 공개된 접점이라고 이해를 했습니다.

프로토콜이 공용인터페이스를 다른 객체들간에 동일하게 공유할 수 있는 수단이 될 수는 있지만, 프로토콜 자체를 공용인터페이스로 보기는 힘들다고 생각합니다.