cheese10yun / blog-sample

:octocat: Yun Blog sample code
https://cheese10yun.github.io/
351 stars 82 forks source link

정보 은닉(information hiding) 의미 오류 #1

Open gyuwon opened 5 years ago

gyuwon commented 5 years ago

캡슐화를 설명하는 문서는 정보 은닉(information hiding)을 이렇게 설명하고 있습니다.

정보 은닉이란 말 그대로 알 필요가 없는 정보는 외부에서 접근하지 못하도록 제한하는 것이다.

이 해석은 틀렸습니다. 정보 숨김은 70년대에 David L. Parnas가 모듈화에 관한 논문들에서 소개한 개념으로 자신할 수 없거나 변경 가능성이 높은 설계 결정을 외부로부터 숨기는 것을 뜻합니다. 위 문서의 예제에서 등장하는 public List getTypes() 메서드와 같은 읽기 접근자(getter)나 쓰기 접근자(setter)를 의미하는 것이 아닙니다. 물론 변경 가능성 높은 설계 결정을 숨기기 위해 읽기 접근자 패턴을 사용했다면 정보 은닉이 적용되었다고 할 수 있겠지만 그 자체로 정보 은닉의 정의가 되는 건 아닙니다.

cheese10yun commented 5 years ago

@gyuwon 이슈 등록 감사합니다. 언급해주신 부분 학습한 이후에 글을 추가 보강해보겠습니다.

cheese10yun commented 5 years ago

@gyuwon 말씀 해주신 부분을 제가 제대로 이해했는지 여쭙고 싶습니다.

public List getTypes() 메서드는 실제 , 구분으로하는 문자열이긴 하지만 캡슐화를 높여서 List 형태로 제공해준다면 이는 좋은 캡슐화 이긴 하지만 정보은닉 개념상의 표현은 적절하지 못한 표현이다.

그렇다면 https://github.com/cheese10yun/blog-sample/blob/84bc1c5d530600e80b95524374675c1244236f22/encapsulation/src/main/java/blog/yun/encapsulation/product/Message.java#L39

해당 메소드는 넘겨받은 Set 자로형을 평문문자로 "," 구분해서 변경하는 메소드인데 이 메서드가 private로 외부에 공개 되있지 않으니 이 쪽이 더 정보은닉에 맞는 표현이다. 이렇게 이해하고 있습니다.

정보 은닉이란 말 그대로 알 필요가 없는 정보는 외부에서 접근하지 못하도록 제한하는 것이다.

이 정의에 대해서는 제가 표현한 public List getTypes() 가 정보은닉 개념에 가깝지 않은 것이지 아니면 정의자체가 잘못됬다고 생각하는데 이분도 추가로 여쭙고 싶습니다.

gyuwon commented 5 years ago

private 메서드가 존재한다는 이유만으로 정보숨김이 사용되었다고 볼 수는 없습니다. private 메서드는 구현으로 볼 수 있고 정보숨김의 결과는 구현보단 인터페이스입니다. 정보숨김의 목적은 설계 피해를 최소화 화는 것입니다. 저는 위 코드의 인터페이스 설계 이유를 알지 못하기 때문에 설계에 정보숨김이 사용되었는지는 모르겠습니다.

정보숨김의 정의는 처음에 말씀드린 것처럼 틀렸거나 모호합니다. 정보숨김을 이해하고 싶다면 다음 두 논문을 읽어보세요.

cheese10yun commented 5 years ago

@gyuwon 친절한 답변과 링크 첨부 감사합니다. 천천히 읽어 보도록하겠습니다.